Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / devtools / devtools_network_transaction.h
1 // Copyright 2014 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
5 #ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_TRANSACTION_H_
6 #define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_TRANSACTION_H_
7
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/weak_ptr.h"
10 #include "net/base/completion_callback.h"
11 #include "net/base/load_states.h"
12 #include "net/base/request_priority.h"
13 #include "net/http/http_transaction.h"
14 #include "net/websockets/websocket_handshake_stream_base.h"
15
16 class DevToolsNetworkController;
17 class DevToolsNetworkInterceptor;
18 class GURL;
19
20 namespace net {
21 class AuthCredentials;
22 class BoundNetLog;
23 class HttpRequestHeaders;
24 struct HttpRequestInfo;
25 class HttpResponseInfo;
26 class HttpNetworkSession;
27 class IOBuffer;
28 struct LoadTimingInfo;
29 class UploadProgress;
30 class X509Certificate;
31 }  // namespace net
32
33 namespace test {
34 class DevToolsNetworkControllerHelper;
35 }
36
37 // DevToolsNetworkTransaction is a wrapper for network transaction. All
38 // HttpTransaction methods are proxied to real transaction, but |callback|
39 // parameter is saved and replaced with proxy callback. Fail method should be
40 // used to simulate network outage. It runs saved callback (if any) with
41 // net::ERR_INTERNET_DISCONNECTED result value.
42 class DevToolsNetworkTransaction : public net::HttpTransaction {
43  public:
44   DevToolsNetworkTransaction(
45       DevToolsNetworkController* controller,
46       scoped_ptr<net::HttpTransaction> network_transaction);
47
48   virtual ~DevToolsNetworkTransaction();
49
50   const net::HttpRequestInfo* request() const { return request_; }
51
52   // Checks if request contains DevTools specific headers. Found values are
53   // remembered and corresponding keys are removed from headers.
54   void ProcessRequest();
55
56   bool failed() const { return failed_; }
57
58   // Runs callback (if any) with net::ERR_INTERNET_DISCONNECTED result value.
59   void Fail();
60
61   int64_t throttled_byte_count() const { return throttled_byte_count_; }
62   void DecreaseThrottledByteCount(int64_t delta) {
63     throttled_byte_count_ -= delta;
64   }
65
66   const std::string& request_initiator() const { return request_initiator_; }
67
68   const std::string& client_id() const {
69     return client_id_;
70   }
71
72   void FireThrottledCallback();
73
74   // HttpTransaction methods:
75   virtual int Start(
76       const net::HttpRequestInfo* request,
77       const net::CompletionCallback& callback,
78       const net::BoundNetLog& net_log) OVERRIDE;
79   virtual int RestartIgnoringLastError(
80       const net::CompletionCallback& callback) OVERRIDE;
81   virtual int RestartWithCertificate(
82       net::X509Certificate* client_cert,
83       const net::CompletionCallback& callback) OVERRIDE;
84   virtual int RestartWithAuth(
85       const net::AuthCredentials& credentials,
86       const net::CompletionCallback& callback) OVERRIDE;
87   virtual bool IsReadyToRestartForAuth() OVERRIDE;
88
89   virtual int Read(
90       net::IOBuffer* buf,
91       int buf_len,
92       const net::CompletionCallback& callback) OVERRIDE;
93   virtual void StopCaching() OVERRIDE;
94   virtual bool GetFullRequestHeaders(
95       net::HttpRequestHeaders* headers) const OVERRIDE;
96   virtual int64 GetTotalReceivedBytes() const OVERRIDE;
97   virtual void DoneReading() OVERRIDE;
98   virtual const net::HttpResponseInfo* GetResponseInfo() const OVERRIDE;
99   virtual net::LoadState GetLoadState() const OVERRIDE;
100   virtual net::UploadProgress GetUploadProgress() const OVERRIDE;
101   virtual void SetQuicServerInfo(
102       net::QuicServerInfo* quic_server_info) OVERRIDE;
103   virtual bool GetLoadTimingInfo(
104       net::LoadTimingInfo* load_timing_info) const OVERRIDE;
105   virtual void SetPriority(net::RequestPriority priority) OVERRIDE;
106   virtual void SetWebSocketHandshakeStreamCreateHelper(
107       net::WebSocketHandshakeStreamBase::CreateHelper* create_helper) OVERRIDE;
108   virtual void SetBeforeNetworkStartCallback(
109       const BeforeNetworkStartCallback& callback) OVERRIDE;
110   virtual void SetBeforeProxyHeadersSentCallback(
111       const BeforeProxyHeadersSentCallback& callback) OVERRIDE;
112   virtual int ResumeNetworkStart() OVERRIDE;
113
114  protected:
115   friend class test::DevToolsNetworkControllerHelper;
116
117  private:
118   // Proxy callback handler. Runs saved callback.
119   void OnCallback(int result);
120
121   DevToolsNetworkController* controller_;
122   base::WeakPtr<DevToolsNetworkInterceptor> interceptor_;
123
124   // Modified request. Should be destructed after |network_transaction_|
125   scoped_ptr<net::HttpRequestInfo> custom_request_;
126
127   // Real network transaction.
128   scoped_ptr<net::HttpTransaction> network_transaction_;
129
130   const net::HttpRequestInfo* request_;
131
132   // True if Start was already invoked.
133   bool started_;
134
135   // True if Fail was already invoked.
136   bool failed_;
137
138   // Value of "X-DevTools-Request-Initiator" request header.
139   std::string request_initiator_;
140
141   // Value of "X-DevTools-Emulate-Network-Conditions-Client-Id" request header.
142   std::string client_id_;
143
144   enum CallbackType {
145       NONE,
146       READ,
147       RESTART_IGNORING_LAST_ERROR,
148       RESTART_WITH_AUTH,
149       RESTART_WITH_CERTIFICATE,
150       START
151   };
152
153   int SetupCallback(
154       net::CompletionCallback callback,
155       int result,
156       CallbackType callback_type);
157
158   void Throttle(int result);
159
160   int throttled_result_;
161   int64_t throttled_byte_count_;
162   CallbackType callback_type_;
163   net::CompletionCallback proxy_callback_;
164   net::CompletionCallback callback_;
165
166   DISALLOW_COPY_AND_ASSIGN(DevToolsNetworkTransaction);
167 };
168
169 #endif  // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_TRANSACTION_H_