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_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 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <deque> | 10 #include <deque> |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 WebSocketChannel::WebSocketChannel( | 290 WebSocketChannel::WebSocketChannel( |
291 scoped_ptr<WebSocketEventInterface> event_interface, | 291 scoped_ptr<WebSocketEventInterface> event_interface, |
292 URLRequestContext* url_request_context) | 292 URLRequestContext* url_request_context) |
293 : event_interface_(event_interface.Pass()), | 293 : event_interface_(event_interface.Pass()), |
294 url_request_context_(url_request_context), | 294 url_request_context_(url_request_context), |
295 send_quota_low_water_mark_(kDefaultSendQuotaLowWaterMark), | 295 send_quota_low_water_mark_(kDefaultSendQuotaLowWaterMark), |
296 send_quota_high_water_mark_(kDefaultSendQuotaHighWaterMark), | 296 send_quota_high_water_mark_(kDefaultSendQuotaHighWaterMark), |
297 current_send_quota_(0), | 297 current_send_quota_(0), |
298 current_receive_quota_(0), | 298 current_receive_quota_(0), |
299 timeout_(base::TimeDelta::FromSeconds(kClosingHandshakeTimeoutSeconds)), | 299 timeout_(base::TimeDelta::FromSeconds(kClosingHandshakeTimeoutSeconds)), |
| 300 has_received_close_frame_(false), |
300 received_close_code_(0), | 301 received_close_code_(0), |
301 state_(FRESHLY_CONSTRUCTED), | 302 state_(FRESHLY_CONSTRUCTED), |
302 notification_sender_(new HandshakeNotificationSender(this)), | 303 notification_sender_(new HandshakeNotificationSender(this)), |
303 sending_text_message_(false), | 304 sending_text_message_(false), |
304 receiving_text_message_(false), | 305 receiving_text_message_(false), |
305 expecting_to_handle_continuation_(false), | 306 expecting_to_handle_continuation_(false), |
306 initial_frame_forwarded_(false) {} | 307 initial_frame_forwarded_(false) {} |
307 | 308 |
308 WebSocketChannel::~WebSocketChannel() { | 309 WebSocketChannel::~WebSocketChannel() { |
309 // The stream may hold a pointer to read_frames_, and so it needs to be | 310 // The stream may hold a pointer to read_frames_, and so it needs to be |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 default: | 738 default: |
738 DCHECK_LT(result, 0) | 739 DCHECK_LT(result, 0) |
739 << "ReadFrames() should only return OK or ERR_ codes"; | 740 << "ReadFrames() should only return OK or ERR_ codes"; |
740 | 741 |
741 stream_->Close(); | 742 stream_->Close(); |
742 SetState(CLOSED); | 743 SetState(CLOSED); |
743 | 744 |
744 uint16 code = kWebSocketErrorAbnormalClosure; | 745 uint16 code = kWebSocketErrorAbnormalClosure; |
745 std::string reason = ""; | 746 std::string reason = ""; |
746 bool was_clean = false; | 747 bool was_clean = false; |
747 if (received_close_code_ != 0) { | 748 if (has_received_close_frame_) { |
748 code = received_close_code_; | 749 code = received_close_code_; |
749 reason = received_close_reason_; | 750 reason = received_close_reason_; |
750 was_clean = (result == ERR_CONNECTION_CLOSED); | 751 was_clean = (result == ERR_CONNECTION_CLOSED); |
751 } | 752 } |
752 | 753 |
753 return DoDropChannel(was_clean, code, reason); | 754 return DoDropChannel(was_clean, code, reason); |
754 } | 755 } |
755 } | 756 } |
756 | 757 |
757 ChannelState WebSocketChannel::HandleFrame(scoped_ptr<WebSocketFrame> frame) { | 758 ChannelState WebSocketChannel::HandleFrame(scoped_ptr<WebSocketFrame> frame) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 switch (state_) { | 838 switch (state_) { |
838 case CONNECTED: | 839 case CONNECTED: |
839 SetState(RECV_CLOSED); | 840 SetState(RECV_CLOSED); |
840 if (SendClose(code, reason) == CHANNEL_DELETED) | 841 if (SendClose(code, reason) == CHANNEL_DELETED) |
841 return CHANNEL_DELETED; | 842 return CHANNEL_DELETED; |
842 DCHECK_EQ(RECV_CLOSED, state_); | 843 DCHECK_EQ(RECV_CLOSED, state_); |
843 SetState(CLOSE_WAIT); | 844 SetState(CLOSE_WAIT); |
844 | 845 |
845 if (event_interface_->OnClosingHandshake() == CHANNEL_DELETED) | 846 if (event_interface_->OnClosingHandshake() == CHANNEL_DELETED) |
846 return CHANNEL_DELETED; | 847 return CHANNEL_DELETED; |
| 848 has_received_close_frame_ = true; |
847 received_close_code_ = code; | 849 received_close_code_ = code; |
848 received_close_reason_ = reason; | 850 received_close_reason_ = reason; |
849 break; | 851 break; |
850 | 852 |
851 case SEND_CLOSED: | 853 case SEND_CLOSED: |
852 SetState(CLOSE_WAIT); | 854 SetState(CLOSE_WAIT); |
853 // From RFC6455 section 7.1.5: "Each endpoint | 855 // From RFC6455 section 7.1.5: "Each endpoint |
854 // will see the status code sent by the other end as _The WebSocket | 856 // will see the status code sent by the other end as _The WebSocket |
855 // Connection Close Code_." | 857 // Connection Close Code_." |
| 858 has_received_close_frame_ = true; |
856 received_close_code_ = code; | 859 received_close_code_ = code; |
857 received_close_reason_ = reason; | 860 received_close_reason_ = reason; |
858 break; | 861 break; |
859 | 862 |
860 default: | 863 default: |
861 LOG(DFATAL) << "Got Close in unexpected state " << state_; | 864 LOG(DFATAL) << "Got Close in unexpected state " << state_; |
862 break; | 865 break; |
863 } | 866 } |
864 return CHANNEL_ALIVE; | 867 return CHANNEL_ALIVE; |
865 } | 868 } |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 } | 1103 } |
1101 | 1104 |
1102 void WebSocketChannel::CloseTimeout() { | 1105 void WebSocketChannel::CloseTimeout() { |
1103 stream_->Close(); | 1106 stream_->Close(); |
1104 SetState(CLOSED); | 1107 SetState(CLOSED); |
1105 DoDropChannel(false, kWebSocketErrorAbnormalClosure, ""); | 1108 DoDropChannel(false, kWebSocketErrorAbnormalClosure, ""); |
1106 // |this| has been deleted. | 1109 // |this| has been deleted. |
1107 } | 1110 } |
1108 | 1111 |
1109 } // namespace net | 1112 } // namespace net |
OLD | NEW |