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