Index: net/websockets/websocket_extension_parser.cc |
diff --git a/net/websockets/websocket_extension_parser.cc b/net/websockets/websocket_extension_parser.cc |
index b737d5eab6fb9fc18577d3bdc2451fc8a8e77426..98e3f76e7b8c8ac3d89eb58e851c18f4755c10dd 100644 |
--- a/net/websockets/websocket_extension_parser.cc |
+++ b/net/websockets/websocket_extension_parser.cc |
@@ -5,9 +5,16 @@ |
#include "net/websockets/websocket_extension_parser.h" |
#include "base/strings/string_util.h" |
+#include "net/http/http_util.h" |
namespace net { |
+namespace { |
+bool IsControl(char c) { |
+ return (0 <= c && c <= 31) || c == 127; |
+} |
+} // namespace |
+ |
WebSocketExtensionParser::WebSocketExtensionParser() {} |
WebSocketExtensionParser::~WebSocketExtensionParser() {} |
@@ -19,7 +26,7 @@ bool WebSocketExtensionParser::Parse(const char* data, size_t size) { |
bool failed = false; |
- while (true) { |
+ do { |
WebSocketExtension extension; |
if (!ConsumeExtension(&extension)) { |
failed = true; |
@@ -28,11 +35,7 @@ bool WebSocketExtensionParser::Parse(const char* data, size_t size) { |
extensions_.push_back(extension); |
ConsumeSpaces(); |
- |
- if (!ConsumeIfMatch(',')) { |
- break; |
- } |
- } |
+ } while (ConsumeIfMatch(',')); |
if (!failed && current_ == end_) |
return true; |
@@ -43,9 +46,8 @@ bool WebSocketExtensionParser::Parse(const char* data, size_t size) { |
bool WebSocketExtensionParser::Consume(char c) { |
ConsumeSpaces(); |
- if (current_ == end_ || c != current_[0]) { |
+ if (current_ == end_ || c != *current_) |
return false; |
- } |
++current_; |
return true; |
} |
@@ -94,12 +96,10 @@ bool WebSocketExtensionParser::ConsumeExtensionParameter( |
bool WebSocketExtensionParser::ConsumeToken(base::StringPiece* token) { |
ConsumeSpaces(); |
const char* head = current_; |
- while (current_ < end_ && |
- !IsControl(current_[0]) && !IsSeparator(current_[0])) |
+ while (current_ < end_ && HttpUtil::IsTokenChar(*current_)) |
++current_; |
- if (current_ == head) { |
+ if (current_ == head) |
return false; |
- } |
*token = base::StringPiece(head, current_ - head); |
return true; |
} |
@@ -109,21 +109,22 @@ bool WebSocketExtensionParser::ConsumeQuotedToken(std::string* token) { |
return false; |
*token = ""; |
- while (current_ < end_ && !IsControl(current_[0])) { |
- if (UnconsumedBytes() >= 2 && current_[0] == '\\') { |
- char next = current_[1]; |
- if (IsControl(next) || IsSeparator(next)) break; |
- *token += next; |
- current_ += 2; |
- } else if (IsSeparator(current_[0])) { |
- break; |
+ while (current_ < end_ && !IsControl(*current_)) { |
tyoshino (SeeGerritForStatus)
2016/09/16 04:44:23
we can remove this IsControl() call?
Adam Rice
2016/09/16 05:57:56
Yes! I didn't notice that during refactoring it ha
|
+ if (*current_ == '\\') { |
tyoshino (SeeGerritForStatus)
2016/09/16 04:44:23
good catch
|
+ ++current_; |
+ if (current_ == end_ || !HttpUtil::IsTokenChar(*current_)) |
+ return false; |
+ *token += *current_; |
+ ++current_; |
} else { |
- *token += current_[0]; |
+ if (!HttpUtil::IsTokenChar(*current_)) |
+ break; |
tyoshino (SeeGerritForStatus)
2016/09/16 04:44:23
we can return with false here too?
Adam Rice
2016/09/16 05:57:56
I tried it but it doesn't work. If the character i
tyoshino (SeeGerritForStatus)
2016/09/16 06:44:23
Got it!
|
+ *token += *current_; |
++current_; |
} |
} |
// We can't use Consume here because we don't want to consume spaces. |
- if (current_ >= end_ || current_[0] != '"') |
+ if (current_ >= end_ || *current_ != '"') |
return false; |
++current_; |
@@ -132,7 +133,7 @@ bool WebSocketExtensionParser::ConsumeQuotedToken(std::string* token) { |
} |
void WebSocketExtensionParser::ConsumeSpaces() { |
- while (current_ < end_ && (current_[0] == ' ' || current_[0] == '\t')) |
+ while (current_ < end_ && (*current_ == ' ' || *current_ == '\t')) |
++current_; |
return; |
} |
@@ -154,15 +155,4 @@ bool WebSocketExtensionParser::ConsumeIfMatch(char c) { |
return true; |
} |
-// static |
-bool WebSocketExtensionParser::IsControl(char c) { |
- return (0 <= c && c <= 31) || c == 127; |
-} |
- |
-// static |
-bool WebSocketExtensionParser::IsSeparator(char c) { |
- const char separators[] = "()<>@,;:\\\"/[]?={} \t"; |
- return strchr(separators, c) != NULL; |
-} |
- |
} // namespace net |