16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "android_webview/browser/aw_web_resource_response.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "android_webview/browser/input_stream.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "android_webview/browser/net/android_stream_reader_url_request_job.h" 96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/http/http_response_headers.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace android_webview { 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class StreamReaderJobDelegateImpl 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : public AndroidStreamReaderURLRequestJob::Delegate { 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) StreamReaderJobDelegateImpl( 206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<AwWebResourceResponse> aw_web_resource_response) 216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : aw_web_resource_response_(aw_web_resource_response.Pass()) { 226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(aw_web_resource_response_); 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual scoped_ptr<InputStream> OpenInputStream(JNIEnv* env, 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& url) OVERRIDE { 276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return aw_web_resource_response_->GetInputStream(env).Pass(); 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnInputStreamOpenFailed(net::URLRequest* request, 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool* restart) OVERRIDE { 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *restart = false; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool GetMimeType(JNIEnv* env, 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequest* request, 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) android_webview::InputStream* stream, 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string* mime_type) OVERRIDE { 396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return aw_web_resource_response_->GetMimeType(env, mime_type); 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool GetCharset(JNIEnv* env, 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequest* request, 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) android_webview::InputStream* stream, 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string* charset) OVERRIDE { 466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return aw_web_resource_response_->GetCharset(env, charset); 476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void AppendResponseHeaders( 506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) JNIEnv* env, 516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HttpResponseHeaders* headers) OVERRIDE { 526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int status_code; 536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::string reason_phrase; 546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (aw_web_resource_response_->GetStatusInfo( 556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) env, &status_code, &reason_phrase)) { 566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::string status_line("HTTP/1.1 "); 576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) status_line.append(base::IntToString(status_code)); 586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) status_line.append(" "); 596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) status_line.append(reason_phrase); 606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) headers->ReplaceStatusLine(status_line); 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) aw_web_resource_response_->GetResponseHeaders(env, headers); 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<AwWebResourceResponse> aw_web_resource_response_; 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)net::URLRequestJob* AwWebResourceResponse::CreateJobFor( 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<AwWebResourceResponse> aw_web_resource_response, 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequest* request, 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::NetworkDelegate* network_delegate) { 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(aw_web_resource_response); 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(request); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(network_delegate); 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return new AndroidStreamReaderURLRequestJob( 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request, 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) network_delegate, 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_ptr( 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) new StreamReaderJobDelegateImpl(aw_web_resource_response.Pass())) 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .PassAs<AndroidStreamReaderURLRequestJob::Delegate>()); 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace android_webview 89