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

Unified Diff: chrome/browser/chromeos/web_socket_proxy_helper.cc

Issue 8586027: Move DNS resolution from websocket-to-TCP proxy to ExtensionFunction (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed Created 9 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/web_socket_proxy_helper.cc
diff --git a/chrome/browser/chromeos/web_socket_proxy_helper.cc b/chrome/browser/chromeos/web_socket_proxy_helper.cc
new file mode 100644
index 0000000000000000000000000000000000000000..8b7b6a9a6b5dbde7c64770912383fa2a6bce7d1b
--- /dev/null
+++ b/chrome/browser/chromeos/web_socket_proxy_helper.cc
@@ -0,0 +1,70 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/web_socket_proxy_helper.h"
+
+#include "base/string_number_conversions.h"
+#include "base/logging.h"
+
+namespace chromeos {
+
+// static
+bool WebSocketProxyHelper::FetchPassportAddrNamePort(
+ uint8* begin, uint8* end,
+ std::string* passport, std::string* addr,
+ std::string* hostname, int* port) {
+ std::string input(begin, end);
+
+ // At first, get rid of a colon at the end.
+ if (input.empty() || input[input.length() - 1] != ':')
+ return false;
+ input.erase(input.length() - 1);
+
+ // Fetch the passport from the start.
+ if (!FetchToken(true, false, &input, passport) || passport->empty())
+ return false;
+
+ // Fetch the IP address from the start. Match '['-brackets if presented.
+ if (!FetchToken(true, true, &input, addr))
+ return false;
+
+ // Fetch the port number from the end.
+ std::string port_str;
+ if (!FetchToken(false, false, &input, &port_str) || port_str.empty() ||
+ !base::StringToInt(port_str, port) ||
+ *port <= 0 || *port >= (1<<16))
+ return false;
+
+ // The hostname is everything remained.
+ if (input.length() < 2 || input[input.length() - 1] != ':')
+ return false;
+ hostname->assign(input, 0, input.length() - 1);
+
+ return true;
+}
+
+// static
+bool WebSocketProxyHelper::FetchToken(bool forward,
+ bool match_brackets,
+ std::string* input,
+ std::string* token ) {
+ if (input->empty()) {
+ token->clear();
+ } else {
+ std::string separator =
+ (forward && match_brackets && input->at(0) == '[') ? "]:" : ":";
+ size_t pos = forward ? input->find(separator) : input->rfind(separator);
+ if (pos != std::string::npos) {
+ size_t start = forward ? 0 : pos + 1;
+ size_t end = forward ? pos : input->length();
+ token->assign(*input, start, end - start + separator.length() - 1);
+ input->erase(start, end - start + separator.length());
+ } else {
+ return false;
+ }
+ }
+ return true;
+}
+
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698