Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Side by Side Diff: content/browser/websockets/websocket_impl.cc

Issue 2248743003: [not for commit] try out fix with darin's cl. Base URL: https://chromium.googlesource.com/chromium/src.git@44_fix_copy_assign
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "content/browser/websockets/websocket_impl.h" 5 #include "content/browser/websockets/websocket_impl.h"
6 6
7 #include <inttypes.h> 7 #include <inttypes.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 25 matching lines...) Expand all
36 #include "net/websockets/websocket_frame.h" // for WebSocketFrameHeader::OpCode 36 #include "net/websockets/websocket_frame.h" // for WebSocketFrameHeader::OpCode
37 #include "net/websockets/websocket_handshake_request_info.h" 37 #include "net/websockets/websocket_handshake_request_info.h"
38 #include "net/websockets/websocket_handshake_response_info.h" 38 #include "net/websockets/websocket_handshake_response_info.h"
39 #include "url/origin.h" 39 #include "url/origin.h"
40 40
41 namespace content { 41 namespace content {
42 namespace { 42 namespace {
43 43
44 typedef net::WebSocketEventInterface::ChannelState ChannelState; 44 typedef net::WebSocketEventInterface::ChannelState ChannelState;
45 45
46 // Convert a mojom::WebSocketMessageType to a 46 // Convert a blink::mojom::WebSocketMessageType to a
47 // net::WebSocketFrameHeader::OpCode 47 // net::WebSocketFrameHeader::OpCode
48 net::WebSocketFrameHeader::OpCode MessageTypeToOpCode( 48 net::WebSocketFrameHeader::OpCode MessageTypeToOpCode(
49 mojom::WebSocketMessageType type) { 49 blink::mojom::WebSocketMessageType type) {
50 DCHECK(type == mojom::WebSocketMessageType::CONTINUATION || 50 DCHECK(type == blink::mojom::WebSocketMessageType::CONTINUATION ||
51 type == mojom::WebSocketMessageType::TEXT || 51 type == blink::mojom::WebSocketMessageType::TEXT ||
52 type == mojom::WebSocketMessageType::BINARY); 52 type == blink::mojom::WebSocketMessageType::BINARY);
53 typedef net::WebSocketFrameHeader::OpCode OpCode; 53 typedef net::WebSocketFrameHeader::OpCode OpCode;
54 // These compile asserts verify that the same underlying values are used for 54 // These compile asserts verify that the same underlying values are used for
55 // both types, so we can simply cast between them. 55 // both types, so we can simply cast between them.
56 static_assert( 56 static_assert(
57 static_cast<OpCode>(mojom::WebSocketMessageType::CONTINUATION) == 57 static_cast<OpCode>(blink::mojom::WebSocketMessageType::CONTINUATION) ==
58 net::WebSocketFrameHeader::kOpCodeContinuation, 58 net::WebSocketFrameHeader::kOpCodeContinuation,
59 "enum values must match for opcode continuation"); 59 "enum values must match for opcode continuation");
60 static_assert( 60 static_assert(
61 static_cast<OpCode>(mojom::WebSocketMessageType::TEXT) == 61 static_cast<OpCode>(blink::mojom::WebSocketMessageType::TEXT) ==
62 net::WebSocketFrameHeader::kOpCodeText, 62 net::WebSocketFrameHeader::kOpCodeText,
63 "enum values must match for opcode text"); 63 "enum values must match for opcode text");
64 static_assert( 64 static_assert(
65 static_cast<OpCode>(mojom::WebSocketMessageType::BINARY) == 65 static_cast<OpCode>(blink::mojom::WebSocketMessageType::BINARY) ==
66 net::WebSocketFrameHeader::kOpCodeBinary, 66 net::WebSocketFrameHeader::kOpCodeBinary,
67 "enum values must match for opcode binary"); 67 "enum values must match for opcode binary");
68 return static_cast<OpCode>(type); 68 return static_cast<OpCode>(type);
69 } 69 }
70 70
71 mojom::WebSocketMessageType OpCodeToMessageType( 71 blink::mojom::WebSocketMessageType OpCodeToMessageType(
72 net::WebSocketFrameHeader::OpCode opCode) { 72 net::WebSocketFrameHeader::OpCode opCode) {
73 DCHECK(opCode == net::WebSocketFrameHeader::kOpCodeContinuation || 73 DCHECK(opCode == net::WebSocketFrameHeader::kOpCodeContinuation ||
74 opCode == net::WebSocketFrameHeader::kOpCodeText || 74 opCode == net::WebSocketFrameHeader::kOpCodeText ||
75 opCode == net::WebSocketFrameHeader::kOpCodeBinary); 75 opCode == net::WebSocketFrameHeader::kOpCodeBinary);
76 // This cast is guaranteed valid by the static_assert() statements above. 76 // This cast is guaranteed valid by the static_assert() statements above.
77 return static_cast<mojom::WebSocketMessageType>(opCode); 77 return static_cast<blink::mojom::WebSocketMessageType>(opCode);
78 } 78 }
79 79
80 } // namespace 80 } // namespace
81 81
82 // Implementation of net::WebSocketEventInterface. Receives events from our 82 // Implementation of net::WebSocketEventInterface. Receives events from our
83 // WebSocketChannel object. 83 // WebSocketChannel object.
84 class WebSocketImpl::WebSocketEventHandler final 84 class WebSocketImpl::WebSocketEventHandler final
85 : public net::WebSocketEventInterface { 85 : public net::WebSocketEventInterface {
86 public: 86 public:
87 explicit WebSocketEventHandler(WebSocketImpl* impl); 87 explicit WebSocketEventHandler(WebSocketImpl* impl);
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 bool should_send = 238 bool should_send =
239 ChildProcessSecurityPolicyImpl::GetInstance()->CanReadRawCookies( 239 ChildProcessSecurityPolicyImpl::GetInstance()->CanReadRawCookies(
240 impl_->delegate_->GetClientProcessId()); 240 impl_->delegate_->GetClientProcessId());
241 241
242 DVLOG(3) << "WebSocketEventHandler::OnStartOpeningHandshake @" 242 DVLOG(3) << "WebSocketEventHandler::OnStartOpeningHandshake @"
243 << reinterpret_cast<void*>(this) << " should_send=" << should_send; 243 << reinterpret_cast<void*>(this) << " should_send=" << should_send;
244 244
245 if (!should_send) 245 if (!should_send)
246 return WebSocketEventInterface::CHANNEL_ALIVE; 246 return WebSocketEventInterface::CHANNEL_ALIVE;
247 247
248 mojom::WebSocketHandshakeRequestPtr request_to_pass( 248 blink::mojom::WebSocketHandshakeRequestPtr request_to_pass(
249 mojom::WebSocketHandshakeRequest::New()); 249 blink::mojom::WebSocketHandshakeRequest::New());
250 request_to_pass->url.Swap(&request->url); 250 request_to_pass->url.Swap(&request->url);
251 net::HttpRequestHeaders::Iterator it(request->headers); 251 net::HttpRequestHeaders::Iterator it(request->headers);
252 while (it.GetNext()) { 252 while (it.GetNext()) {
253 mojom::HttpHeaderPtr header(mojom::HttpHeader::New()); 253 blink::mojom::HttpHeaderPtr header(blink::mojom::HttpHeader::New());
254 header->name = it.name(); 254 header->name = it.name();
255 header->value = it.value(); 255 header->value = it.value();
256 request_to_pass->headers.push_back(std::move(header)); 256 request_to_pass->headers.push_back(std::move(header));
257 } 257 }
258 request_to_pass->headers_text = 258 request_to_pass->headers_text =
259 base::StringPrintf("GET %s HTTP/1.1\r\n", 259 base::StringPrintf("GET %s HTTP/1.1\r\n",
260 request_to_pass->url.spec().c_str()) + 260 request_to_pass->url.spec().c_str()) +
261 request->headers.ToString(); 261 request->headers.ToString();
262 262
263 impl_->client_->OnStartOpeningHandshake(std::move(request_to_pass)); 263 impl_->client_->OnStartOpeningHandshake(std::move(request_to_pass));
264 264
265 return WebSocketEventInterface::CHANNEL_ALIVE; 265 return WebSocketEventInterface::CHANNEL_ALIVE;
266 } 266 }
267 267
268 ChannelState WebSocketImpl::WebSocketEventHandler::OnFinishOpeningHandshake( 268 ChannelState WebSocketImpl::WebSocketEventHandler::OnFinishOpeningHandshake(
269 std::unique_ptr<net::WebSocketHandshakeResponseInfo> response) { 269 std::unique_ptr<net::WebSocketHandshakeResponseInfo> response) {
270 bool should_send = 270 bool should_send =
271 ChildProcessSecurityPolicyImpl::GetInstance()->CanReadRawCookies( 271 ChildProcessSecurityPolicyImpl::GetInstance()->CanReadRawCookies(
272 impl_->delegate_->GetClientProcessId()); 272 impl_->delegate_->GetClientProcessId());
273 273
274 DVLOG(3) << "WebSocketEventHandler::OnFinishOpeningHandshake " 274 DVLOG(3) << "WebSocketEventHandler::OnFinishOpeningHandshake "
275 << reinterpret_cast<void*>(this) << " should_send=" << should_send; 275 << reinterpret_cast<void*>(this) << " should_send=" << should_send;
276 276
277 if (!should_send) 277 if (!should_send)
278 return WebSocketEventInterface::CHANNEL_ALIVE; 278 return WebSocketEventInterface::CHANNEL_ALIVE;
279 279
280 mojom::WebSocketHandshakeResponsePtr response_to_pass( 280 blink::mojom::WebSocketHandshakeResponsePtr response_to_pass(
281 mojom::WebSocketHandshakeResponse::New()); 281 blink::mojom::WebSocketHandshakeResponse::New());
282 response_to_pass->url.Swap(&response->url); 282 response_to_pass->url.Swap(&response->url);
283 response_to_pass->status_code = response->status_code; 283 response_to_pass->status_code = response->status_code;
284 response_to_pass->status_text = response->status_text; 284 response_to_pass->status_text = response->status_text;
285 size_t iter = 0; 285 size_t iter = 0;
286 std::string name, value; 286 std::string name, value;
287 while (response->headers->EnumerateHeaderLines(&iter, &name, &value)) { 287 while (response->headers->EnumerateHeaderLines(&iter, &name, &value)) {
288 mojom::HttpHeaderPtr header(mojom::HttpHeader::New()); 288 blink::mojom::HttpHeaderPtr header(blink::mojom::HttpHeader::New());
289 header->name = name; 289 header->name = name;
290 header->value = value; 290 header->value = value;
291 response_to_pass->headers.push_back(std::move(header)); 291 response_to_pass->headers.push_back(std::move(header));
292 } 292 }
293 response_to_pass->headers_text = 293 response_to_pass->headers_text =
294 net::HttpUtil::ConvertHeadersBackToHTTPResponse( 294 net::HttpUtil::ConvertHeadersBackToHTTPResponse(
295 response->headers->raw_headers()); 295 response->headers->raw_headers());
296 296
297 impl_->client_->OnFinishOpeningHandshake(std::move(response_to_pass)); 297 impl_->client_->OnFinishOpeningHandshake(std::move(response_to_pass));
298 298
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 } 344 }
345 345
346 void WebSocketImpl::WebSocketEventHandler::SSLErrorHandlerDelegate:: 346 void WebSocketImpl::WebSocketEventHandler::SSLErrorHandlerDelegate::
347 ContinueSSLRequest() { 347 ContinueSSLRequest() {
348 DVLOG(3) << "SSLErrorHandlerDelegate::ContinueSSLRequest"; 348 DVLOG(3) << "SSLErrorHandlerDelegate::ContinueSSLRequest";
349 callbacks_->ContinueSSLRequest(); 349 callbacks_->ContinueSSLRequest();
350 } 350 }
351 351
352 WebSocketImpl::WebSocketImpl( 352 WebSocketImpl::WebSocketImpl(
353 Delegate* delegate, 353 Delegate* delegate,
354 mojom::WebSocketRequest request, 354 blink::mojom::WebSocketRequest request,
355 int frame_id, 355 int frame_id,
356 base::TimeDelta delay) 356 base::TimeDelta delay)
357 : delegate_(delegate), 357 : delegate_(delegate),
358 binding_(this, std::move(request)), 358 binding_(this, std::move(request)),
359 delay_(delay), 359 delay_(delay),
360 pending_flow_control_quota_(0), 360 pending_flow_control_quota_(0),
361 frame_id_(frame_id), 361 frame_id_(frame_id),
362 handshake_succeeded_(false), 362 handshake_succeeded_(false),
363 weak_ptr_factory_(this) { 363 weak_ptr_factory_(this) {
364 binding_.set_connection_error_handler( 364 binding_.set_connection_error_handler(
365 base::Bind(&WebSocketImpl::OnConnectionError, base::Unretained(this))); 365 base::Bind(&WebSocketImpl::OnConnectionError, base::Unretained(this)));
366 } 366 }
367 367
368 WebSocketImpl::~WebSocketImpl() {} 368 WebSocketImpl::~WebSocketImpl() {}
369 369
370 void WebSocketImpl::GoAway() { 370 void WebSocketImpl::GoAway() {
371 StartClosingHandshake(static_cast<uint16_t>(net::kWebSocketErrorGoingAway), 371 StartClosingHandshake(static_cast<uint16_t>(net::kWebSocketErrorGoingAway),
372 ""); 372 "");
373 } 373 }
374 374
375 void WebSocketImpl::AddChannelRequest( 375 void WebSocketImpl::AddChannelRequest(
376 const GURL& socket_url, 376 const GURL& socket_url,
377 mojo::Array<mojo::String> requested_protocols_mojo, 377 const std::vector<std::string>& requested_protocols,
378 const url::Origin& origin, 378 const url::Origin& origin,
379 const GURL& first_party_for_cookies, 379 const GURL& first_party_for_cookies,
380 const mojo::String& user_agent_override, 380 const std::string& user_agent_override,
381 mojom::WebSocketClientPtr client) { 381 blink::mojom::WebSocketClientPtr client) {
382 // Convert to STL types.
383 std::vector<std::string> requested_protocols(
384 requested_protocols_mojo.begin(),
385 requested_protocols_mojo.end());
386
387 DVLOG(3) << "WebSocketImpl::AddChannelRequest @" 382 DVLOG(3) << "WebSocketImpl::AddChannelRequest @"
388 << reinterpret_cast<void*>(this) 383 << reinterpret_cast<void*>(this)
389 << " socket_url=\"" << socket_url << "\" requested_protocols=\"" 384 << " socket_url=\"" << socket_url << "\" requested_protocols=\""
390 << base::JoinString(requested_protocols, ", ") 385 << base::JoinString(requested_protocols, ", ")
391 << "\" origin=\"" << origin 386 << "\" origin=\"" << origin
392 << "\" first_party_for_cookies=\"" << first_party_for_cookies 387 << "\" first_party_for_cookies=\"" << first_party_for_cookies
393 << "\" user_agent_override=\"" << user_agent_override 388 << "\" user_agent_override=\"" << user_agent_override
394 << "\""; 389 << "\"";
395 390
396 if (client_ || !client) { 391 if (client_ || !client) {
(...skipping 16 matching lines...) Expand all
413 origin, 408 origin,
414 first_party_for_cookies, 409 first_party_for_cookies,
415 user_agent_override), 410 user_agent_override),
416 delay_); 411 delay_);
417 } else { 412 } else {
418 AddChannel(socket_url, requested_protocols, origin, first_party_for_cookies, 413 AddChannel(socket_url, requested_protocols, origin, first_party_for_cookies,
419 user_agent_override); 414 user_agent_override);
420 } 415 }
421 } 416 }
422 417
423 void WebSocketImpl::SendFrame(bool fin, mojom::WebSocketMessageType type, 418 void WebSocketImpl::SendFrame(bool fin, blink::mojom::WebSocketMessageType type,
424 mojo::Array<uint8_t> data) { 419 const std::vector<uint8_t>& data) {
425 DVLOG(3) << "WebSocketImpl::SendFrame @" 420 DVLOG(3) << "WebSocketImpl::SendFrame @"
426 << reinterpret_cast<void*>(this) << " fin=" << fin 421 << reinterpret_cast<void*>(this) << " fin=" << fin
427 << " type=" << type << " data is " << data.size() << " bytes"; 422 << " type=" << type << " data is " << data.size() << " bytes";
428 423
429 if (!channel_) { 424 if (!channel_) {
430 // The client should not be sending us frames until after we've informed 425 // The client should not be sending us frames until after we've informed
431 // it that the channel has been opened (OnAddChannelResponse). 426 // it that the channel has been opened (OnAddChannelResponse).
432 if (handshake_succeeded_) { 427 if (handshake_succeeded_) {
433 DVLOG(1) << "Dropping frame sent to closed websocket"; 428 DVLOG(1) << "Dropping frame sent to closed websocket";
434 } else { 429 } else {
(...skipping 20 matching lines...) Expand all
455 // per-renderer WebSocket throttling. 450 // per-renderer WebSocket throttling.
456 // SendFlowControl() is called after WebSocketChannel is created. 451 // SendFlowControl() is called after WebSocketChannel is created.
457 pending_flow_control_quota_ += quota; 452 pending_flow_control_quota_ += quota;
458 return; 453 return;
459 } 454 }
460 455
461 ignore_result(channel_->SendFlowControl(quota)); 456 ignore_result(channel_->SendFlowControl(quota));
462 } 457 }
463 458
464 void WebSocketImpl::StartClosingHandshake(uint16_t code, 459 void WebSocketImpl::StartClosingHandshake(uint16_t code,
465 const mojo::String& reason) { 460 const std::string& reason) {
466 DVLOG(3) << "WebSocketImpl::StartClosingHandshake @" 461 DVLOG(3) << "WebSocketImpl::StartClosingHandshake @"
467 << reinterpret_cast<void*>(this) 462 << reinterpret_cast<void*>(this)
468 << " code=" << code << " reason=\"" << reason << "\""; 463 << " code=" << code << " reason=\"" << reason << "\"";
469 464
470 if (!channel_) { 465 if (!channel_) {
471 // WebSocketChannel is not yet created due to the delay introduced by 466 // WebSocketChannel is not yet created due to the delay introduced by
472 // per-renderer WebSocket throttling. 467 // per-renderer WebSocket throttling.
473 if (client_) 468 if (client_)
474 client_->OnDropChannel(false, net::kWebSocketErrorAbnormalClosure, ""); 469 client_->OnDropChannel(false, net::kWebSocketErrorAbnormalClosure, "");
475 return; 470 return;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 net::HttpRequestHeaders::kUserAgent, 522 net::HttpRequestHeaders::kUserAgent,
528 user_agent_override.c_str()); 523 user_agent_override.c_str());
529 } 524 }
530 channel_->SendAddChannelRequest(socket_url, requested_protocols, origin, 525 channel_->SendAddChannelRequest(socket_url, requested_protocols, origin,
531 first_party_for_cookies, additional_headers); 526 first_party_for_cookies, additional_headers);
532 if (quota > 0) 527 if (quota > 0)
533 SendFlowControl(quota); 528 SendFlowControl(quota);
534 } 529 }
535 530
536 } // namespace content 531 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/websockets/websocket_impl.h ('k') | content/browser/websockets/websocket_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698