Webview показывает только необработанный HTML-текст на некоторых страницах

Я работаю над проектом, в котором мы заинтересованы в перехвате некоторого HTTP-трафика из WebView, затем прикрепляем к запросам дополнительные заголовки, а затем возвращаем результат и отображаем его в WebView.

Для этого мы используем метод shouldInterceptRequest(представление WebView, URL-адрес строки), который возвращает WebResourceResponse, который должен отображать веб-просмотр.

Вот что я делаю:

private WebResourceResponse handleRequest(String url){
    Log.d(TAG, "Intercepting request at : " + url);
    HttpURLConnection connection = null;        
    URL serverAddress = null;           
    WebResourceResponse response = null;
    InputStream is = null;
    String type = null;
    String encoding = null;
    int statusCode;
    int length;

    try
    {
        //Set up the initial connection
        serverAddress = new URL(url);
        connection = (HttpURLConnection)serverAddress.openConnection();

        // Initiate a HEAD request to get meta data
        connection.setRequestMethod("HEAD");

        // Let the WebView handle requests with no headers in them.
        Map<String, List<String>> headers = connection.getHeaderFields();
        if(headers == null){
            Log.d(TAG, "Retrieved response with zero headers at: " + url);
            return null;
        }

        statusCode = connection.getResponseCode();

        if(statusCode == 200){
            // OK, delegate request if content length is large enough
            type = connection.getContentType();
            encoding = connection.getContentEncoding();
            length = connection.getContentLength();

            Log.d(TAG, "ContentType = " + type + " encoding = " + encoding + " " + url);

           connection.disconnect();

            if(length > SIZE_THRESHOLD){
                // send to other device

                Log.d(TAG, "Delegating request to other device NOT IMPLEMENTED");
                // TODO: Currently just handling them locally.
            }
            else{
                connection = (HttpURLConnection)serverAddress.openConnection();
                connection.setRequestMethod("GET");             
                is = connection.getInputStream();
                statusCode = connection.getResponseCode();
                type = connection.getContentType();
                encoding = connection.getContentEncoding();

                Log.d(TAG, "Done Loading " + url);

                return new WebResourceResponse(type, encoding, is);
            }

        }
    } 
    catch (MalformedURLException e) {
            e.printStackTrace();
    }
    catch (ProtocolException e) {
            e.printStackTrace();
    } 
    catch (IOException e) {
        Log.d(TAG, "IOException when connection to : " + url + " Stacktrace: " + Log.getStackTraceString(e));
    }
    return response;
}   

Если я попытаюсь загрузить такую ​​страницу, как «www.madopskrifter.nu» или «www.newz.dk», то я просто отлично получу весь контент с отображаемыми изображениями и всем остальным. Однако, если я просматриваю такие страницы, как stackoverflow, я просто получаю индексный файл HTML на stackoverflow.com. То же самое и с youtube.com. (у меня включен JavaScript в настройках WebView)

Есть ли что-то, что мне не хватает? на данный момент я даже не добавляю свои собственные заголовки или что-то еще, я просто просто возвращаю тот же ответ, за исключением того, что я получаю их «вручную». (Кроме того, я сейчас не обрабатываю запросы с нулевыми заголовками, но даже если я закомментирую этот код, проблема все еще существует).

Любая помощь будет принята с благодарностью,


person Simon Langhoff    schedule 10.04.2013    source источник


Ответы (1)


Я нашел решение той же проблемы, что и у меня, YMMV:

Мой HttpUrlConnection возвращался:

  • кодировка: ноль
  • mimeType: "текст/html; набор символов = utf-8"

В этом была проблема.

Теперь я проверяю файлы html и меняю на:

  • кодировка: "UTF-8"
  • mimeType: "текст/html"

Пример:

String responseEncoding = urlConnection.getContentEncoding();
String responseMimeType = urlConnection.getContentType();

String html = "";
if (resourceUrl.endsWith("html"))
{
    responseEncoding = "UTF-8";
    responseMimeType = "text/html";
}

if((responseCode == 200) && (!is.equals("")))
{
    return new WebResourceResponse(responseMimeType, responseEncoding, returnStream); 
} else
{
    return null;
}
person gaharrington    schedule 05.06.2013
comment
Спасибо, это спасло мой день! - person mivola; 30.11.2016