OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/websockets/websocket_stream.h" | 5 #include "net/websockets/websocket_stream.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/metrics/sparse_histogram.h" | 10 #include "base/metrics/sparse_histogram.h" |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 | 77 |
78 class StreamRequestImpl : public WebSocketStreamRequest { | 78 class StreamRequestImpl : public WebSocketStreamRequest { |
79 public: | 79 public: |
80 StreamRequestImpl( | 80 StreamRequestImpl( |
81 const GURL& url, | 81 const GURL& url, |
82 const URLRequestContext* context, | 82 const URLRequestContext* context, |
83 const url::Origin& origin, | 83 const url::Origin& origin, |
84 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 84 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
85 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) | 85 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) |
86 : delegate_(new Delegate(this)), | 86 : delegate_(new Delegate(this)), |
87 url_request_(url, DEFAULT_PRIORITY, delegate_.get(), context), | 87 url_request_(context->CreateRequest(url, DEFAULT_PRIORITY, |
| 88 delegate_.get(), NULL)), |
88 connect_delegate_(connect_delegate.Pass()), | 89 connect_delegate_(connect_delegate.Pass()), |
89 create_helper_(create_helper.release()) { | 90 create_helper_(create_helper.release()) { |
90 create_helper_->set_failure_message(&failure_message_); | 91 create_helper_->set_failure_message(&failure_message_); |
91 HttpRequestHeaders headers; | 92 HttpRequestHeaders headers; |
92 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); | 93 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); |
93 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); | 94 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); |
94 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); | 95 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); |
95 headers.SetHeader(websockets::kSecWebSocketVersion, | 96 headers.SetHeader(websockets::kSecWebSocketVersion, |
96 websockets::kSupportedVersion); | 97 websockets::kSupportedVersion); |
97 url_request_.SetExtraRequestHeaders(headers); | 98 url_request_->SetExtraRequestHeaders(headers); |
98 | 99 |
99 // This passes the ownership of |create_helper_| to |url_request_|. | 100 // This passes the ownership of |create_helper_| to |url_request_|. |
100 url_request_.SetUserData( | 101 url_request_->SetUserData( |
101 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), | 102 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), |
102 create_helper_); | 103 create_helper_); |
103 url_request_.SetLoadFlags(LOAD_DISABLE_CACHE | | 104 url_request_->SetLoadFlags(LOAD_DISABLE_CACHE | |
104 LOAD_BYPASS_CACHE | | 105 LOAD_BYPASS_CACHE | |
105 LOAD_DO_NOT_PROMPT_FOR_LOGIN); | 106 LOAD_DO_NOT_PROMPT_FOR_LOGIN); |
106 } | 107 } |
107 | 108 |
108 // Destroying this object destroys the URLRequest, which cancels the request | 109 // Destroying this object destroys the URLRequest, which cancels the request |
109 // and so terminates the handshake if it is incomplete. | 110 // and so terminates the handshake if it is incomplete. |
110 virtual ~StreamRequestImpl() {} | 111 virtual ~StreamRequestImpl() {} |
111 | 112 |
112 void Start() { | 113 void Start() { |
113 url_request_.Start(); | 114 url_request_->Start(); |
114 } | 115 } |
115 | 116 |
116 void PerformUpgrade() { | 117 void PerformUpgrade() { |
117 connect_delegate_->OnSuccess(create_helper_->Upgrade()); | 118 connect_delegate_->OnSuccess(create_helper_->Upgrade()); |
118 } | 119 } |
119 | 120 |
120 void ReportFailure() { | 121 void ReportFailure() { |
121 if (failure_message_.empty()) { | 122 if (failure_message_.empty()) { |
122 switch (url_request_.status().status()) { | 123 switch (url_request_->status().status()) { |
123 case URLRequestStatus::SUCCESS: | 124 case URLRequestStatus::SUCCESS: |
124 case URLRequestStatus::IO_PENDING: | 125 case URLRequestStatus::IO_PENDING: |
125 break; | 126 break; |
126 case URLRequestStatus::CANCELED: | 127 case URLRequestStatus::CANCELED: |
127 failure_message_ = "WebSocket opening handshake was canceled"; | 128 failure_message_ = "WebSocket opening handshake was canceled"; |
128 break; | 129 break; |
129 case URLRequestStatus::FAILED: | 130 case URLRequestStatus::FAILED: |
130 failure_message_ = | 131 failure_message_ = |
131 std::string("Error in connection establishment: ") + | 132 std::string("Error in connection establishment: ") + |
132 ErrorToString(url_request_.status().error()); | 133 ErrorToString(url_request_->status().error()); |
133 break; | 134 break; |
134 } | 135 } |
135 } | 136 } |
136 connect_delegate_->OnFailure(failure_message_); | 137 connect_delegate_->OnFailure(failure_message_); |
137 } | 138 } |
138 | 139 |
139 WebSocketStream::ConnectDelegate* connect_delegate() const { | 140 WebSocketStream::ConnectDelegate* connect_delegate() const { |
140 return connect_delegate_.get(); | 141 return connect_delegate_.get(); |
141 } | 142 } |
142 | 143 |
143 private: | 144 private: |
144 // |delegate_| needs to be declared before |url_request_| so that it gets | 145 // |delegate_| needs to be declared before |url_request_| so that it gets |
145 // initialised first. | 146 // initialised first. |
146 scoped_ptr<Delegate> delegate_; | 147 scoped_ptr<Delegate> delegate_; |
147 | 148 |
148 // Deleting the StreamRequestImpl object deletes this URLRequest object, | 149 // Deleting the StreamRequestImpl object deletes this URLRequest object, |
149 // cancelling the whole connection. | 150 // cancelling the whole connection. |
150 URLRequest url_request_; | 151 scoped_ptr<URLRequest> url_request_; |
151 | 152 |
152 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate_; | 153 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate_; |
153 | 154 |
154 // Owned by the URLRequest. | 155 // Owned by the URLRequest. |
155 WebSocketHandshakeStreamCreateHelper* create_helper_; | 156 WebSocketHandshakeStreamCreateHelper* create_helper_; |
156 | 157 |
157 // The failure message supplied by WebSocketBasicHandshakeStream, if any. | 158 // The failure message supplied by WebSocketBasicHandshakeStream, if any. |
158 std::string failure_message_; | 159 std::string failure_message_; |
159 }; | 160 }; |
160 | 161 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 new StreamRequestImpl(socket_url, | 280 new StreamRequestImpl(socket_url, |
280 url_request_context, | 281 url_request_context, |
281 origin, | 282 origin, |
282 connect_delegate.Pass(), | 283 connect_delegate.Pass(), |
283 create_helper.Pass())); | 284 create_helper.Pass())); |
284 request->Start(); | 285 request->Start(); |
285 return request.PassAs<WebSocketStreamRequest>(); | 286 return request.PassAs<WebSocketStreamRequest>(); |
286 } | 287 } |
287 | 288 |
288 } // namespace net | 289 } // namespace net |
OLD | NEW |