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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 | 78 |
79 class StreamRequestImpl : public WebSocketStreamRequest { | 79 class StreamRequestImpl : public WebSocketStreamRequest { |
80 public: | 80 public: |
81 StreamRequestImpl( | 81 StreamRequestImpl( |
82 const GURL& url, | 82 const GURL& url, |
83 const URLRequestContext* context, | 83 const URLRequestContext* context, |
84 const url::Origin& origin, | 84 const url::Origin& origin, |
85 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 85 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
86 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) | 86 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) |
87 : delegate_(new Delegate(this)), | 87 : delegate_(new Delegate(this)), |
88 url_request_(url, DEFAULT_PRIORITY, delegate_.get(), context), | 88 url_request_(context->CreateRequest(url, DEFAULT_PRIORITY, |
| 89 delegate_.get(), NULL)), |
89 connect_delegate_(connect_delegate.Pass()), | 90 connect_delegate_(connect_delegate.Pass()), |
90 create_helper_(create_helper.release()) { | 91 create_helper_(create_helper.release()) { |
91 create_helper_->set_failure_message(&failure_message_); | 92 create_helper_->set_failure_message(&failure_message_); |
92 HttpRequestHeaders headers; | 93 HttpRequestHeaders headers; |
93 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); | 94 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); |
94 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); | 95 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); |
95 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); | 96 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); |
96 headers.SetHeader(websockets::kSecWebSocketVersion, | 97 headers.SetHeader(websockets::kSecWebSocketVersion, |
97 websockets::kSupportedVersion); | 98 websockets::kSupportedVersion); |
98 url_request_.SetExtraRequestHeaders(headers); | 99 url_request_->SetExtraRequestHeaders(headers); |
99 | 100 |
100 // This passes the ownership of |create_helper_| to |url_request_|. | 101 // This passes the ownership of |create_helper_| to |url_request_|. |
101 url_request_.SetUserData( | 102 url_request_->SetUserData( |
102 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), | 103 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), |
103 create_helper_); | 104 create_helper_); |
104 url_request_.SetLoadFlags(LOAD_DISABLE_CACHE | | 105 url_request_->SetLoadFlags(LOAD_DISABLE_CACHE | |
105 LOAD_BYPASS_CACHE | | 106 LOAD_BYPASS_CACHE | |
106 LOAD_DO_NOT_PROMPT_FOR_LOGIN); | 107 LOAD_DO_NOT_PROMPT_FOR_LOGIN); |
107 } | 108 } |
108 | 109 |
109 // Destroying this object destroys the URLRequest, which cancels the request | 110 // Destroying this object destroys the URLRequest, which cancels the request |
110 // and so terminates the handshake if it is incomplete. | 111 // and so terminates the handshake if it is incomplete. |
111 virtual ~StreamRequestImpl() {} | 112 virtual ~StreamRequestImpl() {} |
112 | 113 |
113 void Start() { | 114 void Start() { |
114 url_request_.Start(); | 115 url_request_->Start(); |
115 } | 116 } |
116 | 117 |
117 void PerformUpgrade() { | 118 void PerformUpgrade() { |
118 connect_delegate_->OnSuccess(create_helper_->Upgrade()); | 119 connect_delegate_->OnSuccess(create_helper_->Upgrade()); |
119 } | 120 } |
120 | 121 |
121 void ReportFailure() { | 122 void ReportFailure() { |
122 if (failure_message_.empty()) { | 123 if (failure_message_.empty()) { |
123 switch (url_request_.status().status()) { | 124 switch (url_request_->status().status()) { |
124 case URLRequestStatus::SUCCESS: | 125 case URLRequestStatus::SUCCESS: |
125 case URLRequestStatus::IO_PENDING: | 126 case URLRequestStatus::IO_PENDING: |
126 break; | 127 break; |
127 case URLRequestStatus::CANCELED: | 128 case URLRequestStatus::CANCELED: |
128 failure_message_ = "WebSocket opening handshake was canceled"; | 129 failure_message_ = "WebSocket opening handshake was canceled"; |
129 break; | 130 break; |
130 case URLRequestStatus::FAILED: | 131 case URLRequestStatus::FAILED: |
131 failure_message_ = | 132 failure_message_ = |
132 std::string("Error in connection establishment: ") + | 133 std::string("Error in connection establishment: ") + |
133 ErrorToString(url_request_.status().error()); | 134 ErrorToString(url_request_->status().error()); |
134 break; | 135 break; |
135 } | 136 } |
136 } | 137 } |
137 ReportFailureWithMessage(failure_message_); | 138 ReportFailureWithMessage(failure_message_); |
138 } | 139 } |
139 | 140 |
140 void ReportFailureWithMessage(const std::string& failure_message) { | 141 void ReportFailureWithMessage(const std::string& failure_message) { |
141 connect_delegate_->OnFailure(failure_message); | 142 connect_delegate_->OnFailure(failure_message); |
142 } | 143 } |
143 | 144 |
144 void OnFinishOpeningHandshake() { | 145 void OnFinishOpeningHandshake() { |
145 WebSocketDispatchOnFinishOpeningHandshake(connect_delegate(), | 146 WebSocketDispatchOnFinishOpeningHandshake(connect_delegate(), |
146 url_request_.url(), | 147 url_request_->url(), |
147 url_request_.response_headers(), | 148 url_request_->response_headers(), |
148 url_request_.response_time()); | 149 url_request_->response_time()); |
149 } | 150 } |
150 | 151 |
151 WebSocketStream::ConnectDelegate* connect_delegate() const { | 152 WebSocketStream::ConnectDelegate* connect_delegate() const { |
152 return connect_delegate_.get(); | 153 return connect_delegate_.get(); |
153 } | 154 } |
154 | 155 |
155 private: | 156 private: |
156 // |delegate_| needs to be declared before |url_request_| so that it gets | 157 // |delegate_| needs to be declared before |url_request_| so that it gets |
157 // initialised first. | 158 // initialised first. |
158 scoped_ptr<Delegate> delegate_; | 159 scoped_ptr<Delegate> delegate_; |
159 | 160 |
160 // Deleting the StreamRequestImpl object deletes this URLRequest object, | 161 // Deleting the StreamRequestImpl object deletes this URLRequest object, |
161 // cancelling the whole connection. | 162 // cancelling the whole connection. |
162 URLRequest url_request_; | 163 scoped_ptr<URLRequest> url_request_; |
163 | 164 |
164 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate_; | 165 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate_; |
165 | 166 |
166 // Owned by the URLRequest. | 167 // Owned by the URLRequest. |
167 WebSocketHandshakeStreamCreateHelper* create_helper_; | 168 WebSocketHandshakeStreamCreateHelper* create_helper_; |
168 | 169 |
169 // The failure message supplied by WebSocketBasicHandshakeStream, if any. | 170 // The failure message supplied by WebSocketBasicHandshakeStream, if any. |
170 std::string failure_message_; | 171 std::string failure_message_; |
171 }; | 172 }; |
172 | 173 |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 connect_delegate->OnFinishOpeningHandshake(make_scoped_ptr( | 317 connect_delegate->OnFinishOpeningHandshake(make_scoped_ptr( |
317 new WebSocketHandshakeResponseInfo(url, | 318 new WebSocketHandshakeResponseInfo(url, |
318 headers->response_code(), | 319 headers->response_code(), |
319 headers->GetStatusText(), | 320 headers->GetStatusText(), |
320 headers, | 321 headers, |
321 response_time))); | 322 response_time))); |
322 } | 323 } |
323 } | 324 } |
324 | 325 |
325 } // namespace net | 326 } // namespace net |
OLD | NEW |