| // Copyright 2013 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 "net/websockets/websocket_extension.h" |
| |
| #include <map> |
| #include <string> |
| |
| #include "base/logging.h" |
| #include "net/http/http_util.h" |
| |
| namespace net { |
| |
| WebSocketExtension::Parameter::Parameter(const std::string& name) |
| : name_(name) {} |
| |
| WebSocketExtension::Parameter::Parameter(const std::string& name, |
| const std::string& value) |
| : name_(name), value_(value) { |
| DCHECK(!value.empty()); |
| // |extension-param| must be a token. |
| DCHECK(HttpUtil::IsToken(value)); |
| } |
| |
| bool WebSocketExtension::Parameter::Equals(const Parameter& other) const { |
| return name_ == other.name_ && value_ == other.value_; |
| } |
| |
| WebSocketExtension::WebSocketExtension() {} |
| |
| WebSocketExtension::WebSocketExtension(const std::string& name) : name_(name) {} |
| |
| WebSocketExtension::WebSocketExtension(const WebSocketExtension& other) { |
| name_ = other.name_; |
| parameters_ = other.parameters_; |
| } |
| |
| WebSocketExtension::~WebSocketExtension() {} |
| |
| bool WebSocketExtension::Equals(const WebSocketExtension& other) const { |
| if (name_ != other.name_) |
| return false; |
| if (parameters_.size() != other.parameters_.size()) |
| return false; |
| |
| std::multimap<std::string, std::string> this_parameters, other_parameters; |
| for (std::vector<Parameter>::const_iterator iterator = parameters_.begin(); |
| iterator != parameters_.end(); ++iterator) { |
| const Parameter& p(*iterator); |
| this_parameters.insert(std::make_pair(p.name(), p.value())); |
| } |
| for (std::vector<Parameter>::const_iterator iterator = |
| other.parameters_.begin(); |
| iterator != other.parameters_.end(); ++iterator) { |
| const Parameter& p(*iterator); |
| other_parameters.insert(std::make_pair(p.name(), p.value())); |
| } |
| return this_parameters == other_parameters; |
| } |
| |
| std::string WebSocketExtension::ToString() const { |
| if (name_.empty()) |
| return std::string(); |
| |
| std::string result = name_; |
| |
| for (std::vector<Parameter>::const_iterator iterator = parameters_.begin(); |
| iterator != parameters_.end(); ++iterator) { |
| const Parameter& param(*iterator); |
| result += "; " + param.name(); |
| if (!param.HasValue()) |
| continue; |
| |
| // |extension-param| must be a token and we don't need to quote it. |
| DCHECK(HttpUtil::IsToken(param.value())); |
| result += "=" + param.value(); |
| } |
| return result; |
| } |
| |
| } // namespace net |