| Index: net/websockets/websocket_extension_parser.cc
|
| diff --git a/net/websockets/websocket_extension_parser.cc b/net/websockets/websocket_extension_parser.cc
|
| index 109d330c3a1ff8e5f2396e3573177c79a03017b9..b737d5eab6fb9fc18577d3bdc2451fc8a8e77426 100644
|
| --- a/net/websockets/websocket_extension_parser.cc
|
| +++ b/net/websockets/websocket_extension_parser.cc
|
| @@ -12,100 +12,102 @@ WebSocketExtensionParser::WebSocketExtensionParser() {}
|
|
|
| WebSocketExtensionParser::~WebSocketExtensionParser() {}
|
|
|
| -void WebSocketExtensionParser::Parse(const char* data, size_t size) {
|
| +bool WebSocketExtensionParser::Parse(const char* data, size_t size) {
|
| current_ = data;
|
| end_ = data + size;
|
| - has_error_ = false;
|
| extensions_.clear();
|
|
|
| + bool failed = false;
|
| +
|
| while (true) {
|
| WebSocketExtension extension;
|
| - ConsumeExtension(&extension);
|
| - if (has_error_)
|
| + if (!ConsumeExtension(&extension)) {
|
| + failed = true;
|
| break;
|
| + }
|
| extensions_.push_back(extension);
|
|
|
| ConsumeSpaces();
|
| - DCHECK(!has_error_);
|
|
|
| if (!ConsumeIfMatch(',')) {
|
| break;
|
| }
|
| }
|
|
|
| - has_error_ = has_error_ || current_ != end_;
|
| - if (has_error_)
|
| - extensions_.clear();
|
| + if (!failed && current_ == end_)
|
| + return true;
|
| +
|
| + extensions_.clear();
|
| + return false;
|
| }
|
|
|
| -void WebSocketExtensionParser::Consume(char c) {
|
| - DCHECK(!has_error_);
|
| +bool WebSocketExtensionParser::Consume(char c) {
|
| ConsumeSpaces();
|
| - DCHECK(!has_error_);
|
| if (current_ == end_ || c != current_[0]) {
|
| - has_error_ = true;
|
| - return;
|
| + return false;
|
| }
|
| ++current_;
|
| + return true;
|
| }
|
|
|
| -void WebSocketExtensionParser::ConsumeExtension(WebSocketExtension* extension) {
|
| - DCHECK(!has_error_);
|
| +bool WebSocketExtensionParser::ConsumeExtension(WebSocketExtension* extension) {
|
| base::StringPiece name;
|
| - ConsumeToken(&name);
|
| - if (has_error_) return;
|
| + if (!ConsumeToken(&name))
|
| + return false;
|
| *extension = WebSocketExtension(name.as_string());
|
|
|
| while (ConsumeIfMatch(';')) {
|
| WebSocketExtension::Parameter parameter((std::string()));
|
| - ConsumeExtensionParameter(¶meter);
|
| - if (has_error_) return;
|
| + if (!ConsumeExtensionParameter(¶meter))
|
| + return false;
|
| extension->Add(parameter);
|
| }
|
| +
|
| + return true;
|
| }
|
|
|
| -void WebSocketExtensionParser::ConsumeExtensionParameter(
|
| +bool WebSocketExtensionParser::ConsumeExtensionParameter(
|
| WebSocketExtension::Parameter* parameter) {
|
| - DCHECK(!has_error_);
|
| base::StringPiece name, value;
|
| std::string value_string;
|
|
|
| - ConsumeToken(&name);
|
| - if (has_error_) return;
|
| + if (!ConsumeToken(&name))
|
| + return false;
|
| +
|
| if (!ConsumeIfMatch('=')) {
|
| *parameter = WebSocketExtension::Parameter(name.as_string());
|
| - return;
|
| + return true;
|
| }
|
|
|
| if (Lookahead('\"')) {
|
| - ConsumeQuotedToken(&value_string);
|
| + if (!ConsumeQuotedToken(&value_string))
|
| + return false;
|
| } else {
|
| - ConsumeToken(&value);
|
| + if (!ConsumeToken(&value))
|
| + return false;
|
| value_string = value.as_string();
|
| }
|
| - if (has_error_) return;
|
| *parameter = WebSocketExtension::Parameter(name.as_string(), value_string);
|
| + return true;
|
| }
|
|
|
| -void WebSocketExtensionParser::ConsumeToken(base::StringPiece* token) {
|
| - DCHECK(!has_error_);
|
| +bool WebSocketExtensionParser::ConsumeToken(base::StringPiece* token) {
|
| ConsumeSpaces();
|
| - DCHECK(!has_error_);
|
| const char* head = current_;
|
| while (current_ < end_ &&
|
| !IsControl(current_[0]) && !IsSeparator(current_[0]))
|
| ++current_;
|
| if (current_ == head) {
|
| - has_error_ = true;
|
| - return;
|
| + return false;
|
| }
|
| *token = base::StringPiece(head, current_ - head);
|
| + return true;
|
| }
|
|
|
| -void WebSocketExtensionParser::ConsumeQuotedToken(std::string* token) {
|
| - DCHECK(!has_error_);
|
| - Consume('"');
|
| - if (has_error_) return;
|
| +bool WebSocketExtensionParser::ConsumeQuotedToken(std::string* token) {
|
| + if (!Consume('"'))
|
| + return false;
|
| +
|
| *token = "";
|
| while (current_ < end_ && !IsControl(current_[0])) {
|
| if (UnconsumedBytes() >= 2 && current_[0] == '\\') {
|
| @@ -121,41 +123,34 @@ void WebSocketExtensionParser::ConsumeQuotedToken(std::string* token) {
|
| }
|
| }
|
| // We can't use Consume here because we don't want to consume spaces.
|
| - if (current_ < end_ && current_[0] == '"')
|
| - ++current_;
|
| - else
|
| - has_error_ = true;
|
| - has_error_ = has_error_ || token->empty();
|
| + if (current_ >= end_ || current_[0] != '"')
|
| + return false;
|
| +
|
| + ++current_;
|
| +
|
| + return !token->empty();
|
| }
|
|
|
| void WebSocketExtensionParser::ConsumeSpaces() {
|
| - DCHECK(!has_error_);
|
| while (current_ < end_ && (current_[0] == ' ' || current_[0] == '\t'))
|
| ++current_;
|
| return;
|
| }
|
|
|
| bool WebSocketExtensionParser::Lookahead(char c) {
|
| - DCHECK(!has_error_);
|
| const char* head = current_;
|
| -
|
| - Consume(c);
|
| - bool result = !has_error_;
|
| + bool result = Consume(c);
|
| current_ = head;
|
| - has_error_ = false;
|
| return result;
|
| }
|
|
|
| bool WebSocketExtensionParser::ConsumeIfMatch(char c) {
|
| - DCHECK(!has_error_);
|
| const char* head = current_;
|
| -
|
| - Consume(c);
|
| - if (has_error_) {
|
| + if (!Consume(c)) {
|
| current_ = head;
|
| - has_error_ = false;
|
| return false;
|
| }
|
| +
|
| return true;
|
| }
|
|
|
|
|