OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/server/web_socket.h" | 5 #include "net/server/web_socket.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/sha1.h" | 9 #include "base/sha1.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/sys_byteorder.h" | 12 #include "base/sys_byteorder.h" |
13 #include "net/server/http_connection.h" | 13 #include "net/server/http_connection.h" |
14 #include "net/server/http_server.h" | 14 #include "net/server/http_server.h" |
15 #include "net/server/http_server_request_info.h" | 15 #include "net/server/http_server_request_info.h" |
16 #include "net/server/http_server_response_info.h" | 16 #include "net/server/http_server_response_info.h" |
17 #include "net/server/web_socket_encoder.h" | 17 #include "net/server/web_socket_encoder.h" |
18 | 18 |
19 namespace net { | 19 namespace net { |
20 | 20 |
21 WebSocket::WebSocket(HttpServer* server, | 21 WebSocket::WebSocket(HttpServer* server, |
22 HttpConnection* connection, | 22 HttpConnection* connection, |
23 const HttpServerRequestInfo& request, | 23 const HttpServerRequestInfo& request) |
24 size_t* pos) | |
25 : server_(server), connection_(connection), closed_(false) { | 24 : server_(server), connection_(connection), closed_(false) { |
26 std::string request_extensions = | 25 std::string request_extensions = |
27 request.GetHeaderValue("sec-websocket-extensions"); | 26 request.GetHeaderValue("sec-websocket-extensions"); |
28 encoder_.reset(WebSocketEncoder::CreateServer(request_extensions, | 27 encoder_.reset(WebSocketEncoder::CreateServer(request_extensions, |
29 &response_extensions_)); | 28 &response_extensions_)); |
30 if (!response_extensions_.empty()) { | 29 if (!response_extensions_.empty()) { |
31 response_extensions_ = | 30 response_extensions_ = |
32 "Sec-WebSocket-Extensions: " + response_extensions_ + "\r\n"; | 31 "Sec-WebSocket-Extensions: " + response_extensions_ + "\r\n"; |
33 } | 32 } |
34 } | 33 } |
35 | 34 |
36 WebSocket::~WebSocket() {} | 35 WebSocket::~WebSocket() {} |
37 | 36 |
38 WebSocket* WebSocket::CreateWebSocket(HttpServer* server, | 37 WebSocket* WebSocket::CreateWebSocket(HttpServer* server, |
39 HttpConnection* connection, | 38 HttpConnection* connection, |
40 const HttpServerRequestInfo& request, | 39 const HttpServerRequestInfo& request) { |
41 size_t* pos) { | |
42 std::string version = request.GetHeaderValue("sec-websocket-version"); | 40 std::string version = request.GetHeaderValue("sec-websocket-version"); |
43 if (version != "8" && version != "13") { | 41 if (version != "8" && version != "13") { |
44 server->SendResponse( | 42 server->SendResponse( |
45 connection->id(), | 43 connection->id(), |
46 HttpServerResponseInfo::CreateFor500( | 44 HttpServerResponseInfo::CreateFor500( |
47 "Invalid request format. The version is not valid.")); | 45 "Invalid request format. The version is not valid.")); |
48 return nullptr; | 46 return nullptr; |
49 } | 47 } |
50 | 48 |
51 std::string key = request.GetHeaderValue("sec-websocket-key"); | 49 std::string key = request.GetHeaderValue("sec-websocket-key"); |
52 if (key.empty()) { | 50 if (key.empty()) { |
53 server->SendResponse( | 51 server->SendResponse( |
54 connection->id(), | 52 connection->id(), |
55 HttpServerResponseInfo::CreateFor500( | 53 HttpServerResponseInfo::CreateFor500( |
56 "Invalid request format. Sec-WebSocket-Key is empty or isn't " | 54 "Invalid request format. Sec-WebSocket-Key is empty or isn't " |
57 "specified.")); | 55 "specified.")); |
58 return nullptr; | 56 return nullptr; |
59 } | 57 } |
60 return new WebSocket(server, connection, request, pos); | 58 return new WebSocket(server, connection, request); |
61 } | 59 } |
62 | 60 |
63 void WebSocket::Accept(const HttpServerRequestInfo& request) { | 61 void WebSocket::Accept(const HttpServerRequestInfo& request) { |
64 static const char* const kWebSocketGuid = | 62 static const char* const kWebSocketGuid = |
65 "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; | 63 "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; |
66 std::string key = request.GetHeaderValue("sec-websocket-key"); | 64 std::string key = request.GetHeaderValue("sec-websocket-key"); |
67 std::string data = base::StringPrintf("%s%s", key.c_str(), kWebSocketGuid); | 65 std::string data = base::StringPrintf("%s%s", key.c_str(), kWebSocketGuid); |
68 std::string encoded_hash; | 66 std::string encoded_hash; |
69 base::Base64Encode(base::SHA1HashString(data), &encoded_hash); | 67 base::Base64Encode(base::SHA1HashString(data), &encoded_hash); |
70 | 68 |
(...skipping 22 matching lines...) Expand all Loading... |
93 | 91 |
94 void WebSocket::Send(const std::string& message) { | 92 void WebSocket::Send(const std::string& message) { |
95 if (closed_) | 93 if (closed_) |
96 return; | 94 return; |
97 std::string encoded; | 95 std::string encoded; |
98 encoder_->EncodeFrame(message, 0, &encoded); | 96 encoder_->EncodeFrame(message, 0, &encoded); |
99 server_->SendRaw(connection_->id(), encoded); | 97 server_->SendRaw(connection_->id(), encoded); |
100 } | 98 } |
101 | 99 |
102 } // namespace net | 100 } // namespace net |
OLD | NEW |