1 // Copyright 2016 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
5 #include "quiche/http2/http2_structures.h"
6
7 #include <cstring> // For std::memcmp
8 #include <sstream>
9
10 #include "absl/strings/escaping.h"
11 #include "absl/strings/str_cat.h"
12
13 namespace http2 {
14
15 // Http2FrameHeader:
16
IsProbableHttpResponse() const17 bool Http2FrameHeader::IsProbableHttpResponse() const {
18 return (payload_length == 0x485454 && // "HTT"
19 static_cast<char>(type) == 'P' && // "P"
20 flags == '/'); // "/"
21 }
22
ToString() const23 std::string Http2FrameHeader::ToString() const {
24 return absl::StrCat("length=", payload_length,
25 ", type=", Http2FrameTypeToString(type),
26 ", flags=", FlagsToString(), ", stream=", stream_id);
27 }
28
FlagsToString() const29 std::string Http2FrameHeader::FlagsToString() const {
30 return Http2FrameFlagsToString(type, flags);
31 }
32
operator ==(const Http2FrameHeader & a,const Http2FrameHeader & b)33 bool operator==(const Http2FrameHeader& a, const Http2FrameHeader& b) {
34 return a.payload_length == b.payload_length && a.stream_id == b.stream_id &&
35 a.type == b.type && a.flags == b.flags;
36 }
37
operator <<(std::ostream & out,const Http2FrameHeader & v)38 std::ostream& operator<<(std::ostream& out, const Http2FrameHeader& v) {
39 return out << v.ToString();
40 }
41
42 // Http2PriorityFields:
43
operator ==(const Http2PriorityFields & a,const Http2PriorityFields & b)44 bool operator==(const Http2PriorityFields& a, const Http2PriorityFields& b) {
45 return a.stream_dependency == b.stream_dependency && a.weight == b.weight;
46 }
47
ToString() const48 std::string Http2PriorityFields::ToString() const {
49 std::stringstream ss;
50 ss << "E=" << (is_exclusive ? "true" : "false")
51 << ", stream=" << stream_dependency
52 << ", weight=" << static_cast<uint32_t>(weight);
53 return ss.str();
54 }
55
operator <<(std::ostream & out,const Http2PriorityFields & v)56 std::ostream& operator<<(std::ostream& out, const Http2PriorityFields& v) {
57 return out << v.ToString();
58 }
59
60 // Http2RstStreamFields:
61
operator ==(const Http2RstStreamFields & a,const Http2RstStreamFields & b)62 bool operator==(const Http2RstStreamFields& a, const Http2RstStreamFields& b) {
63 return a.error_code == b.error_code;
64 }
65
operator <<(std::ostream & out,const Http2RstStreamFields & v)66 std::ostream& operator<<(std::ostream& out, const Http2RstStreamFields& v) {
67 return out << "error_code=" << v.error_code;
68 }
69
70 // Http2SettingFields:
71
operator ==(const Http2SettingFields & a,const Http2SettingFields & b)72 bool operator==(const Http2SettingFields& a, const Http2SettingFields& b) {
73 return a.parameter == b.parameter && a.value == b.value;
74 }
operator <<(std::ostream & out,const Http2SettingFields & v)75 std::ostream& operator<<(std::ostream& out, const Http2SettingFields& v) {
76 return out << "parameter=" << v.parameter << ", value=" << v.value;
77 }
78
79 // Http2PushPromiseFields:
80
operator ==(const Http2PushPromiseFields & a,const Http2PushPromiseFields & b)81 bool operator==(const Http2PushPromiseFields& a,
82 const Http2PushPromiseFields& b) {
83 return a.promised_stream_id == b.promised_stream_id;
84 }
85
operator <<(std::ostream & out,const Http2PushPromiseFields & v)86 std::ostream& operator<<(std::ostream& out, const Http2PushPromiseFields& v) {
87 return out << "promised_stream_id=" << v.promised_stream_id;
88 }
89
90 // Http2PingFields:
91
operator ==(const Http2PingFields & a,const Http2PingFields & b)92 bool operator==(const Http2PingFields& a, const Http2PingFields& b) {
93 static_assert((sizeof a.opaque_bytes) == Http2PingFields::EncodedSize(),
94 "Why not the same size?");
95 return 0 ==
96 std::memcmp(a.opaque_bytes, b.opaque_bytes, sizeof a.opaque_bytes);
97 }
98
operator <<(std::ostream & out,const Http2PingFields & v)99 std::ostream& operator<<(std::ostream& out, const Http2PingFields& v) {
100 return out << "opaque_bytes=0x"
101 << absl::BytesToHexString(absl::string_view(
102 reinterpret_cast<const char*>(v.opaque_bytes),
103 sizeof v.opaque_bytes));
104 }
105
106 // Http2GoAwayFields:
107
operator ==(const Http2GoAwayFields & a,const Http2GoAwayFields & b)108 bool operator==(const Http2GoAwayFields& a, const Http2GoAwayFields& b) {
109 return a.last_stream_id == b.last_stream_id && a.error_code == b.error_code;
110 }
operator <<(std::ostream & out,const Http2GoAwayFields & v)111 std::ostream& operator<<(std::ostream& out, const Http2GoAwayFields& v) {
112 return out << "last_stream_id=" << v.last_stream_id
113 << ", error_code=" << v.error_code;
114 }
115
116 // Http2WindowUpdateFields:
117
operator ==(const Http2WindowUpdateFields & a,const Http2WindowUpdateFields & b)118 bool operator==(const Http2WindowUpdateFields& a,
119 const Http2WindowUpdateFields& b) {
120 return a.window_size_increment == b.window_size_increment;
121 }
operator <<(std::ostream & out,const Http2WindowUpdateFields & v)122 std::ostream& operator<<(std::ostream& out, const Http2WindowUpdateFields& v) {
123 return out << "window_size_increment=" << v.window_size_increment;
124 }
125
126 // Http2AltSvcFields:
127
operator ==(const Http2AltSvcFields & a,const Http2AltSvcFields & b)128 bool operator==(const Http2AltSvcFields& a, const Http2AltSvcFields& b) {
129 return a.origin_length == b.origin_length;
130 }
operator <<(std::ostream & out,const Http2AltSvcFields & v)131 std::ostream& operator<<(std::ostream& out, const Http2AltSvcFields& v) {
132 return out << "origin_length=" << v.origin_length;
133 }
134
135 // Http2PriorityUpdateFields:
136
operator ==(const Http2PriorityUpdateFields & a,const Http2PriorityUpdateFields & b)137 bool operator==(const Http2PriorityUpdateFields& a,
138 const Http2PriorityUpdateFields& b) {
139 return a.prioritized_stream_id == b.prioritized_stream_id;
140 }
141
ToString() const142 std::string Http2PriorityUpdateFields::ToString() const {
143 std::stringstream ss;
144 ss << "prioritized_stream_id=" << prioritized_stream_id;
145 return ss.str();
146 }
147
operator <<(std::ostream & out,const Http2PriorityUpdateFields & v)148 std::ostream& operator<<(std::ostream& out,
149 const Http2PriorityUpdateFields& v) {
150 return out << v.ToString();
151 }
152
153 } // namespace http2
154