| // Copyright (c) 2012 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. |
| |
| #include "net/spdy/spdy_websocket_test_util_spdy2.h" |
| |
| #include "net/spdy/buffered_spdy_framer.h" |
| #include "net/spdy/spdy_http_utils.h" |
| #include "net/spdy/spdy_test_util_spdy2.h" |
| |
| static const int kDefaultAssociatedStreamId = 0; |
| static const bool kDefaultCompressed = false; |
| static const char* const kDefaultDataPointer = NULL; |
| static const uint32 kDefaultDataLength = 0; |
| static const char** const kDefaultExtraHeaders = NULL; |
| static const int kDefaultExtraHeaderCount = 0; |
| |
| namespace net { |
| |
| namespace test_spdy2 { |
| |
| SpdyFrame* ConstructSpdyWebSocketSynStream(int stream_id, |
| const char* path, |
| const char* host, |
| const char* origin) { |
| const char* const kWebSocketHeaders[] = { |
| "path", |
| path, |
| "host", |
| host, |
| "version", |
| "WebSocket/13", |
| "scheme", |
| "ws", |
| "origin", |
| origin |
| }; |
| return ConstructSpdyControlFrame(/*extra_headers*/ NULL, |
| /*extra_header_count*/ 0, |
| /*compressed*/ false, |
| stream_id, |
| HIGHEST, |
| SYN_STREAM, |
| CONTROL_FLAG_NONE, |
| kWebSocketHeaders, |
| arraysize(kWebSocketHeaders)); |
| } |
| |
| SpdyFrame* ConstructSpdyWebSocketSynReply(int stream_id) { |
| static const char* const kStandardWebSocketHeaders[] = { |
| "status", |
| "101" |
| }; |
| return ConstructSpdyControlFrame(NULL, |
| 0, |
| false, |
| stream_id, |
| LOWEST, |
| SYN_REPLY, |
| CONTROL_FLAG_NONE, |
| kStandardWebSocketHeaders, |
| arraysize(kStandardWebSocketHeaders)); |
| } |
| |
| SpdyFrame* ConstructSpdyWebSocketHandshakeRequestFrame( |
| const char* const headers[], |
| int header_count, |
| SpdyStreamId stream_id, |
| RequestPriority request_priority) { |
| |
| // SPDY SYN_STREAM control frame header. |
| const SpdyHeaderInfo kSynStreamHeader = { |
| SYN_STREAM, |
| stream_id, |
| kDefaultAssociatedStreamId, |
| ConvertRequestPriorityToSpdyPriority(request_priority, 2), |
| CONTROL_FLAG_NONE, |
| kDefaultCompressed, |
| INVALID, |
| kDefaultDataPointer, |
| kDefaultDataLength, |
| DATA_FLAG_NONE |
| }; |
| |
| // Construct SPDY SYN_STREAM control frame. |
| return ConstructSpdyPacket( |
| kSynStreamHeader, |
| kDefaultExtraHeaders, |
| kDefaultExtraHeaderCount, |
| headers, |
| header_count); |
| } |
| |
| SpdyFrame* ConstructSpdyWebSocketHandshakeResponseFrame( |
| const char* const headers[], |
| int header_count, |
| SpdyStreamId stream_id, |
| RequestPriority request_priority) { |
| |
| // SPDY SYN_REPLY control frame header. |
| const SpdyHeaderInfo kSynReplyHeader = { |
| SYN_REPLY, |
| stream_id, |
| kDefaultAssociatedStreamId, |
| ConvertRequestPriorityToSpdyPriority(request_priority, 2), |
| CONTROL_FLAG_NONE, |
| kDefaultCompressed, |
| INVALID, |
| kDefaultDataPointer, |
| kDefaultDataLength, |
| DATA_FLAG_NONE |
| }; |
| |
| // Construct SPDY SYN_REPLY control frame. |
| return ConstructSpdyPacket( |
| kSynReplyHeader, |
| kDefaultExtraHeaders, |
| kDefaultExtraHeaderCount, |
| headers, |
| header_count); |
| } |
| |
| SpdyFrame* ConstructSpdyWebSocketHeadersFrame(int stream_id, |
| const char* length, |
| bool fin) { |
| static const char* const kHeaders[] = { |
| "opcode", |
| "1", // text frame |
| "length", |
| length, |
| "fin", |
| fin ? "1" : "0" |
| }; |
| return ConstructSpdyControlFrame(/*extra_headers*/ NULL, |
| /*extra_header_count*/ 0, |
| /*compression*/ false, |
| stream_id, |
| LOWEST, |
| HEADERS, |
| CONTROL_FLAG_NONE, |
| kHeaders, |
| arraysize(kHeaders)); |
| } |
| |
| SpdyFrame* ConstructSpdyWebSocketDataFrame( |
| const char* data, |
| int len, |
| SpdyStreamId stream_id, |
| bool fin) { |
| |
| // Construct SPDY data frame. |
| BufferedSpdyFramer framer(2, false); |
| return framer.CreateDataFrame( |
| stream_id, |
| data, |
| len, |
| fin ? DATA_FLAG_FIN : DATA_FLAG_NONE); |
| } |
| |
| } // namespace test_spdy2 |
| |
| } // namespace net |