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