• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 // This class simulates what wininet does when a dns lookup fails.
5 
6 #ifndef CHROME_BROWSER_AUTOMATION_URL_REQUEST_AUTOMATION_JOB_H_
7 #define CHROME_BROWSER_AUTOMATION_URL_REQUEST_AUTOMATION_JOB_H_
8 #pragma once
9 
10 #include "base/task.h"
11 #include "chrome/common/ref_counted_util.h"
12 #include "net/url_request/url_request.h"
13 #include "net/url_request/url_request_job.h"
14 
15 class AutomationResourceMessageFilter;
16 struct AutomationURLResponse;
17 
18 namespace net {
19 class HttpResponseHeaders;
20 class HttpResponseInfo;
21 class HostPortPair;
22 }
23 
24 namespace IPC {
25 class Message;
26 }
27 
28 // net::URLRequestJob implementation that loads the resources using
29 // automation.
30 class URLRequestAutomationJob : public net::URLRequestJob {
31  public:
32   URLRequestAutomationJob(net::URLRequest* request, int tab, int request_id,
33                           AutomationResourceMessageFilter* filter,
34                           bool is_pending);
35 
36   // Register our factory for HTTP/HTTPs requests.
37   static bool EnsureProtocolFactoryRegistered();
38 
39   static net::URLRequest::ProtocolFactory Factory;
40 
41   // net::URLRequestJob methods.
42   virtual void Start();
43   virtual void Kill();
44   virtual bool GetMimeType(std::string* mime_type) const;
45   virtual bool GetCharset(std::string* charset);
46   virtual void GetResponseInfo(net::HttpResponseInfo* info);
47   virtual int GetResponseCode() const;
48   virtual bool IsRedirectResponse(GURL* location, int* http_status_code);
49   virtual uint64 GetUploadProgress() const;
50   virtual net::HostPortPair GetSocketAddress() const;
51 
52   // Peek and process automation messages for URL requests.
53   static bool MayFilterMessage(const IPC::Message& message, int* request_id);
54   void OnMessage(const IPC::Message& message);
55 
id()56   int id() const {
57     return id_;
58   }
59 
request_id()60   int request_id() const {
61     return request_id_;
62   }
63 
is_pending()64   bool is_pending() const {
65     return is_pending_;
66   }
67 
message_filter()68   AutomationResourceMessageFilter* message_filter() const {
69     return message_filter_;
70   }
71 
72   // Resumes a job, which was waiting for the external host to connect to the
73   // automation channel. This is to ensure that this request gets routed to the
74   // external host.
75   void StartPendingJob(int new_tab_handle,
76                        AutomationResourceMessageFilter* new_filter);
77 
78  protected:
79   // Protected net::URLRequestJob override.
80   virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read);
81 
82   void StartAsync();
83   void Cleanup();
84   void DisconnectFromMessageFilter();
85 
86   // IPC message handlers.
87   void OnRequestStarted(int id, const AutomationURLResponse& response);
88   void OnDataAvailable(int id, const std::string& bytes);
89   void OnRequestEnd(int id, const net::URLRequestStatus& status);
90 
91  private:
92   virtual ~URLRequestAutomationJob();
93 
94   // Task which is scheduled in the URLRequestAutomationJob::ReadRawData
95   // function, which completes the job.
96   void NotifyJobCompletionTask();
97 
98   int id_;
99   int tab_;
100   scoped_refptr<AutomationResourceMessageFilter> message_filter_;
101 
102   scoped_refptr<net::IOBuffer> pending_buf_;
103   size_t pending_buf_size_;
104 
105   std::string mime_type_;
106   scoped_refptr<net::HttpResponseHeaders> headers_;
107   std::string redirect_url_;
108   int redirect_status_;
109   int request_id_;
110 
111   static int instance_count_;
112 
113   static bool is_protocol_factory_registered_;
114   // The previous HTTP/HTTPs protocol factories. We pass unhandled
115   // requests off to these factories
116   static net::URLRequest::ProtocolFactory* old_http_factory_;
117   static net::URLRequest::ProtocolFactory* old_https_factory_;
118 
119   // Set to true if the job is waiting for the external host to connect to the
120   // automation channel, which will be used for routing the network requests to
121   // the host.
122   bool is_pending_;
123 
124   // Contains the request status code, which is eventually passed  to the http
125   // stack when we receive a Read request for a completed job.
126   net::URLRequestStatus request_status_;
127 
128   // Contains the ip address and port of the destination host.
129   net::HostPortPair socket_address_;
130 
131   ScopedRunnableMethodFactory<URLRequestAutomationJob> method_factory_;
132 
133   DISALLOW_COPY_AND_ASSIGN(URLRequestAutomationJob);
134 };
135 
136 #endif  // CHROME_BROWSER_AUTOMATION_URL_REQUEST_AUTOMATION_JOB_H_
137