OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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/websockets/websocket_handshake_draft75.h" | |
6 | |
7 #include <string> | |
8 #include <vector> | |
9 | |
10 #include "base/memory/scoped_ptr.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 #include "testing/gmock/include/gmock/gmock.h" | |
13 #include "testing/platform_test.h" | |
14 | |
15 namespace net { | |
16 | |
17 TEST(WebSocketHandshakeDraft75Test, Connect) { | |
18 const std::string kExpectedClientHandshakeMessage = | |
19 "GET /demo HTTP/1.1\r\n" | |
20 "Upgrade: WebSocket\r\n" | |
21 "Connection: Upgrade\r\n" | |
22 "Host: example.com\r\n" | |
23 "Origin: http://example.com\r\n" | |
24 "WebSocket-Protocol: sample\r\n" | |
25 "\r\n"; | |
26 | |
27 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
28 new WebSocketHandshakeDraft75(GURL("ws://example.com/demo"), | |
29 "http://example.com", | |
30 "ws://example.com/demo", | |
31 "sample")); | |
32 EXPECT_EQ(WebSocketHandshake::MODE_INCOMPLETE, handshake->mode()); | |
33 EXPECT_EQ(kExpectedClientHandshakeMessage, | |
34 handshake->CreateClientHandshakeMessage()); | |
35 | |
36 const char kResponse[] = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" | |
37 "Upgrade: WebSocket\r\n" | |
38 "Connection: Upgrade\r\n" | |
39 "WebSocket-Origin: http://example.com\r\n" | |
40 "WebSocket-Location: ws://example.com/demo\r\n" | |
41 "WebSocket-Protocol: sample\r\n" | |
42 "\r\n"; | |
43 | |
44 EXPECT_EQ(WebSocketHandshake::MODE_INCOMPLETE, handshake->mode()); | |
45 // too short | |
46 EXPECT_EQ(-1, handshake->ReadServerHandshake(kResponse, 16)); | |
47 EXPECT_EQ(WebSocketHandshake::MODE_INCOMPLETE, handshake->mode()); | |
48 // only status line | |
49 EXPECT_EQ(-1, handshake->ReadServerHandshake( | |
50 kResponse, | |
51 WebSocketHandshakeDraft75::kServerHandshakeHeaderLength)); | |
52 EXPECT_EQ(WebSocketHandshake::MODE_NORMAL, handshake->mode()); | |
53 // by upgrade header | |
54 EXPECT_EQ(-1, handshake->ReadServerHandshake( | |
55 kResponse, | |
56 WebSocketHandshakeDraft75::kServerHandshakeHeaderLength + | |
57 WebSocketHandshakeDraft75::kUpgradeHeaderLength)); | |
58 EXPECT_EQ(WebSocketHandshake::MODE_NORMAL, handshake->mode()); | |
59 // by connection header | |
60 EXPECT_EQ(-1, handshake->ReadServerHandshake( | |
61 kResponse, | |
62 WebSocketHandshakeDraft75::kServerHandshakeHeaderLength + | |
63 WebSocketHandshakeDraft75::kUpgradeHeaderLength + | |
64 WebSocketHandshakeDraft75::kConnectionHeaderLength)); | |
65 EXPECT_EQ(WebSocketHandshake::MODE_NORMAL, handshake->mode()); | |
66 | |
67 EXPECT_EQ(-1, handshake->ReadServerHandshake( | |
68 kResponse, sizeof(kResponse) - 2)); | |
69 EXPECT_EQ(WebSocketHandshake::MODE_NORMAL, handshake->mode()); | |
70 | |
71 int handshake_length = strlen(kResponse); | |
72 EXPECT_EQ(handshake_length, handshake->ReadServerHandshake( | |
73 kResponse, sizeof(kResponse) - 1)); // -1 for terminating \0 | |
74 EXPECT_EQ(WebSocketHandshake::MODE_CONNECTED, handshake->mode()); | |
75 } | |
76 | |
77 TEST(WebSocketHandshakeDraft75Test, ServerSentData) { | |
78 const std::string kExpectedClientHandshakeMessage = | |
79 "GET /demo HTTP/1.1\r\n" | |
80 "Upgrade: WebSocket\r\n" | |
81 "Connection: Upgrade\r\n" | |
82 "Host: example.com\r\n" | |
83 "Origin: http://example.com\r\n" | |
84 "WebSocket-Protocol: sample\r\n" | |
85 "\r\n"; | |
86 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
87 new WebSocketHandshakeDraft75(GURL("ws://example.com/demo"), | |
88 "http://example.com", | |
89 "ws://example.com/demo", | |
90 "sample")); | |
91 EXPECT_EQ(WebSocketHandshake::MODE_INCOMPLETE, handshake->mode()); | |
92 EXPECT_EQ(kExpectedClientHandshakeMessage, | |
93 handshake->CreateClientHandshakeMessage()); | |
94 | |
95 const char kResponse[] ="HTTP/1.1 101 Web Socket Protocol Handshake\r\n" | |
96 "Upgrade: WebSocket\r\n" | |
97 "Connection: Upgrade\r\n" | |
98 "WebSocket-Origin: http://example.com\r\n" | |
99 "WebSocket-Location: ws://example.com/demo\r\n" | |
100 "WebSocket-Protocol: sample\r\n" | |
101 "\r\n" | |
102 "\0Hello\xff"; | |
103 | |
104 int handshake_length = strlen(kResponse); | |
105 EXPECT_EQ(handshake_length, handshake->ReadServerHandshake( | |
106 kResponse, sizeof(kResponse) - 1)); // -1 for terminating \0 | |
107 EXPECT_EQ(WebSocketHandshake::MODE_CONNECTED, handshake->mode()); | |
108 } | |
109 | |
110 TEST(WebSocketHandshakeDraft75Test, CreateClientHandshakeMessage_Simple) { | |
111 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
112 new WebSocketHandshakeDraft75(GURL("ws://example.com/demo"), | |
113 "http://example.com", | |
114 "ws://example.com/demo", | |
115 "sample")); | |
116 EXPECT_EQ("GET /demo HTTP/1.1\r\n" | |
117 "Upgrade: WebSocket\r\n" | |
118 "Connection: Upgrade\r\n" | |
119 "Host: example.com\r\n" | |
120 "Origin: http://example.com\r\n" | |
121 "WebSocket-Protocol: sample\r\n" | |
122 "\r\n", | |
123 handshake->CreateClientHandshakeMessage()); | |
124 } | |
125 | |
126 TEST(WebSocketHandshakeDraft75Test, CreateClientHandshakeMessage_PathAndQuery) { | |
127 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
128 new WebSocketHandshakeDraft75(GURL("ws://example.com/Test?q=xxx&p=%20"), | |
129 "http://example.com", | |
130 "ws://example.com/demo", | |
131 "sample")); | |
132 // Path and query should be preserved as-is. | |
133 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
134 testing::HasSubstr("GET /Test?q=xxx&p=%20 HTTP/1.1\r\n")); | |
135 } | |
136 | |
137 TEST(WebSocketHandshakeDraft75Test, CreateClientHandshakeMessage_Host) { | |
138 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
139 new WebSocketHandshakeDraft75(GURL("ws://Example.Com/demo"), | |
140 "http://Example.Com", | |
141 "ws://Example.Com/demo", | |
142 "sample")); | |
143 // Host should be lowercased | |
144 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
145 testing::HasSubstr("Host: example.com\r\n")); | |
146 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
147 testing::HasSubstr("Origin: http://example.com\r\n")); | |
148 } | |
149 | |
150 TEST(WebSocketHandshakeDraft75Test, CreateClientHandshakeMessage_TrimPort80) { | |
151 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
152 new WebSocketHandshakeDraft75(GURL("ws://example.com:80/demo"), | |
153 "http://example.com", | |
154 "ws://example.com/demo", | |
155 "sample")); | |
156 // :80 should be trimmed as it's the default port for ws://. | |
157 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
158 testing::HasSubstr("Host: example.com\r\n")); | |
159 } | |
160 | |
161 TEST(WebSocketHandshakeDraft75Test, CreateClientHandshakeMessage_TrimPort443) { | |
162 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
163 new WebSocketHandshakeDraft75(GURL("wss://example.com:443/demo"), | |
164 "http://example.com", | |
165 "wss://example.com/demo", | |
166 "sample")); | |
167 // :443 should be trimmed as it's the default port for wss://. | |
168 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
169 testing::HasSubstr("Host: example.com\r\n")); | |
170 } | |
171 | |
172 TEST(WebSocketHandshakeDraft75Test, | |
173 CreateClientHandshakeMessage_NonDefaultPortForWs) { | |
174 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
175 new WebSocketHandshakeDraft75(GURL("ws://example.com:8080/demo"), | |
176 "http://example.com", | |
177 "wss://example.com/demo", | |
178 "sample")); | |
179 // :8080 should be preserved as it's not the default port for ws://. | |
180 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
181 testing::HasSubstr("Host: example.com:8080\r\n")); | |
182 } | |
183 | |
184 TEST(WebSocketHandshakeDraft75Test, | |
185 CreateClientHandshakeMessage_NonDefaultPortForWss) { | |
186 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
187 new WebSocketHandshakeDraft75(GURL("wss://example.com:4443/demo"), | |
188 "http://example.com", | |
189 "wss://example.com/demo", | |
190 "sample")); | |
191 // :4443 should be preserved as it's not the default port for wss://. | |
192 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
193 testing::HasSubstr("Host: example.com:4443\r\n")); | |
194 } | |
195 | |
196 TEST(WebSocketHandshakeDraft75Test, CreateClientHandshakeMessage_WsBut443) { | |
197 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
198 new WebSocketHandshakeDraft75(GURL("ws://example.com:443/demo"), | |
199 "http://example.com", | |
200 "ws://example.com/demo", | |
201 "sample")); | |
202 // :443 should be preserved as it's not the default port for ws://. | |
203 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
204 testing::HasSubstr("Host: example.com:443\r\n")); | |
205 } | |
206 | |
207 TEST(WebSocketHandshakeDraft75Test, CreateClientHandshakeMessage_WssBut80) { | |
208 scoped_ptr<WebSocketHandshakeDraft75> handshake( | |
209 new WebSocketHandshakeDraft75(GURL("wss://example.com:80/demo"), | |
210 "http://example.com", | |
211 "wss://example.com/demo", | |
212 "sample")); | |
213 // :80 should be preserved as it's not the default port for wss://. | |
214 EXPECT_THAT(handshake->CreateClientHandshakeMessage(), | |
215 testing::HasSubstr("Host: example.com:80\r\n")); | |
216 } | |
217 | |
218 } // namespace net | |
OLD | NEW |