// Copyright (c) 2015 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. // This file contains data structures and utility functions used for serializing // and parsing alternative service header values, common to HTTP/1.1 header // fields and HTTP/2 and QUIC ALTSVC frames. See specification at // https://tools.ietf.org/id/draft-ietf-httpbis-alt-svc-06.html #ifndef NET_SPDY_SPDY_ALT_SVC_WIRE_FORMAT_H_ #define NET_SPDY_SPDY_ALT_SVC_WIRE_FORMAT_H_ #include #include "base/basictypes.h" #include "base/strings/string_piece.h" #include "net/base/net_export.h" using base::StringPiece; namespace net { namespace test { class SpdyAltSvcWireFormatPeer; } // namespace test class NET_EXPORT_PRIVATE SpdyAltSvcWireFormat { public: struct AlternativeService { std::string protocol_id; std::string host; uint16 port; uint32 max_age; double p; AlternativeService() = default; AlternativeService(const std::string& protocol_id, const std::string& host, uint16 port, uint32 max_age, double p) : protocol_id(protocol_id), host(host), port(port), max_age(max_age), p(p) {} bool operator==(const AlternativeService& other) const { return protocol_id == other.protocol_id && host == other.host && port == other.port && max_age == other.max_age && p == other.p; } }; typedef std::vector AlternativeServiceVector; friend class test::SpdyAltSvcWireFormatPeer; static bool ParseHeaderFieldValue(StringPiece value, AlternativeServiceVector* altsvc_vector); static std::string SerializeHeaderFieldValue( const AlternativeServiceVector& altsvc_vector); private: static void SkipWhiteSpace(StringPiece::const_iterator* c, StringPiece::const_iterator end); static bool PercentDecode(StringPiece::const_iterator c, StringPiece::const_iterator end, std::string* output); static bool ParseAltAuthority(StringPiece::const_iterator c, StringPiece::const_iterator end, std::string* host, uint16* port); static bool ParsePositiveInteger16(StringPiece::const_iterator c, StringPiece::const_iterator end, uint16* value); static bool ParsePositiveInteger32(StringPiece::const_iterator c, StringPiece::const_iterator end, uint32* value); static bool ParseProbability(StringPiece::const_iterator c, StringPiece::const_iterator end, double* p); }; } // namespace net #endif // NET_SPDY_SPDY_ALT_SVC_WIRE_FORMAT_H_