Home | History | Annotate | Download | only in devtools
      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_
    170