Java: Menggunakan Apache HttpClient untuk mengirim HttpGet ke URI dengan garis bawah pada nama host

Saya sadar bahwa garis bawah secara teknis tidak diperbolehkan dalam nama host URI, tapi sayangnya kami memiliki pelanggan yang melakukan itu, jadi kami perlu mendukungnya. Saya telah melihat banyak posting lain tentang ini di StackOverflow di mana orang bertanya bagaimana cara memasukkan nama host secara manual ke objek URI, jadi saya sudah melakukannya, tapi saya masih mendapatkan SocketException ketika saya mencoba mengirim meminta:

URI uri = new URI("https", "my_ftp.website.com", "/target.jpg", null, null);
MyUtils.setField(uri, "host", "my_ftp.website.com"); // manually set "host" through reflection
HttpGet httpGet = new HttpGet(uri);
HttpClients.createDefault().execute(httpGet);

Seperti yang Anda lihat pada cuplikan kode di atas, saya menyalin instruksi untuk menyetel kolom "host" secara manual pada URI dari postingan StackOverflow ini, tapi jelas tidak berfungsi. Saya bahkan mencoba menambahkan kode dari postingan StackOverflow ini ke bagian atas program saya, tetapi sepertinya tidak ada efek baik:

MyUtils.setField(URI.class, "L_DASH", 35184372088832L);
MyUtils.setField(URI.class, "H_DASH", 2147483648L);

Apa pun yang saya lakukan, sepertinya saya selalu mendapatkan kesalahan yang sama:

java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    at sun.security.ssl.InputRecord.read(InputRecord.java:503)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:221)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:165)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:140)
    at com.amazon.emf.customerservice.activities.account.TempTest.runTest(TempTest.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

person Dasmowenator    schedule 06.02.2020    source sumber
comment
Garis bawah tidak sah dalam nama host; dan mereka tidak akan bekerja dengan URL Java atau Apache HttpGet. Tautan pertama Anda membahas tentang proyek sumber terbuka yang sepenuhnya berbeda yang memiliki solusi untuk mendukung nama host dengan garis bawah. Itu adalah tautan ini. Sepertinya proyek miliknya. Semoga berhasil! Sudahkah Anda mencoba punycode?   -  person Elliott Frisch    schedule 06.02.2020
comment
Dalam tautan ke proyek bitbucket LID commons yang Anda sebutkan, sepertinya mereka menggunakan Apache: import org.apache.http.client.methods.HttpGet. Menurut Anda, proyek sumber terbuka apa yang mereka gunakan? Saya belum mencoba punycode -- melihat artikel wikipedia yang Anda tautkan, saya tidak yakin bagaimana hal itu bisa membantu. Bisakah Anda menjelaskan lebih lanjut?   -  person Dasmowenator    schedule 07.02.2020
comment
Saya sudah memeriksa, Anda tidak dapat mengkodekan _ jadi saya pikir Anda terjebak. Berapa banyak kendali yang Anda miliki atas infrastruktur DNS? Bisakah Anda membuat a.my_ftp.website.com dan membuat my_ftp.website.com memutuskan menjadi a.my_ftp.website.com? Sejauh yang saya tahu, masalahnya adalah _ di nama host (_ di domain baik-baik saja).   -  person Elliott Frisch    schedule 07.02.2020
comment
Kami tidak memiliki kendali atas infrastruktur DNS. URL ini diberikan kepada kami oleh pelanggan, jadi merekalah yang memiliki domain tersebut, bukan kami.   -  person Dasmowenator    schedule 07.02.2020
comment
Salah satu kemungkinannya adalah dengan menggunakan java.net.URL dan java.net.URLConnection. Meskipun java.net.URI memeriksa sintaks URI yang valid, java.net.URL jauh lebih longgar dalam hal ini, mungkin karena ini adalah kelas kuno yang berasal dari Java 1.0.   -  person VGR    schedule 07.02.2020
comment
Saya tidak melihat bagaimana hal itu akan membantu. Konstruktor HttpGet hanya mengambil String atau URI, bukan URL. Juga, seperti yang saya sebutkan di posting saya, saya dapat menggunakan refleksi untuk mengatur host secara manual di URI, dan itu masih tidak memperbaikinya.   -  person Dasmowenator    schedule 07.02.2020