16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file. 46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "android_webview/native/aw_web_resource_response_impl.h" 66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "android_webview/native/input_stream_impl.h" 86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/android/jni_android.h" 96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/android/jni_array.h" 106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/android/jni_string.h" 116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "jni/AwWebResourceResponse_jni.h" 126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/http/http_response_headers.h" 136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/url_request/url_request.h" 146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/url_request/url_request_job.h" 156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using base::android::ScopedJavaLocalRef; 176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using base::android::AppendJavaStringArrayToStringVector; 186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace android_webview { 206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AwWebResourceResponseImpl::AwWebResourceResponseImpl( 226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const base::android::JavaRef<jobject>& obj) 236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : java_object_(obj) { 246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AwWebResourceResponseImpl::~AwWebResourceResponseImpl() { 276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)scoped_ptr<InputStream> 306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AwWebResourceResponseImpl::GetInputStream(JNIEnv* env) const { 316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ScopedJavaLocalRef<jobject> jstream = 326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Java_AwWebResourceResponse_getData(env, java_object_.obj()); 336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (jstream.is_null()) 346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return scoped_ptr<InputStream>(); 356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return make_scoped_ptr<InputStream>(new InputStreamImpl(jstream)); 366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool AwWebResourceResponseImpl::GetMimeType(JNIEnv* env, 396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::string* mime_type) const { 406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ScopedJavaLocalRef<jstring> jstring_mime_type = 416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Java_AwWebResourceResponse_getMimeType(env, java_object_.obj()); 426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (jstring_mime_type.is_null()) 436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) *mime_type = ConvertJavaStringToUTF8(jstring_mime_type); 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return true; 466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool AwWebResourceResponseImpl::GetCharset( 496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) JNIEnv* env, std::string* charset) const { 506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ScopedJavaLocalRef<jstring> jstring_charset = 516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Java_AwWebResourceResponse_getCharset(env, java_object_.obj()); 526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (jstring_charset.is_null()) 536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) *charset = ConvertJavaStringToUTF8(jstring_charset); 556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return true; 566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool AwWebResourceResponseImpl::GetStatusInfo( 596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) JNIEnv* env, 606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int* status_code, 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::string* reason_phrase) const { 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int status = 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Java_AwWebResourceResponse_getStatusCode(env, java_object_.obj()); 646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ScopedJavaLocalRef<jstring> jstring_reason_phrase = 656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Java_AwWebResourceResponse_getReasonPhrase(env, java_object_.obj()); 666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (status < 100 || status >= 600 || jstring_reason_phrase.is_null()) 676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) *status_code = status; 696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) *reason_phrase = ConvertJavaStringToUTF8(jstring_reason_phrase); 706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return true; 716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool AwWebResourceResponseImpl::GetResponseHeaders( 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) JNIEnv* env, 756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HttpResponseHeaders* headers) const { 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ScopedJavaLocalRef<jobjectArray> jstringArray_headerNames = 776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Java_AwWebResourceResponse_getResponseHeaderNames(env, 786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) java_object_.obj()); 796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ScopedJavaLocalRef<jobjectArray> jstringArray_headerValues = 806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Java_AwWebResourceResponse_getResponseHeaderValues(env, 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) java_object_.obj()); 826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (jstringArray_headerNames.is_null() || jstringArray_headerValues.is_null()) 836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<std::string> header_names; 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<std::string> header_values; 866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AppendJavaStringArrayToStringVector( 876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) env, jstringArray_headerNames.obj(), &header_names); 886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AppendJavaStringArrayToStringVector( 896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) env, jstringArray_headerValues.obj(), &header_values); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_EQ(header_values.size(), header_names.size()); 916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) for(size_t i = 0; i < header_names.size(); ++i) { 926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::string header_line(header_names[i]); 936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) header_line.append(": "); 946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) header_line.append(header_values[i]); 956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) headers->AddHeader(header_line); 966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return true; 986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool RegisterAwWebResourceResponse(JNIEnv* env) { 1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return RegisterNativesImpl(env); 1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} // namespace android_webview 105