blob: 4e2eec4fc0c06bc12d2d37eedab7aa32eb8096de [file] [log] [blame]
David Ghandehari9e5b5872016-07-28 09:50:04 -07001// Copyright (c) 2012 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 "net/spdy/spdy_websocket_test_util_spdy3.h"
6
7#include "net/spdy/buffered_spdy_framer.h"
8#include "net/spdy/spdy_http_utils.h"
9#include "net/spdy/spdy_test_util_spdy3.h"
10
11static const int kDefaultAssociatedStreamId = 0;
12static const bool kDefaultCompressed = false;
13static const char* const kDefaultDataPointer = NULL;
14static const uint32 kDefaultDataLength = 0;
15static const char** const kDefaultExtraHeaders = NULL;
16static const int kDefaultExtraHeaderCount = 0;
17static const int kDefaultCredentialSlot = 0;
18
19namespace net {
20
21namespace test_spdy3 {
22
23SpdyFrame* ConstructSpdyWebSocketSynStream(int stream_id,
24 const char* path,
25 const char* host,
26 const char* origin) {
27 const char* const kWebSocketHeaders[] = {
28 ":path",
29 path,
30 ":host",
31 host,
32 ":version",
33 "WebSocket/13",
34 ":scheme",
35 "ws",
36 ":origin",
37 origin
38 };
39 return ConstructSpdyControlFrame(/*extra_headers*/ NULL,
40 /*extra_header_count*/ 0,
41 /*compressed*/ false,
42 stream_id,
43 HIGHEST,
44 SYN_STREAM,
45 CONTROL_FLAG_NONE,
46 kWebSocketHeaders,
47 arraysize(kWebSocketHeaders));
48}
49
50SpdyFrame* ConstructSpdyWebSocketSynReply(int stream_id) {
51 static const char* const kStandardWebSocketHeaders[] = {
52 ":status",
53 "101"
54 };
55 return ConstructSpdyControlFrame(NULL,
56 0,
57 false,
58 stream_id,
59 LOWEST,
60 SYN_REPLY,
61 CONTROL_FLAG_NONE,
62 kStandardWebSocketHeaders,
63 arraysize(kStandardWebSocketHeaders));
64}
65
66SpdyFrame* ConstructSpdyWebSocketHandshakeRequestFrame(
67 const char* const headers[],
68 int header_count,
69 SpdyStreamId stream_id,
70 RequestPriority request_priority) {
71
72 // SPDY SYN_STREAM control frame header.
73 const SpdyHeaderInfo kSynStreamHeader = {
74 SYN_STREAM,
75 stream_id,
76 kDefaultAssociatedStreamId,
77 ConvertRequestPriorityToSpdyPriority(request_priority, 3),
78 kDefaultCredentialSlot,
79 CONTROL_FLAG_NONE,
80 kDefaultCompressed,
81 INVALID,
82 kDefaultDataPointer,
83 kDefaultDataLength,
84 DATA_FLAG_NONE
85 };
86
87 // Construct SPDY SYN_STREAM control frame.
88 return ConstructSpdyPacket(
89 kSynStreamHeader,
90 kDefaultExtraHeaders,
91 kDefaultExtraHeaderCount,
92 headers,
93 header_count);
94}
95
96SpdyFrame* ConstructSpdyWebSocketHandshakeResponseFrame(
97 const char* const headers[],
98 int header_count,
99 SpdyStreamId stream_id,
100 RequestPriority request_priority) {
101
102 // SPDY SYN_REPLY control frame header.
103 const SpdyHeaderInfo kSynReplyHeader = {
104 SYN_REPLY,
105 stream_id,
106 kDefaultAssociatedStreamId,
107 ConvertRequestPriorityToSpdyPriority(request_priority, 3),
108 kDefaultCredentialSlot,
109 CONTROL_FLAG_NONE,
110 kDefaultCompressed,
111 INVALID,
112 kDefaultDataPointer,
113 kDefaultDataLength,
114 DATA_FLAG_NONE
115 };
116
117 // Construct SPDY SYN_REPLY control frame.
118 return ConstructSpdyPacket(
119 kSynReplyHeader,
120 kDefaultExtraHeaders,
121 kDefaultExtraHeaderCount,
122 headers,
123 header_count);
124}
125
126SpdyFrame* ConstructSpdyWebSocketHeadersFrame(int stream_id,
127 const char* length,
128 bool fin) {
129 static const char* const kHeaders[] = {
130 ":opcode",
131 "1", // text frame
132 ":length",
133 length,
134 ":fin",
135 fin ? "1" : "0"
136 };
137 return ConstructSpdyControlFrame(/*extra_headers*/ NULL,
138 /*extra_header_count*/ 0,
139 /*compression*/ false,
140 stream_id,
141 LOWEST,
142 HEADERS,
143 CONTROL_FLAG_NONE,
144 kHeaders,
145 arraysize(kHeaders));
146}
147
148SpdyFrame* ConstructSpdyWebSocketDataFrame(
149 const char* data,
150 int len,
151 SpdyStreamId stream_id,
152 bool fin) {
153
154 // Construct SPDY data frame.
155 BufferedSpdyFramer framer(3, false);
156 return framer.CreateDataFrame(
157 stream_id,
158 data,
159 len,
160 fin ? DATA_FLAG_FIN : DATA_FLAG_NONE);
161}
162
163} // namespace test_spdy3
164
165} // namespace net