1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "android_webview/native/aw_web_resource_response_impl.h" 6 7#include "android_webview/native/input_stream_impl.h" 8#include "base/android/jni_android.h" 9#include "base/android/jni_array.h" 10#include "base/android/jni_string.h" 11#include "jni/AwWebResourceResponse_jni.h" 12#include "net/http/http_response_headers.h" 13#include "net/url_request/url_request.h" 14#include "net/url_request/url_request_job.h" 15 16using base::android::ScopedJavaLocalRef; 17using base::android::AppendJavaStringArrayToStringVector; 18 19namespace android_webview { 20 21AwWebResourceResponseImpl::AwWebResourceResponseImpl( 22 const base::android::JavaRef<jobject>& obj) 23 : java_object_(obj) { 24} 25 26AwWebResourceResponseImpl::~AwWebResourceResponseImpl() { 27} 28 29scoped_ptr<InputStream> 30AwWebResourceResponseImpl::GetInputStream(JNIEnv* env) const { 31 ScopedJavaLocalRef<jobject> jstream = 32 Java_AwWebResourceResponse_getData(env, java_object_.obj()); 33 if (jstream.is_null()) 34 return scoped_ptr<InputStream>(); 35 return make_scoped_ptr<InputStream>(new InputStreamImpl(jstream)); 36} 37 38bool AwWebResourceResponseImpl::GetMimeType(JNIEnv* env, 39 std::string* mime_type) const { 40 ScopedJavaLocalRef<jstring> jstring_mime_type = 41 Java_AwWebResourceResponse_getMimeType(env, java_object_.obj()); 42 if (jstring_mime_type.is_null()) 43 return false; 44 *mime_type = ConvertJavaStringToUTF8(jstring_mime_type); 45 return true; 46} 47 48bool AwWebResourceResponseImpl::GetCharset( 49 JNIEnv* env, std::string* charset) const { 50 ScopedJavaLocalRef<jstring> jstring_charset = 51 Java_AwWebResourceResponse_getCharset(env, java_object_.obj()); 52 if (jstring_charset.is_null()) 53 return false; 54 *charset = ConvertJavaStringToUTF8(jstring_charset); 55 return true; 56} 57 58bool AwWebResourceResponseImpl::GetStatusInfo( 59 JNIEnv* env, 60 int* status_code, 61 std::string* reason_phrase) const { 62 int status = 63 Java_AwWebResourceResponse_getStatusCode(env, java_object_.obj()); 64 ScopedJavaLocalRef<jstring> jstring_reason_phrase = 65 Java_AwWebResourceResponse_getReasonPhrase(env, java_object_.obj()); 66 if (status < 100 || status >= 600 || jstring_reason_phrase.is_null()) 67 return false; 68 *status_code = status; 69 *reason_phrase = ConvertJavaStringToUTF8(jstring_reason_phrase); 70 return true; 71} 72 73bool AwWebResourceResponseImpl::GetResponseHeaders( 74 JNIEnv* env, 75 net::HttpResponseHeaders* headers) const { 76 ScopedJavaLocalRef<jobjectArray> jstringArray_headerNames = 77 Java_AwWebResourceResponse_getResponseHeaderNames(env, 78 java_object_.obj()); 79 ScopedJavaLocalRef<jobjectArray> jstringArray_headerValues = 80 Java_AwWebResourceResponse_getResponseHeaderValues(env, 81 java_object_.obj()); 82 if (jstringArray_headerNames.is_null() || jstringArray_headerValues.is_null()) 83 return false; 84 std::vector<std::string> header_names; 85 std::vector<std::string> header_values; 86 AppendJavaStringArrayToStringVector( 87 env, jstringArray_headerNames.obj(), &header_names); 88 AppendJavaStringArrayToStringVector( 89 env, jstringArray_headerValues.obj(), &header_values); 90 DCHECK_EQ(header_values.size(), header_names.size()); 91 for(size_t i = 0; i < header_names.size(); ++i) { 92 std::string header_line(header_names[i]); 93 header_line.append(": "); 94 header_line.append(header_values[i]); 95 headers->AddHeader(header_line); 96 } 97 return true; 98} 99 100bool RegisterAwWebResourceResponse(JNIEnv* env) { 101 return RegisterNativesImpl(env); 102} 103 104} // namespace android_webview 105