websocket_extension.cc 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Copyright 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/websockets/websocket_extension.h"
  5. #include <map>
  6. #include <string>
  7. #include <utility>
  8. #include "base/check.h"
  9. #include "net/http/http_util.h"
  10. namespace net {
  11. WebSocketExtension::Parameter::Parameter(const std::string& name)
  12. : name_(name) {}
  13. WebSocketExtension::Parameter::Parameter(const std::string& name,
  14. const std::string& value)
  15. : name_(name), value_(value) {
  16. DCHECK(!value.empty());
  17. // |extension-param| must be a token.
  18. DCHECK(HttpUtil::IsToken(value));
  19. }
  20. bool WebSocketExtension::Parameter::Equals(const Parameter& other) const {
  21. return name_ == other.name_ && value_ == other.value_;
  22. }
  23. WebSocketExtension::WebSocketExtension() = default;
  24. WebSocketExtension::WebSocketExtension(const std::string& name)
  25. : name_(name) {}
  26. WebSocketExtension::WebSocketExtension(const WebSocketExtension& other) =
  27. default;
  28. WebSocketExtension::~WebSocketExtension() = default;
  29. bool WebSocketExtension::Equals(const WebSocketExtension& other) const {
  30. if (name_ != other.name_) return false;
  31. if (parameters_.size() != other.parameters_.size()) return false;
  32. std::multimap<std::string, std::string> this_parameters, other_parameters;
  33. for (const auto& p : parameters_) {
  34. this_parameters.insert(std::make_pair(p.name(), p.value()));
  35. }
  36. for (const auto& p : other.parameters_) {
  37. other_parameters.insert(std::make_pair(p.name(), p.value()));
  38. }
  39. return this_parameters == other_parameters;
  40. }
  41. std::string WebSocketExtension::ToString() const {
  42. if (name_.empty())
  43. return std::string();
  44. std::string result = name_;
  45. for (const auto& param : parameters_) {
  46. result += "; " + param.name();
  47. if (!param.HasValue())
  48. continue;
  49. // |extension-param| must be a token and we don't need to quote it.
  50. DCHECK(HttpUtil::IsToken(param.value()));
  51. result += "=" + param.value();
  52. }
  53. return result;
  54. }
  55. } // namespace net