Ошибка SocketException при добавлении параметров к URL

377
24 июля 2017, 13:40
String urlString = "http://127.0.0.1:8443/paxa/callback?abc=abc";
private final String USER_AGENT = "Mozilla/5.0";
URL myUrl = new URL(urlString);    
HttpURLConnection con = (HttpURLConnection) myUrl.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = con.getResponseCode();

На консоли:

Exception in thread "main" 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:1569)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)

На локальном java сервере (с другого проекта IDE) этот запрос дважды:

parametres = /paxa/callback?abc=abc
parametres = /paxa/callback?abc=abc

Если отправить без параметров, т.е. String urlString = "http://127.0.0.1:8443/paxa/callback";, то всё ОК. И запрос на сервере не дублируется.

UPD: Оказалось, проблема в сервере. Клиент get-запрос в Google производит без ошибок. Класс реализует HttpHandler. Привожу код:

public void handle(HttpExchange t) throws IOException {
    OutputStream os = t.getResponseBody();
    String getQuery = t.getRequestURI().getQuery();
    if (getQuery != null) {
        Map<String, String> getParametres = parseQueryString(getQuery);
        t.sendResponseHeaders(HttpURLConnection.HTTP_OK, 0L);
    } else {
        byte[] response = "Error GET!".getBytes();
        t.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length);
    }
}
Answer 1

myUrl.openConnection() возвращает реализацию интерфейса потокового URLConnection (Input/Output Stream). Для того, чтобы стрим не рвался стоит явно указывать Keep-Alive с таймаутом:

    con.setRequestProperty("Connection", "Keep-Alive");
    con.setRequestProperty("Keep-Alive", "header");
    con.setConnectTimeout(60000);

Если это не помогает, то проблема явно на сервере. Для отладки нужно вывести InputStream ответа от сервера в случае ошибки.

    con.getErrorStream()

Проверил на локально развернутой jirа. Ошибки разрыва соединения не возникает (responseCode: 200).

    String urlString = "http://localhost:8080/browse/CAT-1?filter=-3";
    String USER_AGENT = "Mozilla/5.0";
    URL myUrl = new URL(urlString);
    HttpURLConnection con = (HttpURLConnection) myUrl.openConnection();
    InputStream errInputStream = con.getErrorStream();
    try {
        con.setRequestMethod("GET");
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Connection", "Keep-Alive");
        con.setRequestProperty("Keep-Alive", "header");
        con.setConnectTimeout(60000);
        int responseCode = con.getResponseCode();
        System.out.println("responseCode: " + responseCode);
    } catch (Exception e) {
        StringWriter writer = new StringWriter();
        IOUtils.copy(errInputStream, writer, "utf-8");
        String theString = writer.toString();
        System.out.println("Error: " + theString);
    }

Доп пакет: org.apache.commons.io.IOUtils

READ ALSO
Spring не видит XML файл

Spring не видит XML файл

Есть некий файл spring-idolxml, в котором лежат бины

289
Java кодом кликнуть на кнопку в браузере

Java кодом кликнуть на кнопку в браузере

Что нужно почитать чтобы понять как с помощью кода в яве делать операции на странице в браузеренапример проводятся какие-то логические вычисления

325