| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/http/http_stream_factory_impl.h" | 5 #include "net/http/http_stream_factory_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 | 45 |
| 46 class MockWebSocketHandshakeStream : public WebSocketHandshakeStreamBase { | 46 class MockWebSocketHandshakeStream : public WebSocketHandshakeStreamBase { |
| 47 public: | 47 public: |
| 48 enum StreamType { | 48 enum StreamType { |
| 49 kStreamTypeBasic, | 49 kStreamTypeBasic, |
| 50 kStreamTypeSpdy, | 50 kStreamTypeSpdy, |
| 51 }; | 51 }; |
| 52 | 52 |
| 53 explicit MockWebSocketHandshakeStream(StreamType type) : type_(type) {} | 53 explicit MockWebSocketHandshakeStream(StreamType type) : type_(type) {} |
| 54 | 54 |
| 55 virtual ~MockWebSocketHandshakeStream() {} | 55 ~MockWebSocketHandshakeStream() override {} |
| 56 | 56 |
| 57 StreamType type() const { | 57 StreamType type() const { |
| 58 return type_; | 58 return type_; |
| 59 } | 59 } |
| 60 | 60 |
| 61 // HttpStreamBase methods | 61 // HttpStreamBase methods |
| 62 virtual int InitializeStream(const HttpRequestInfo* request_info, | 62 int InitializeStream(const HttpRequestInfo* request_info, |
| 63 RequestPriority priority, | 63 RequestPriority priority, |
| 64 const BoundNetLog& net_log, | 64 const BoundNetLog& net_log, |
| 65 const CompletionCallback& callback) override { | 65 const CompletionCallback& callback) override { |
| 66 return ERR_IO_PENDING; | 66 return ERR_IO_PENDING; |
| 67 } | 67 } |
| 68 virtual int SendRequest(const HttpRequestHeaders& request_headers, | 68 int SendRequest(const HttpRequestHeaders& request_headers, |
| 69 HttpResponseInfo* response, | 69 HttpResponseInfo* response, |
| 70 const CompletionCallback& callback) override { | 70 const CompletionCallback& callback) override { |
| 71 return ERR_IO_PENDING; | 71 return ERR_IO_PENDING; |
| 72 } | 72 } |
| 73 virtual int ReadResponseHeaders(const CompletionCallback& callback) override { | 73 int ReadResponseHeaders(const CompletionCallback& callback) override { |
| 74 return ERR_IO_PENDING; | 74 return ERR_IO_PENDING; |
| 75 } | 75 } |
| 76 virtual int ReadResponseBody(IOBuffer* buf, | 76 int ReadResponseBody(IOBuffer* buf, |
| 77 int buf_len, | 77 int buf_len, |
| 78 const CompletionCallback& callback) override { | 78 const CompletionCallback& callback) override { |
| 79 return ERR_IO_PENDING; | 79 return ERR_IO_PENDING; |
| 80 } | 80 } |
| 81 virtual void Close(bool not_reusable) override {} | 81 void Close(bool not_reusable) override {} |
| 82 virtual bool IsResponseBodyComplete() const override { return false; } | 82 bool IsResponseBodyComplete() const override { return false; } |
| 83 virtual bool CanFindEndOfResponse() const override { return false; } | 83 bool CanFindEndOfResponse() const override { return false; } |
| 84 virtual bool IsConnectionReused() const override { return false; } | 84 bool IsConnectionReused() const override { return false; } |
| 85 virtual void SetConnectionReused() override {} | 85 void SetConnectionReused() override {} |
| 86 virtual bool IsConnectionReusable() const override { return false; } | 86 bool IsConnectionReusable() const override { return false; } |
| 87 virtual int64 GetTotalReceivedBytes() const override { return 0; } | 87 int64 GetTotalReceivedBytes() const override { return 0; } |
| 88 virtual bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const | 88 bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override { |
| 89 override { | |
| 90 return false; | 89 return false; |
| 91 } | 90 } |
| 92 virtual void GetSSLInfo(SSLInfo* ssl_info) override {} | 91 void GetSSLInfo(SSLInfo* ssl_info) override {} |
| 93 virtual void GetSSLCertRequestInfo( | 92 void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override {} |
| 94 SSLCertRequestInfo* cert_request_info) override {} | 93 bool IsSpdyHttpStream() const override { return false; } |
| 95 virtual bool IsSpdyHttpStream() const override { return false; } | 94 void Drain(HttpNetworkSession* session) override {} |
| 96 virtual void Drain(HttpNetworkSession* session) override {} | 95 void SetPriority(RequestPriority priority) override {} |
| 97 virtual void SetPriority(RequestPriority priority) override {} | |
| 98 | 96 |
| 99 virtual scoped_ptr<WebSocketStream> Upgrade() override { | 97 scoped_ptr<WebSocketStream> Upgrade() override { |
| 100 return scoped_ptr<WebSocketStream>(); | 98 return scoped_ptr<WebSocketStream>(); |
| 101 } | 99 } |
| 102 | 100 |
| 103 private: | 101 private: |
| 104 const StreamType type_; | 102 const StreamType type_; |
| 105 }; | 103 }; |
| 106 | 104 |
| 107 // HttpStreamFactoryImpl subclass that can wait until a preconnect is complete. | 105 // HttpStreamFactoryImpl subclass that can wait until a preconnect is complete. |
| 108 class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl { | 106 class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl { |
| 109 public: | 107 public: |
| 110 MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session, | 108 MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session, |
| 111 bool for_websockets) | 109 bool for_websockets) |
| 112 : HttpStreamFactoryImpl(session, for_websockets), | 110 : HttpStreamFactoryImpl(session, for_websockets), |
| 113 preconnect_done_(false), | 111 preconnect_done_(false), |
| 114 waiting_for_preconnect_(false) {} | 112 waiting_for_preconnect_(false) {} |
| 115 | 113 |
| 116 | 114 |
| 117 void WaitForPreconnects() { | 115 void WaitForPreconnects() { |
| 118 while (!preconnect_done_) { | 116 while (!preconnect_done_) { |
| 119 waiting_for_preconnect_ = true; | 117 waiting_for_preconnect_ = true; |
| 120 base::MessageLoop::current()->Run(); | 118 base::MessageLoop::current()->Run(); |
| 121 waiting_for_preconnect_ = false; | 119 waiting_for_preconnect_ = false; |
| 122 } | 120 } |
| 123 } | 121 } |
| 124 | 122 |
| 125 private: | 123 private: |
| 126 // HttpStreamFactoryImpl methods. | 124 // HttpStreamFactoryImpl methods. |
| 127 virtual void OnPreconnectsCompleteInternal() override { | 125 void OnPreconnectsCompleteInternal() override { |
| 128 preconnect_done_ = true; | 126 preconnect_done_ = true; |
| 129 if (waiting_for_preconnect_) | 127 if (waiting_for_preconnect_) |
| 130 base::MessageLoop::current()->Quit(); | 128 base::MessageLoop::current()->Quit(); |
| 131 } | 129 } |
| 132 | 130 |
| 133 bool preconnect_done_; | 131 bool preconnect_done_; |
| 134 bool waiting_for_preconnect_; | 132 bool waiting_for_preconnect_; |
| 135 }; | 133 }; |
| 136 | 134 |
| 137 class StreamRequestWaiter : public HttpStreamRequest::Delegate { | 135 class StreamRequestWaiter : public HttpStreamRequest::Delegate { |
| 138 public: | 136 public: |
| 139 StreamRequestWaiter() | 137 StreamRequestWaiter() |
| 140 : waiting_for_stream_(false), | 138 : waiting_for_stream_(false), |
| 141 stream_done_(false) {} | 139 stream_done_(false) {} |
| 142 | 140 |
| 143 // HttpStreamRequest::Delegate | 141 // HttpStreamRequest::Delegate |
| 144 | 142 |
| 145 virtual void OnStreamReady( | 143 void OnStreamReady(const SSLConfig& used_ssl_config, |
| 146 const SSLConfig& used_ssl_config, | 144 const ProxyInfo& used_proxy_info, |
| 147 const ProxyInfo& used_proxy_info, | 145 HttpStreamBase* stream) override { |
| 148 HttpStreamBase* stream) override { | |
| 149 stream_done_ = true; | 146 stream_done_ = true; |
| 150 if (waiting_for_stream_) | 147 if (waiting_for_stream_) |
| 151 base::MessageLoop::current()->Quit(); | 148 base::MessageLoop::current()->Quit(); |
| 152 stream_.reset(stream); | 149 stream_.reset(stream); |
| 153 used_ssl_config_ = used_ssl_config; | 150 used_ssl_config_ = used_ssl_config; |
| 154 used_proxy_info_ = used_proxy_info; | 151 used_proxy_info_ = used_proxy_info; |
| 155 } | 152 } |
| 156 | 153 |
| 157 virtual void OnWebSocketHandshakeStreamReady( | 154 void OnWebSocketHandshakeStreamReady( |
| 158 const SSLConfig& used_ssl_config, | 155 const SSLConfig& used_ssl_config, |
| 159 const ProxyInfo& used_proxy_info, | 156 const ProxyInfo& used_proxy_info, |
| 160 WebSocketHandshakeStreamBase* stream) override { | 157 WebSocketHandshakeStreamBase* stream) override { |
| 161 stream_done_ = true; | 158 stream_done_ = true; |
| 162 if (waiting_for_stream_) | 159 if (waiting_for_stream_) |
| 163 base::MessageLoop::current()->Quit(); | 160 base::MessageLoop::current()->Quit(); |
| 164 websocket_stream_.reset(stream); | 161 websocket_stream_.reset(stream); |
| 165 used_ssl_config_ = used_ssl_config; | 162 used_ssl_config_ = used_ssl_config; |
| 166 used_proxy_info_ = used_proxy_info; | 163 used_proxy_info_ = used_proxy_info; |
| 167 } | 164 } |
| 168 | 165 |
| 169 virtual void OnStreamFailed( | 166 void OnStreamFailed(int status, const SSLConfig& used_ssl_config) override {} |
| 170 int status, | |
| 171 const SSLConfig& used_ssl_config) override {} | |
| 172 | 167 |
| 173 virtual void OnCertificateError( | 168 void OnCertificateError(int status, |
| 174 int status, | 169 const SSLConfig& used_ssl_config, |
| 175 const SSLConfig& used_ssl_config, | 170 const SSLInfo& ssl_info) override {} |
| 176 const SSLInfo& ssl_info) override {} | |
| 177 | 171 |
| 178 virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, | 172 void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, |
| 179 const SSLConfig& used_ssl_config, | 173 const SSLConfig& used_ssl_config, |
| 180 const ProxyInfo& used_proxy_info, | 174 const ProxyInfo& used_proxy_info, |
| 181 HttpAuthController* auth_controller) override {} | 175 HttpAuthController* auth_controller) override {} |
| 182 | 176 |
| 183 virtual void OnNeedsClientAuth(const SSLConfig& used_ssl_config, | 177 void OnNeedsClientAuth(const SSLConfig& used_ssl_config, |
| 184 SSLCertRequestInfo* cert_info) override {} | 178 SSLCertRequestInfo* cert_info) override {} |
| 185 | 179 |
| 186 virtual void OnHttpsProxyTunnelResponse(const HttpResponseInfo& response_info, | 180 void OnHttpsProxyTunnelResponse(const HttpResponseInfo& response_info, |
| 187 const SSLConfig& used_ssl_config, | 181 const SSLConfig& used_ssl_config, |
| 188 const ProxyInfo& used_proxy_info, | 182 const ProxyInfo& used_proxy_info, |
| 189 HttpStreamBase* stream) override {} | 183 HttpStreamBase* stream) override {} |
| 190 | 184 |
| 191 void WaitForStream() { | 185 void WaitForStream() { |
| 192 while (!stream_done_) { | 186 while (!stream_done_) { |
| 193 waiting_for_stream_ = true; | 187 waiting_for_stream_ = true; |
| 194 base::MessageLoop::current()->Run(); | 188 base::MessageLoop::current()->Run(); |
| 195 waiting_for_stream_ = false; | 189 waiting_for_stream_ = false; |
| 196 } | 190 } |
| 197 } | 191 } |
| 198 | 192 |
| 199 const SSLConfig& used_ssl_config() const { | 193 const SSLConfig& used_ssl_config() const { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 225 DISALLOW_COPY_AND_ASSIGN(StreamRequestWaiter); | 219 DISALLOW_COPY_AND_ASSIGN(StreamRequestWaiter); |
| 226 }; | 220 }; |
| 227 | 221 |
| 228 class WebSocketSpdyHandshakeStream : public MockWebSocketHandshakeStream { | 222 class WebSocketSpdyHandshakeStream : public MockWebSocketHandshakeStream { |
| 229 public: | 223 public: |
| 230 explicit WebSocketSpdyHandshakeStream( | 224 explicit WebSocketSpdyHandshakeStream( |
| 231 const base::WeakPtr<SpdySession>& spdy_session) | 225 const base::WeakPtr<SpdySession>& spdy_session) |
| 232 : MockWebSocketHandshakeStream(kStreamTypeSpdy), | 226 : MockWebSocketHandshakeStream(kStreamTypeSpdy), |
| 233 spdy_session_(spdy_session) {} | 227 spdy_session_(spdy_session) {} |
| 234 | 228 |
| 235 virtual ~WebSocketSpdyHandshakeStream() {} | 229 ~WebSocketSpdyHandshakeStream() override {} |
| 236 | 230 |
| 237 SpdySession* spdy_session() { return spdy_session_.get(); } | 231 SpdySession* spdy_session() { return spdy_session_.get(); } |
| 238 | 232 |
| 239 private: | 233 private: |
| 240 base::WeakPtr<SpdySession> spdy_session_; | 234 base::WeakPtr<SpdySession> spdy_session_; |
| 241 }; | 235 }; |
| 242 | 236 |
| 243 class WebSocketBasicHandshakeStream : public MockWebSocketHandshakeStream { | 237 class WebSocketBasicHandshakeStream : public MockWebSocketHandshakeStream { |
| 244 public: | 238 public: |
| 245 explicit WebSocketBasicHandshakeStream( | 239 explicit WebSocketBasicHandshakeStream( |
| 246 scoped_ptr<ClientSocketHandle> connection) | 240 scoped_ptr<ClientSocketHandle> connection) |
| 247 : MockWebSocketHandshakeStream(kStreamTypeBasic), | 241 : MockWebSocketHandshakeStream(kStreamTypeBasic), |
| 248 connection_(connection.Pass()) {} | 242 connection_(connection.Pass()) {} |
| 249 | 243 |
| 250 virtual ~WebSocketBasicHandshakeStream() { | 244 ~WebSocketBasicHandshakeStream() override { |
| 251 connection_->socket()->Disconnect(); | 245 connection_->socket()->Disconnect(); |
| 252 } | 246 } |
| 253 | 247 |
| 254 ClientSocketHandle* connection() { return connection_.get(); } | 248 ClientSocketHandle* connection() { return connection_.get(); } |
| 255 | 249 |
| 256 private: | 250 private: |
| 257 scoped_ptr<ClientSocketHandle> connection_; | 251 scoped_ptr<ClientSocketHandle> connection_; |
| 258 }; | 252 }; |
| 259 | 253 |
| 260 class WebSocketStreamCreateHelper | 254 class WebSocketStreamCreateHelper |
| 261 : public WebSocketHandshakeStreamBase::CreateHelper { | 255 : public WebSocketHandshakeStreamBase::CreateHelper { |
| 262 public: | 256 public: |
| 263 virtual ~WebSocketStreamCreateHelper() {} | 257 ~WebSocketStreamCreateHelper() override {} |
| 264 | 258 |
| 265 virtual WebSocketHandshakeStreamBase* CreateBasicStream( | 259 WebSocketHandshakeStreamBase* CreateBasicStream( |
| 266 scoped_ptr<ClientSocketHandle> connection, | 260 scoped_ptr<ClientSocketHandle> connection, |
| 267 bool using_proxy) override { | 261 bool using_proxy) override { |
| 268 return new WebSocketBasicHandshakeStream(connection.Pass()); | 262 return new WebSocketBasicHandshakeStream(connection.Pass()); |
| 269 } | 263 } |
| 270 | 264 |
| 271 virtual WebSocketHandshakeStreamBase* CreateSpdyStream( | 265 WebSocketHandshakeStreamBase* CreateSpdyStream( |
| 272 const base::WeakPtr<SpdySession>& spdy_session, | 266 const base::WeakPtr<SpdySession>& spdy_session, |
| 273 bool use_relative_url) override { | 267 bool use_relative_url) override { |
| 274 return new WebSocketSpdyHandshakeStream(spdy_session); | 268 return new WebSocketSpdyHandshakeStream(spdy_session); |
| 275 } | 269 } |
| 276 }; | 270 }; |
| 277 | 271 |
| 278 struct TestCase { | 272 struct TestCase { |
| 279 int num_streams; | 273 int num_streams; |
| 280 bool ssl; | 274 bool ssl; |
| 281 }; | 275 }; |
| (...skipping 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1303 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 1297 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| 1304 | 1298 |
| 1305 // Make sure there is no orphaned job. it is already canceled. | 1299 // Make sure there is no orphaned job. it is already canceled. |
| 1306 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( | 1300 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( |
| 1307 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); | 1301 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); |
| 1308 } | 1302 } |
| 1309 | 1303 |
| 1310 } // namespace | 1304 } // namespace |
| 1311 | 1305 |
| 1312 } // namespace net | 1306 } // namespace net |
| OLD | NEW |