1 #include "quiche/http2/adapter/oghttp2_util.h"
2
3 #include <utility>
4 #include <vector>
5
6 #include "quiche/http2/adapter/http2_protocol.h"
7 #include "quiche/http2/adapter/test_frame_sequence.h"
8 #include "quiche/common/platform/api/quiche_test.h"
9
10 namespace http2 {
11 namespace adapter {
12 namespace test {
13 namespace {
14
15 using HeaderPair = std::pair<absl::string_view, absl::string_view>;
16
TEST(ToHeaderBlock,EmptySpan)17 TEST(ToHeaderBlock, EmptySpan) {
18 spdy::Http2HeaderBlock block = ToHeaderBlock({});
19 EXPECT_TRUE(block.empty());
20 }
21
TEST(ToHeaderBlock,ExampleRequestHeaders)22 TEST(ToHeaderBlock, ExampleRequestHeaders) {
23 const std::vector<HeaderPair> pairs = {{":authority", "example.com"},
24 {":method", "GET"},
25 {":path", "/example.html"},
26 {":scheme", "http"},
27 {"accept", "text/plain, text/html"}};
28 const std::vector<Header> headers = ToHeaders(pairs);
29 spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
30 EXPECT_THAT(block, testing::ElementsAreArray(pairs));
31 }
32
TEST(ToHeaderBlock,ExampleResponseHeaders)33 TEST(ToHeaderBlock, ExampleResponseHeaders) {
34 const std::vector<HeaderPair> pairs = {
35 {":status", "403"},
36 {"content-length", "1023"},
37 {"x-extra-info", "humblest apologies"}};
38 const std::vector<Header> headers = ToHeaders(pairs);
39 spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
40 EXPECT_THAT(block, testing::ElementsAreArray(pairs));
41 }
42
TEST(ToHeaderBlock,RepeatedRequestHeaderNames)43 TEST(ToHeaderBlock, RepeatedRequestHeaderNames) {
44 const std::vector<HeaderPair> pairs = {
45 {":authority", "example.com"}, {":method", "GET"},
46 {":path", "/example.html"}, {":scheme", "http"},
47 {"cookie", "chocolate_chips=yes"}, {"accept", "text/plain, text/html"},
48 {"cookie", "raisins=no"}};
49 const std::vector<HeaderPair> expected = {
50 {":authority", "example.com"},
51 {":method", "GET"},
52 {":path", "/example.html"},
53 {":scheme", "http"},
54 {"cookie", "chocolate_chips=yes; raisins=no"},
55 {"accept", "text/plain, text/html"}};
56 const std::vector<Header> headers = ToHeaders(pairs);
57 spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
58 EXPECT_THAT(block, testing::ElementsAreArray(expected));
59 }
60
TEST(ToHeaderBlock,RepeatedResponseHeaderNames)61 TEST(ToHeaderBlock, RepeatedResponseHeaderNames) {
62 const std::vector<HeaderPair> pairs = {
63 {":status", "403"}, {"x-extra-info", "sorry"},
64 {"content-length", "1023"}, {"x-extra-info", "humblest apologies"},
65 {"content-length", "1024"}, {"set-cookie", "chocolate_chips=yes"},
66 {"set-cookie", "raisins=no"}};
67 const std::vector<HeaderPair> expected = {
68 {":status", "403"},
69 {"x-extra-info", absl::string_view("sorry\0humblest apologies", 24)},
70 {"content-length", absl::string_view("1023"
71 "\0"
72 "1024",
73 9)},
74 {"set-cookie", absl::string_view("chocolate_chips=yes\0raisins=no", 30)}};
75 const std::vector<Header> headers = ToHeaders(pairs);
76 spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
77 EXPECT_THAT(block, testing::ElementsAreArray(expected));
78 }
79
80 } // namespace
81 } // namespace test
82 } // namespace adapter
83 } // namespace http2
84