OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "webkit/plugins/ppapi/ppb_websocket_impl.h" | 5 #include "webkit/plugins/ppapi/ppb_websocket_impl.h" |
6 | 6 |
| 7 #include <set> |
7 #include <string> | 8 #include <string> |
8 | 9 |
9 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
10 #include "base/logging.h" | 11 #include "base/logging.h" |
11 #include "googleurl/src/gurl.h" | 12 #include "googleurl/src/gurl.h" |
12 #include "net/base/net_util.h" | 13 #include "net/base/net_util.h" |
13 #include "ppapi/c/pp_completion_callback.h" | 14 #include "ppapi/c/pp_completion_callback.h" |
14 #include "ppapi/c/pp_errors.h" | 15 #include "ppapi/c/pp_errors.h" |
15 #include "ppapi/c/pp_var.h" | 16 #include "ppapi/c/pp_var.h" |
16 #include "ppapi/c/ppb_var.h" | 17 #include "ppapi/c/ppb_var.h" |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 return PP_ERROR_BADARGUMENT; | 138 return PP_ERROR_BADARGUMENT; |
138 if (!gurl.SchemeIs("ws") && !gurl.SchemeIs("wss")) | 139 if (!gurl.SchemeIs("ws") && !gurl.SchemeIs("wss")) |
139 return PP_ERROR_BADARGUMENT; | 140 return PP_ERROR_BADARGUMENT; |
140 if (gurl.has_ref()) | 141 if (gurl.has_ref()) |
141 return PP_ERROR_BADARGUMENT; | 142 return PP_ERROR_BADARGUMENT; |
142 if (!net::IsPortAllowedByDefault(gurl.IntPort())) | 143 if (!net::IsPortAllowedByDefault(gurl.IntPort())) |
143 return PP_ERROR_BADARGUMENT; | 144 return PP_ERROR_BADARGUMENT; |
144 WebURL web_url(gurl); | 145 WebURL web_url(gurl); |
145 | 146 |
146 // Validate protocols and convert it to WebString. | 147 // Validate protocols and convert it to WebString. |
147 // TODO(toyoshim): Detect duplicated protocols as error. | |
148 std::string protocol_string; | 148 std::string protocol_string; |
| 149 std::set<std::string> protocol_set; |
149 for (uint32_t i = 0; i < protocol_count; i++) { | 150 for (uint32_t i = 0; i < protocol_count; i++) { |
150 // TODO(toyoshim): Similar function exist in WebKit::WebSocket. | 151 // TODO(toyoshim): Similar function exist in WebKit::WebSocket. |
151 // We must rearrange them into WebKit::WebChannel and share its protocol | 152 // We must rearrange them into WebKit::WebChannel and share its protocol |
152 // related implementation via WebKit API. | 153 // related implementation via WebKit API. |
153 scoped_refptr<StringVar> string_var; | 154 scoped_refptr<StringVar> string_var; |
154 string_var = StringVar::FromPPVar(protocols[i]); | 155 string_var = StringVar::FromPPVar(protocols[i]); |
| 156 |
| 157 // Check duplicated protocol entries. |
| 158 if (protocol_set.find(string_var->value()) != protocol_set.end()) |
| 159 return PP_ERROR_BADARGUMENT; |
| 160 protocol_set.insert(string_var->value()); |
| 161 |
| 162 // Check invalid and empty entries. |
155 if (!string_var || !string_var->value().length()) | 163 if (!string_var || !string_var->value().length()) |
156 return PP_ERROR_BADARGUMENT; | 164 return PP_ERROR_BADARGUMENT; |
| 165 |
| 166 // Check containing characters. |
157 for (std::string::const_iterator it = string_var->value().begin(); | 167 for (std::string::const_iterator it = string_var->value().begin(); |
158 it != string_var->value().end(); | 168 it != string_var->value().end(); |
159 ++it) { | 169 ++it) { |
160 uint8_t character = static_cast<uint8_t>(*it); | 170 uint8_t character = static_cast<uint8_t>(*it); |
161 // WebSocket specification says "(Subprotocol string must consist of) | 171 // WebSocket specification says "(Subprotocol string must consist of) |
162 // characters in the range U+0021 to U+007E not including separator | 172 // characters in the range U+0021 to U+007E not including separator |
163 // characters as defined in [RFC2616]." | 173 // characters as defined in [RFC2616]." |
164 const uint8_t minimumProtocolCharacter = '!'; // U+0021. | 174 const uint8_t minimumProtocolCharacter = '!'; // U+0021. |
165 const uint8_t maximumProtocolCharacter = '~'; // U+007E. | 175 const uint8_t maximumProtocolCharacter = '~'; // U+007E. |
166 if (character < minimumProtocolCharacter || | 176 if (character < minimumProtocolCharacter || |
167 character > maximumProtocolCharacter || | 177 character > maximumProtocolCharacter || |
168 character == '"' || character == '(' || character == ')' || | 178 character == '"' || character == '(' || character == ')' || |
169 character == ',' || character == '/' || | 179 character == ',' || character == '/' || |
170 (character >= ':' && character <= '@') || // U+003A - U+0040 | 180 (character >= ':' && character <= '@') || // U+003A - U+0040 |
171 (character >= '[' && character <= ']') || // U+005B - u+005D | 181 (character >= '[' && character <= ']') || // U+005B - u+005D |
172 character == '{' || character == '}') | 182 character == '{' || character == '}') |
173 return PP_ERROR_BADARGUMENT; | 183 return PP_ERROR_BADARGUMENT; |
174 } | 184 } |
| 185 // Join protocols with the comma separator. |
175 if (i != 0) | 186 if (i != 0) |
176 protocol_string.append(","); | 187 protocol_string.append(","); |
177 protocol_string.append(string_var->value()); | 188 protocol_string.append(string_var->value()); |
178 } | 189 } |
179 WebString web_protocols = WebString::fromUTF8(protocol_string); | 190 WebString web_protocols = WebString::fromUTF8(protocol_string); |
180 | 191 |
181 // Validate |callback| (Doesn't support blocking callback) | 192 // Validate |callback| (Doesn't support blocking callback) |
182 if (!callback.func) | 193 if (!callback.func) |
183 return PP_ERROR_BLOCKS_MAIN_THREAD; | 194 return PP_ERROR_BLOCKS_MAIN_THREAD; |
184 | 195 |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 | 498 |
488 *receive_callback_var_ = received_messages_.front(); | 499 *receive_callback_var_ = received_messages_.front(); |
489 received_messages_.pop(); | 500 received_messages_.pop(); |
490 receive_callback_var_ = NULL; | 501 receive_callback_var_ = NULL; |
491 wait_for_receive_ = false; | 502 wait_for_receive_ = false; |
492 return PP_OK; | 503 return PP_OK; |
493 } | 504 } |
494 | 505 |
495 } // namespace ppapi | 506 } // namespace ppapi |
496 } // namespace webkit | 507 } // namespace webkit |
OLD | NEW |