Android: WebView shouldInterceptRequest no agregar RequestProperties en el WebView

Estoy interceptando solicitudes de la webview usando shouldInterceptRequest

A continuación está mi código para devolver mi WebResourceResponse

@TargetApi(Build.VERSION_CODES.LOLLIPOP) private static WebResourceResponse handleRequestViaUrlOnly(WebResourceRequest webResourceRequest){ String url = webResourceRequest.getUrl().toString(); Log.i("intercepting req....!!!", url); String ext = MimeTypeMap.getFileExtensionFromUrl(url); String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); try { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestProperty("Sample-Header", "hello"); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); } catch (IOException e) { e.printStackTrace(); } return null; } 

Llamo a este método dentro de mi CustomWebViewClient

 class CustomWebViewClient extends WebViewClient { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return handleRequestViaUrlOnly(request); } } 

Sin embargo, cuando compruebo los encabezados de solicitud desde el depurador remoto WebView en chrome: // inspect / # devices.

El RequestProperty adicional que agregué no está presente.

 conn.setRequestProperty("Sample-Header", "hello"); 

El encabezado de muestra no está presente en los encabezados de solicitud en el WebView.

¿Me estoy perdiendo de algo? Apreciaré cualquier ayuda.

Así que el problema es que cuando se pasa conn.getInputStream() sólo da datos. Los encabezados de respuesta podrían ser extraídos por conn.getHeaderFields() . Además, no podrá obtener su encabezado extra a menos que el servidor lo apoye y CORS no esté involucrado. Aquí está la salida wireshark de la conexión

 GET /~fdc/sample.html HTTP/1.1 Sample-Header: hello Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 7.1; Android SDK built for x86_64 Build/NPF26K) Host: www.columbia.edu Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 0 HTTP/1.1 200 OK Date: Wed, 01 Mar 2017 09:06:58 GMT Server: Apache Last-Modified: Thu, 22 Apr 2004 15:52:25 GMT Accept-Ranges: bytes Vary: Accept-Encoding,User-Agent Content-Encoding: gzip Content-Length: 8664 Keep-Alive: timeout=15, max=99 Connection: Keep-Alive Content-Type: text/html 

Como se puede ver no hay Sample-Header: hello encabezado en respuesta.

Aquí está el código simple que construirá encabezados de WebResourceResponse de respuesta y agregará su encabezado personalizado a él:

 webView.setWebViewClient(new WebViewClient() { private Map<String, String> convertResponseHeaders(Map<String, List<String>> headers) { Map<String, String> responseHeaders = new HashMap<>(); responseHeaders.put("Sample-Header", "hello"); for (Map.Entry<String, List<String>> item : headers.entrySet()) { List<String> values = new ArrayList<String>(); for (String headerVal : item.getValue()) { values.add(headerVal); } String value = StringUtil.join(values, ","); Log.e(TAG, "processRequest: " + item.getKey() + " : " + value); responseHeaders.put(item.getKey(), value); } return responseHeaders; } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { final String method = request.getMethod(); final String url = request.getUrl().toString(); Log.d(TAG, "processRequest: " + url + " method " + method); String ext = MimeTypeMap.getFileExtensionFromUrl(url); String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); try { HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection(); conn.setRequestMethod(method); conn.setRequestProperty("Sample-Header", "hello"); conn.setDoInput(true); conn.setUseCaches(false); Map<String, String> responseHeaders = convertResponseHeaders(conn.getHeaderFields()); responseHeaders.put("Sample-Header", "hello"); return new WebResourceResponse( mime, conn.getContentEncoding(), conn.getResponseCode(), conn.getResponseMessage(), responseHeaders, conn.getInputStream() ); } catch (Exception e) { Log.e(TAG, "shouldInterceptRequest: " + e); } return null; } }); 
  • Cargar imagen de url en WebView (centrarse verticalmente)
  • Utilice una barra de acción contextual personalizada para la selección de texto de WebView
  • La vista web de Android shouldOverrideUrlLoading no se llama
  • ¿Hay una ruta similar a file: /// android_asset / que apunta al directorio de aplicaciones?
  • Ocultar elemento HTML en Android WebView?
  • Cómo detener el desplazamiento interno de WebView en Android?
  • WebView en un fragmento (android.support.v4)
  • Android WebView transparente en la parte superior de VideoView
  • Android Wikipedia La búsqueda de artículos no aparece correctamente en mi webview?
  • ¿Cómo implementar múltiples webviews cordova en una actividad utilizando fragmentos?
  • ¿Cómo ver / depurar los encabezados de solicitud no estándar que el navegador de mi teléfono está enviando?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.