15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class simulates what wininet does when a dns lookup fails.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_AUTOMATION_URL_REQUEST_AUTOMATION_JOB_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_AUTOMATION_URL_REQUEST_AUTOMATION_JOB_H_
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/ref_counted_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutomationResourceMessageFilter;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AutomationURLResponse;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseHeaders;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseInfo;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpUserAgentSettings;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostPortPair;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Message;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// net::URLRequestJob implementation that loads the resources using
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// automation.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestAutomationJob : public net::URLRequestJob {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestAutomationJob(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::NetworkDelegate* network_delegate,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HttpUserAgentSettings* http_user_agent_settings,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int tab,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int request_id,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutomationResourceMessageFilter* filter,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_pending);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register our factory for HTTP/HTTPs requests.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void EnsureProtocolFactoryRegistered();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static net::URLRequest::ProtocolFactory Factory;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::URLRequestJob methods.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Start();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Kill();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetMimeType(std::string* mime_type) const;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetCharset(std::string* charset);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetResponseInfo(net::HttpResponseInfo* info);
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void GetLoadTimingInfo(net::LoadTimingInfo* load_timing_info) const;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetResponseCode() const;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsRedirectResponse(GURL* location, int* http_status_code);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::UploadProgress GetUploadProgress() const;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::HostPortPair GetSocketAddress() const;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Peek and process automation messages for URL requests.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool MayFilterMessage(const IPC::Message& message, int* request_id);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnMessage(const IPC::Message& message);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id() const {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id() const {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return request_id_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_pending() const {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return is_pending_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationResourceMessageFilter* message_filter() const {
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return message_filter_.get();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resumes a job, which was waiting for the external host to connect to the
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // automation channel. This is to ensure that this request gets routed to the
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // external host.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartPendingJob(int new_tab_handle,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       AutomationResourceMessageFilter* new_filter);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Protected net::URLRequestJob override.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartAsync();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Cleanup();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisconnectFromMessageFilter();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC message handlers.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRequestStarted(int id, const AutomationURLResponse& response);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDataAvailable(int id, const std::string& bytes);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRequestEnd(int id, const net::URLRequestStatus& status);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~URLRequestAutomationJob();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Task which is scheduled in the URLRequestAutomationJob::ReadRawData
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function, which completes the job.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyJobCompletionTask();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::HttpUserAgentSettings* http_user_agent_settings_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<AutomationResourceMessageFilter> message_filter_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> pending_buf_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t pending_buf_size_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> headers_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string redirect_url_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int redirect_status_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int instance_count_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool is_protocol_factory_registered_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The previous HTTP/HTTPs protocol factories. We pass unhandled
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requests off to these factories
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static net::URLRequest::ProtocolFactory* old_http_factory_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static net::URLRequest::ProtocolFactory* old_https_factory_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true if the job is waiting for the external host to connect to the
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // automation channel, which will be used for routing the network requests to
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the host.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_pending_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains the request status code, which is eventually passed  to the http
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stack when we receive a Read request for a completed job.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestStatus request_status_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains the ip address and port of the destination host.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostPortPair socket_address_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size of the upload data appended to the request.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 upload_size_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // When the request was sent out over automation.
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::TimeTicks request_start_;
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // When the response headers arrived from automation.
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::TimeTicks receive_headers_end_;
146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<URLRequestAutomationJob> weak_factory_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(URLRequestAutomationJob);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_AUTOMATION_URL_REQUEST_AUTOMATION_JOB_H_
153