2016-12-28 3 views
0

Я в настоящее время пытаюсь сделать запрос (с HttpURLConnection) сервером IIS, который откажет мне переадресации до целевого адресата.HttpURLConnection response missing Status Line (ProtocolException)

Вопрос: java.net.ProtocolException: Unexpected status line: <html><head><title>Object moved</title></head><body>

Это происходит, когда urlConnection.getInputStream() называется (или urlConnection.getResponseCode(), который называет его).

Я видел многочисленные случаи, когда проблема - это просто неправильно сконфигурированный сервер, но в этом случае запрос от Chrome, когда он подталкивает пользовательский агент Android, дает ожидаемый результат.

Кроме того, сервер является древним, который никогда не был источником проблем и настроен так же, как и в производственной среде.

Достижение другой перенаправляющей веб-страницы отлично работает (протестировано с https://com.google/, 2 перенаправлениями) и достижение нередактирующей веб-страницы на сервере не создает никаких проблем.

Я искал два дня и не добился прогресса. Любая помощь будет оценена по достоинству.


Код, который используется в настоящее время:

StringBuilder builder = new StringBuilder(); 
HttpsURLConnection urlConnection = null; 

try { 

    URL url = new URL(urlStrings[0]); 

    urlConnection = (HttpsURLConnection) url.openConnection(); 

    LogHelper.Log(getBaseContext(), "Request on URL :\n\"" + url + "\""); 

    urlConnection.setRequestMethod("GET"); 
    urlConnection.setReadTimeout(10000); 
    urlConnection.setConnectTimeout(15000); 
    urlConnection.setRequestProperty("Accept","*/*"); 

    urlConnection.setDoOutput(false); 
    urlConnection.setDoInput(true); 

    urlConnection.setInstanceFollowRedirects(true); 

    urlConnection.setUseCaches(false); 

    CookieManager cookieManager = new CookieManager(); 
    cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
    CookieHandler.setDefault(cookieManager); 

    urlConnection.connect(); 

    int status = urlConnection.getResponseCode(); 
    LogHelper.Log(getBaseContext(), "Status code is \"" + status + "\""); 
    if (!url.equals(urlConnection.getURL())) { 
     LogHelper.Log(getBaseContext(), "URL after redirection is :\n\"" + urlConnection.getURL() + "\""); 
    } 

    switch (status/100) { 
     case 1: 
     case 2: 
     case 3: 

      InputStream stream = urlConnection.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line).append("\n"); 
      } 
      reader.close(); 
      break; 

     case 4: 
     case 5: 

      InputStream errorStream = urlConnection.getErrorStream(); 
      BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream)); 
      String errorLine; 
      while ((errorLine = errorReader.readLine()) != null) { 
       builder.append(errorLine).append("\n"); 
      } 
      errorReader.close(); 

      throw new Exception(builder.toString()); 

     default: 
      throw new Exception("Unknown status code: " + status); 
    } 

} catch (Exception e) { 
    LogHelper.Log(getBaseContext(), e); 
} finally { 
    if (urlConnection != null) { 
     urlConnection.disconnect(); 
    } 
} 

return builder.toString(); 

Полученная ошибка:

java.net.ProtocolException: Unexpected status line: <html><head><title>Object moved</title></head><body> 
    at com.android.okhttp.internal.http.StatusLine.parse(StatusLine.java:54) 
    at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:239) 
    at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:104) 
    at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:1120) 
    at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:951) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:482) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(
    at com.pushmanager.clientmdm.activities.RegistrationView$1$2.doInBackground(
    at com.pushmanager.clientmdm.activities.RegistrationView$1$2.doInBackground(
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 
+1

Моя единственная идея - сервер отправляет неверные заголовки HTTP. Было бы очень полезно захватить сетевой поток TCP и предоставить его здесь. Для этого вам необходимо укоротить свое устройство, а затем использовать либо http://www.androidtcpdump.com/, либо какое-то приложение, такое как Shark for Root. Вам также нужно будет изменить https: // url на http: // – pelya

+0

@pelya. Дело в том, что заголовки верны при запросе из Chrome на том же устройстве. Никакой другой способ связаться с сервером не дает ошибки. Кроме того, сервер фиксируется в https, поэтому захват трафика путем переключения на http невозможно (к сожалению). Есть ли другой способ получить заголовки? – Apzx

+1

Хром не использует HttpURLConnection, поэтому ваш запрос будет иметь разные заголовки HTTP, сервер, скорее всего, ответит иначе. Если вы не можете записывать журналы, вы можете попробовать заменить HttpURLConnection устаревшим Apache HttpClient в своем коде и надеяться, что ошибка исчезнет. Вам также нужно добавить 'useLibrary 'org.apache.http.legacy'' в' 'build.gradle'' – pelya

ответ

0

Оказывается, это поведение было вызвано из-за \n символа в строке URL.

Я понятия не имею, как ohttp управлял этим результатом, но с удаленным персонажем проблема исчезла.

Смежные вопросы