| Index: android_webview/native/aw_contents_io_thread_client_impl.cc
 | 
| diff --git a/android_webview/native/aw_contents_io_thread_client_impl.cc b/android_webview/native/aw_contents_io_thread_client_impl.cc
 | 
| index 69003ae3a1a186766f5172987bbc52d5879b7dd7..0cadc9491f02355c4224bd89d9a232d3471f86cd 100644
 | 
| --- a/android_webview/native/aw_contents_io_thread_client_impl.cc
 | 
| +++ b/android_webview/native/aw_contents_io_thread_client_impl.cc
 | 
| @@ -25,6 +25,7 @@
 | 
|  #include "content/public/browser/web_contents_observer.h"
 | 
|  #include "jni/AwContentsIoThreadClient_jni.h"
 | 
|  #include "net/http/http_request_headers.h"
 | 
| +#include "net/http/http_response_headers.h"
 | 
|  #include "net/url_request/url_request.h"
 | 
|  #include "url/gurl.h"
 | 
|  
 | 
| @@ -375,6 +376,85 @@ void AwContentsIoThreadClientImpl::NewLoginRequest(const string& realm,
 | 
|        env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj());
 | 
|  }
 | 
|  
 | 
| +void AwContentsIoThreadClientImpl::OnReceivedHttpError(
 | 
| +    const net::URLRequest* request,
 | 
| +    const net::HttpResponseHeaders* response_headers) {
 | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
 | 
| +  if (java_object_.is_null())
 | 
| +    return;
 | 
| +
 | 
| +  vector<string> request_header_names;
 | 
| +  vector<string> request_header_values;
 | 
| +  {
 | 
| +    net::HttpRequestHeaders headers;
 | 
| +    if (!request->GetFullRequestHeaders(&headers))
 | 
| +      headers = request->extra_request_headers();
 | 
| +    net::HttpRequestHeaders::Iterator headers_iterator(headers);
 | 
| +    while (headers_iterator.GetNext()) {
 | 
| +      request_header_names.push_back(headers_iterator.name());
 | 
| +      request_header_values.push_back(headers_iterator.value());
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  vector<string> response_header_names;
 | 
| +  vector<string> response_header_values;
 | 
| +  {
 | 
| +    void* headers_iterator = NULL;
 | 
| +    string header_name, header_value;
 | 
| +    while (response_headers->EnumerateHeaderLines(
 | 
| +        &headers_iterator, &header_name, &header_value)) {
 | 
| +      response_header_names.push_back(header_name);
 | 
| +      response_header_values.push_back(header_value);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  JNIEnv* env = AttachCurrentThread();
 | 
| +  ScopedJavaLocalRef<jstring> jstring_url =
 | 
| +      ConvertUTF8ToJavaString(env, request->url().spec());
 | 
| +  ScopedJavaLocalRef<jstring> jstring_method =
 | 
| +      ConvertUTF8ToJavaString(env, request->method());
 | 
| +  ScopedJavaLocalRef<jobjectArray> jstringArray_request_header_names =
 | 
| +      ToJavaArrayOfStrings(env, request_header_names);
 | 
| +  ScopedJavaLocalRef<jobjectArray> jstringArray_request_header_values =
 | 
| +      ToJavaArrayOfStrings(env, request_header_values);
 | 
| +
 | 
| +  const content::ResourceRequestInfo* info =
 | 
| +      content::ResourceRequestInfo::ForRequest(request);
 | 
| +  bool is_main_frame = info &&
 | 
| +      info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME;
 | 
| +  bool has_user_gesture = info && info->HasUserGesture();
 | 
| +
 | 
| +  string mime_type, encoding;
 | 
| +  response_headers->GetMimeTypeAndCharset(&mime_type, &encoding);
 | 
| +  ScopedJavaLocalRef<jstring> jstring_mime_type =
 | 
| +      ConvertUTF8ToJavaString(env, mime_type);
 | 
| +  ScopedJavaLocalRef<jstring> jstring_encoding =
 | 
| +      ConvertUTF8ToJavaString(env, encoding);
 | 
| +  int status_code = response_headers->response_code();
 | 
| +  ScopedJavaLocalRef<jstring> jstring_reason =
 | 
| +      ConvertUTF8ToJavaString(env, response_headers->GetStatusText());
 | 
| +  ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names =
 | 
| +      ToJavaArrayOfStrings(env, response_header_names);
 | 
| +  ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values =
 | 
| +      ToJavaArrayOfStrings(env, response_header_values);
 | 
| +
 | 
| +  Java_AwContentsIoThreadClient_onReceivedHttpError(
 | 
| +      env,
 | 
| +      java_object_.obj(),
 | 
| +      jstring_url.obj(),
 | 
| +      is_main_frame,
 | 
| +      has_user_gesture,
 | 
| +      jstring_method.obj(),
 | 
| +      jstringArray_request_header_names.obj(),
 | 
| +      jstringArray_request_header_values.obj(),
 | 
| +      jstring_mime_type.obj(),
 | 
| +      jstring_encoding.obj(),
 | 
| +      status_code,
 | 
| +      jstring_reason.obj(),
 | 
| +      jstringArray_response_header_names.obj(),
 | 
| +      jstringArray_response_header_values.obj());
 | 
| +}
 | 
| +
 | 
|  bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) {
 | 
|    return RegisterNativesImpl(env);
 | 
|  }
 | 
| 
 |