Java-запрос http 10 клиентского инкубатора httpclient не выполняется на сервере node.js - PullRequest
0 голосов
/ 14 мая 2018

Я экспериментировал с материалом HttpClient в инкубаторе Java 9/10, и у меня есть следующий тривиальный код (фактически украденный с домашней страницы проекта!):

URI uri = URI.create("http://192.168.1.102:8080/");

HttpRequest getRequest = HttpRequest.newBuilder()
    .uri(uri)
    .GET()
    .build();

HttpResponse<String> response = client.send(getRequest,
    HttpResponse.BodyHandler.asString());
System.out.println("response to get: " + response.body());

Я считаю, что это работаетхорошо, если он указывает на URL-адрес, который не является локальным, но завершается неудачно, если я запрашиваю локальный хост (по имени «локальный хост», по 172.0.0.1 или по фактическому IP-адресу локального хоста).Ошибка очень странная, и во всей трассировке стека не упоминается ни один мой код.

WARNING: Using incubator modules: jdk.incubator.httpclient
Exception in thread "main" java.io.EOFException: EOF reached while reading
    at jdk.incubator.httpclient/jdk.incubator.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:507)
    at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:551)
    at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:728)
    at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowTask.run(SocketTube.java:171)
    at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
    at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
    at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
    at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:675)
    at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:829)
    at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:243)
    at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:769)
    at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:731)

Локально работает сервер, и я могу просто подключиться к нему, используя простой запрос из Интернета.браузер.

Есть мысли?

[EDIT] Я обнаружил, я полагаю, список рассылки для этого проекта.Он «запутан» (что полностью меня одурачило!), Но показан как: net dash dev at openjdk dot java dot net Я тоже напишу там и посмотрю, есть ли у них какие-либо данные.

[РЕДАКТИРОВАТЬ 2] Я почти уверен, что этоне имеет ничего общего с localhost (согласно оригинальному названию), но это что-то в согласовании протокола с node.js / express (сервер, который я использую, потому что с ним легко экспериментировать).Иногда узел (например, с последней строкой текста, которая не заканчивается LF), похоже, сообщает о неправильной длине содержимого, но это не проблема, поскольку сбой все еще происходит с правильной длиной.Я думаю, что это возможно ошибка в попытке обновить соединение до HTTP / 2.0, но пока не знаю ...

[РЕДАКТИРОВАТЬ 3] После того, как я потратил слишком много времени на эксперименты, я довольноубедитесь, что есть что-то в том, как node.js 8.11.1 (и экспресс 4.13.4 и body-parser 1.15.1) обрабатывает запрос на обновление до HTTP 2.0, который вызывает проблему.Но я понятия не имею, что.Я сдаюсь и продолжу процесс обучения для httpClient, используя другой сервер.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

попробуйте

HttpRequest request = HttpRequest.newBuilder()
                    .uri(new URI("http://localhost:3000"))
                    .POST(BodyPublisher.fromString("hello"))
                    .version(Version.HTTP_1_1).build();
0 голосов
/ 17 мая 2018

Обновлен. Я наконец-то получил curl с поддержкой http 2.0, и вся вина лежит на узле / экспрессе. Когда этот сервер видит запрос на обновление (узел 8. что-то), он просто не может создать какой-либо вывод. Следовательно, клиент правильно завершается с ошибкой EOF.

В качестве примечания, узел / экспресс также устанавливает заголовок длины содержимого «по одному» в некоторых случаях (не всегда !?)

...