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

Side by Side Diff: net/websockets/websocket_channel.cc

Issue 34753008: Notify WebSocket connection failure, chromium side (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 1 month 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 "net/websockets/websocket_channel.h" 5 #include "net/websockets/websocket_channel.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" // for size_t 9 #include "base/basictypes.h" // for size_t
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 return; 285 return;
286 286
287 // If a recoverable error condition existed, it would go here. 287 // If a recoverable error condition existed, it would go here.
288 288
289 default: 289 default:
290 DCHECK_LT(result, 0) 290 DCHECK_LT(result, 0)
291 << "WriteFrames() should only return OK or ERR_ codes"; 291 << "WriteFrames() should only return OK or ERR_ codes";
292 stream_->Close(); 292 stream_->Close();
293 if (state_ != CLOSED) { 293 if (state_ != CLOSED) {
294 state_ = CLOSED; 294 state_ = CLOSED;
295 event_interface_->OnDropChannel(kWebSocketErrorAbnormalClosure, 295 // TODO(yhirano): Set |fail| appropriately.
Adam Rice 2013/10/23 03:18:06 The OnDropChannel-calling code changes a bit in ht
yhirano 2013/10/23 05:42:23 OK, I will implement this in future CLs.
296 bool fail = false;
297 event_interface_->OnDropChannel(fail,
298 kWebSocketErrorAbnormalClosure,
296 "Abnormal Closure"); 299 "Abnormal Closure");
297 } 300 }
298 return; 301 return;
299 } 302 }
300 } 303 }
301 304
302 void WebSocketChannel::ReadFrames() { 305 void WebSocketChannel::ReadFrames() {
303 int result = OK; 306 int result = OK;
304 do { 307 do {
305 // This use of base::Unretained is safe because this object owns the 308 // This use of base::Unretained is safe because this object owns the
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 << "ReadFrames() should only return OK or ERR_ codes"; 352 << "ReadFrames() should only return OK or ERR_ codes";
350 stream_->Close(); 353 stream_->Close();
351 if (state_ != CLOSED) { 354 if (state_ != CLOSED) {
352 state_ = CLOSED; 355 state_ = CLOSED;
353 uint16 code = kWebSocketErrorAbnormalClosure; 356 uint16 code = kWebSocketErrorAbnormalClosure;
354 std::string reason = "Abnormal Closure"; 357 std::string reason = "Abnormal Closure";
355 if (closing_code_ != 0) { 358 if (closing_code_ != 0) {
356 code = closing_code_; 359 code = closing_code_;
357 reason = closing_reason_; 360 reason = closing_reason_;
358 } 361 }
359 event_interface_->OnDropChannel(code, reason); 362 // TODO(yhirano): Set |fail| appropriately.
363 bool fail = false;
364 event_interface_->OnDropChannel(fail, code, reason);
360 } 365 }
361 return; 366 return;
362 } 367 }
363 } 368 }
364 369
365 void WebSocketChannel::ProcessFrame(scoped_ptr<WebSocketFrame> frame) { 370 void WebSocketChannel::ProcessFrame(scoped_ptr<WebSocketFrame> frame) {
366 if (frame->header.masked) { 371 if (frame->header.masked) {
367 // RFC6455 Section 5.1 "A client MUST close a connection if it detects a 372 // RFC6455 Section 5.1 "A client MUST close a connection if it detects a
368 // masked frame." 373 // masked frame."
369 FailChannel(SEND_REAL_ERROR, 374 FailChannel(SEND_REAL_ERROR,
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 } 552 }
548 SendClose(send_code, send_reason); // Sets state_ to SEND_CLOSED 553 SendClose(send_code, send_reason); // Sets state_ to SEND_CLOSED
549 } 554 }
550 // Careful study of RFC6455 section 7.1.7 and 7.1.1 indicates the browser 555 // Careful study of RFC6455 section 7.1.7 and 7.1.1 indicates the browser
551 // should close the connection itself without waiting for the closing 556 // should close the connection itself without waiting for the closing
552 // handshake. 557 // handshake.
553 stream_->Close(); 558 stream_->Close();
554 state_ = CLOSED; 559 state_ = CLOSED;
555 560
556 if (old_state != CLOSED) { 561 if (old_state != CLOSED) {
557 event_interface_->OnDropChannel(code, reason); 562 // TODO(yhirano): Set |fail| appropriately.
563 bool fail = false;
564 event_interface_->OnDropChannel(fail, code, reason);
558 } 565 }
559 } 566 }
560 567
561 void WebSocketChannel::SendClose(uint16 code, const std::string& reason) { 568 void WebSocketChannel::SendClose(uint16 code, const std::string& reason) {
562 DCHECK(state_ == CONNECTED || state_ == RECV_CLOSED); 569 DCHECK(state_ == CONNECTED || state_ == RECV_CLOSED);
563 // TODO(ricea): Ensure reason.length() <= 123 570 // TODO(ricea): Ensure reason.length() <= 123
564 scoped_refptr<IOBuffer> body; 571 scoped_refptr<IOBuffer> body;
565 size_t size = 0; 572 size_t size = 0;
566 if (code == kWebSocketErrorNoStatusReceived) { 573 if (code == kWebSocketErrorNoStatusReceived) {
567 // Special case: translate kWebSocketErrorNoStatusReceived into a Close 574 // Special case: translate kWebSocketErrorNoStatusReceived into a Close
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 } 619 }
613 std::string text(data + kWebSocketCloseCodeLength, data + size); 620 std::string text(data + kWebSocketCloseCodeLength, data + size);
614 // TODO(ricea): Is this check strict enough? In particular, check the 621 // TODO(ricea): Is this check strict enough? In particular, check the
615 // "Security Considerations" from RFC3629. 622 // "Security Considerations" from RFC3629.
616 if (IsStringUTF8(text)) { 623 if (IsStringUTF8(text)) {
617 reason->swap(text); 624 reason->swap(text);
618 } 625 }
619 } 626 }
620 627
621 } // namespace net 628 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698