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

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

Issue 2845033002: Avoid sending double responding close control frames in WebSockets (Closed)
Patch Set: const -> constexpr Created 3 years, 7 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
« no previous file with comments | « no previous file | net/websockets/websocket_channel_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <limits.h> // for INT_MAX 7 #include <limits.h> // for INT_MAX
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 return CHANNEL_DELETED; 470 return CHANNEL_DELETED;
471 if (bytes_to_send < data_size) { 471 if (bytes_to_send < data_size) {
472 front.DidConsume(bytes_to_send); 472 front.DidConsume(bytes_to_send);
473 front.ResetOpcode(); 473 front.ResetOpcode();
474 return CHANNEL_ALIVE; 474 return CHANNEL_ALIVE;
475 } 475 }
476 quota -= bytes_to_send; 476 quota -= bytes_to_send;
477 477
478 pending_received_frames_.pop(); 478 pending_received_frames_.pop();
479 } 479 }
480 if (pending_received_frames_.empty() && has_received_close_frame_) { 480 if (!InClosingState() && pending_received_frames_.empty() &&
481 has_received_close_frame_) {
481 // We've been waiting for the client to consume the frames before 482 // We've been waiting for the client to consume the frames before
482 // responding to the closing handshake initiated by the server. 483 // responding to the closing handshake initiated by the server.
483 return RespondToClosingHandshake(); 484 return RespondToClosingHandshake();
484 } 485 }
485 486
486 // If current_receive_quota_ == 0 then there is no pending ReadFrames() 487 // If current_receive_quota_ == 0 then there is no pending ReadFrames()
487 // operation. 488 // operation.
488 const bool start_read = 489 const bool start_read =
489 current_receive_quota_ == 0 && quota > 0 && 490 current_receive_quota_ == 0 && quota > 0 &&
490 (state_ == CONNECTED || state_ == SEND_CLOSED || state_ == CLOSE_WAIT); 491 (state_ == CONNECTED || state_ == SEND_CLOSED || state_ == CLOSE_WAIT);
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
1196 } 1197 }
1197 1198
1198 void WebSocketChannel::CloseTimeout() { 1199 void WebSocketChannel::CloseTimeout() {
1199 stream_->Close(); 1200 stream_->Close();
1200 SetState(CLOSED); 1201 SetState(CLOSED);
1201 DoDropChannel(false, kWebSocketErrorAbnormalClosure, ""); 1202 DoDropChannel(false, kWebSocketErrorAbnormalClosure, "");
1202 // |this| has been deleted. 1203 // |this| has been deleted.
1203 } 1204 }
1204 1205
1205 } // namespace net 1206 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/websockets/websocket_channel_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698