diff options
Diffstat (limited to 'android_webview/browser/aw_web_resource_response.cc')
-rw-r--r-- | android_webview/browser/aw_web_resource_response.cc | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/android_webview/browser/aw_web_resource_response.cc b/android_webview/browser/aw_web_resource_response.cc new file mode 100644 index 0000000000..412d9c2a04 --- /dev/null +++ b/android_webview/browser/aw_web_resource_response.cc @@ -0,0 +1,88 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "android_webview/browser/aw_web_resource_response.h" + +#include "android_webview/browser/input_stream.h" +#include "android_webview/browser/net/android_stream_reader_url_request_job.h" +#include "base/strings/string_number_conversions.h" +#include "net/http/http_response_headers.h" + +namespace android_webview { + +namespace { + +class StreamReaderJobDelegateImpl + : public AndroidStreamReaderURLRequestJob::Delegate { + public: + StreamReaderJobDelegateImpl( + scoped_ptr<AwWebResourceResponse> aw_web_resource_response) + : aw_web_resource_response_(aw_web_resource_response.Pass()) { + DCHECK(aw_web_resource_response_); + } + + virtual scoped_ptr<InputStream> OpenInputStream(JNIEnv* env, + const GURL& url) OVERRIDE { + return aw_web_resource_response_->GetInputStream(env).Pass(); + } + + virtual void OnInputStreamOpenFailed(net::URLRequest* request, + bool* restart) OVERRIDE { + *restart = false; + } + + virtual bool GetMimeType(JNIEnv* env, + net::URLRequest* request, + android_webview::InputStream* stream, + std::string* mime_type) OVERRIDE { + return aw_web_resource_response_->GetMimeType(env, mime_type); + } + + virtual bool GetCharset(JNIEnv* env, + net::URLRequest* request, + android_webview::InputStream* stream, + std::string* charset) OVERRIDE { + return aw_web_resource_response_->GetCharset(env, charset); + } + + virtual void AppendResponseHeaders( + JNIEnv* env, + net::HttpResponseHeaders* headers) OVERRIDE { + int status_code; + std::string reason_phrase; + if (aw_web_resource_response_->GetStatusInfo( + env, &status_code, &reason_phrase)) { + std::string status_line("HTTP/1.1 "); + status_line.append(base::IntToString(status_code)); + status_line.append(" "); + status_line.append(reason_phrase); + headers->ReplaceStatusLine(status_line); + } + aw_web_resource_response_->GetResponseHeaders(env, headers); + } + + private: + scoped_ptr<AwWebResourceResponse> aw_web_resource_response_; +}; + +} // namespace + +// static +net::URLRequestJob* AwWebResourceResponse::CreateJobFor( + scoped_ptr<AwWebResourceResponse> aw_web_resource_response, + net::URLRequest* request, + net::NetworkDelegate* network_delegate) { + DCHECK(aw_web_resource_response); + DCHECK(request); + DCHECK(network_delegate); + + return new AndroidStreamReaderURLRequestJob( + request, + network_delegate, + make_scoped_ptr( + new StreamReaderJobDelegateImpl(aw_web_resource_response.Pass())) + .PassAs<AndroidStreamReaderURLRequestJob::Delegate>()); +} + +} // namespace android_webview |