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