LINUX.ORG.RU

Java SocketException: Unexpected end of file from server

 , , ,


0

1

Поймал очень странную проблему с соединением по HTTP из JAVA приложения.

Задача: с клиента A необходимо получить ответ на HTTP запрос от веб-сервера Б (10.13.0.69)

Важный момент: сервер Б находится за VPN туннелем, при этом все сетевые правила корректно настроены и клиенту A обеспечен доступ к серверу Б. Это легко проверить тем-же curl'ом:

[root@Test-LAPP01 test]# curl http://10.13.0.69:7878/testGet && echo ""
{"result":["\"AlertServer testGet ok\" "]}

Проблемы начинаются когда я пытаюсь выполнить тот-же самый запрос из java приложения: оно падает с ошибкой

SocketException: Unexpected end of file from server.

Естественно сначала я предположил, что проблема в JAVA коде, но если изменить url например на http://google.com, то приложение отрабатывает нормально.

Ещё интересный момент: если java приложение запускать в одной подсети с сервером Б (т.е. без VPN туннеля), то запрос также отрабатывает без проблем.

В качестве дебага запустил tcpdump на обоих машинах и теперь я смущён ещё больше: я вижу, что пакеты как уходят с клиента A, так и приходят на веб-сервер Б

Непосредственно сама ошибка:

[root@Test-LAPP01 test]# cat contest.java
import java.net.*;
import java.io.*;

public class contest {
        public static void main(String[] args) throws Exception {
                String url = "http://10.13.0.69:7878/testGet";
                try {
                        URL alert = new URL(url);
                        HttpURLConnection con = (HttpURLConnection) alert.openConnection();
                        con.setRequestMethod("GET");
                        con.setRequestProperty("User-Agent", "chrome");
                        int responseCode = con.getResponseCode();
                        System.out.println("\nSending 'GET' request to URL : " + url);
                        System.out.println("Response Code : " + responseCode);
                }
                catch (IOException e) {
                        e.printStackTrace();
                }
        }
}


[root@Test-LAPP01 test]# curl http://10.13.0.69:7878/testGet && echo ""
{"result":["\"AlertServer testGet ok\" "]}


[root@Test-LAPP01 test]# java contest
java.net.SocketException: Unexpected end of file from server
        at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851)
        at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
        at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848)
        at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
        at contest.main(contest.java:12)

[root@Test-LAPP01 test]#

tcpdump с клиента: https://dpaste.de/brNW

tcpdump на сервере: https://dpaste.de/1O2b

Кратко суть проблемы: Из JAVA приложения недоступен URL, размещённый за VPN, но доступен с хостового ПК.


Дебаггером нырни в HttpClient и покури, отчего он там бросает эксепшн. Похоже на кривые заголовки, которые цурль переваривает, а джава нет.

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

Я в сообщении указал, что если java приложение запускать в одной подсети с сервером Б (т.е. без VPN туннеля), то запрос также отрабатывает без проблем. Так-что думаю, не мой случай с заголовками.

Jaels ()

Сервер закрывает соединение, когда под VPN. Значит проблема в VPN, он почему-то режет соединение. Сравни, что отправляет curl, с тем что отправляет джава. Попробуй полностью повторить curl.

Можно даже попробовать из другого ЯП связаться. Чтобы точно локализовать где проблема.

foror ★★★★ ()
Последнее исправление: foror (всего исправлений: 1)
$ java -version
$ curl -v http://10.13.0.69:7878/testGet

слышал про XY Problem?

drsm ★★ ()

Вероятно vpn из-за малого MTU режет пакет посреди заголовка, а клиент этого не переваривает. Но это лишь предположение, надо смотреть тисипидампом, что клиенту прилетает от сервера, и сравнивать с тем, что сервер отправляет. Впрочем, это очевидное направление поиска ошибки, потому не ясно нахрена смотреть что там приходит к серверу, если падает не сервер.

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.