aw_web_resource_response.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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