• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 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.h"
6 
7 #include "net/spdy/buffered_spdy_framer.h"
8 #include "net/spdy/spdy_http_utils.h"
9 
10 namespace net {
11 
12 const bool kDefaultCompressed = false;
13 
SpdyWebSocketTestUtil(NextProto protocol)14 SpdyWebSocketTestUtil::SpdyWebSocketTestUtil(
15     NextProto protocol) : spdy_util_(protocol) {}
16 
GetHeader(const SpdyHeaderBlock & headers,const std::string & key) const17 std::string SpdyWebSocketTestUtil::GetHeader(const SpdyHeaderBlock& headers,
18                                              const std::string& key) const {
19   SpdyHeaderBlock::const_iterator it = headers.find(GetHeaderKey(key));
20   return (it == headers.end()) ? "" : it->second;
21 }
22 
SetHeader(const std::string & key,const std::string & value,SpdyHeaderBlock * headers) const23 void SpdyWebSocketTestUtil::SetHeader(
24     const std::string& key,
25     const std::string& value,
26     SpdyHeaderBlock* headers) const {
27   (*headers)[GetHeaderKey(key)] = value;
28 }
29 
ConstructSpdyWebSocketSynStream(int stream_id,const char * path,const char * host,const char * origin)30 SpdyFrame* SpdyWebSocketTestUtil::ConstructSpdyWebSocketSynStream(
31     int stream_id,
32     const char* path,
33     const char* host,
34     const char* origin) {
35   scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock());
36   SetHeader("path", path, headers.get());
37   SetHeader("host", host, headers.get());
38   SetHeader("version", "WebSocket/13", headers.get());
39   SetHeader("scheme", "ws", headers.get());
40   SetHeader("origin", origin, headers.get());
41   return spdy_util_.ConstructSpdySyn(
42       stream_id, *headers, HIGHEST, false, false);
43 }
44 
ConstructSpdyWebSocketSynReply(int stream_id)45 SpdyFrame* SpdyWebSocketTestUtil::ConstructSpdyWebSocketSynReply(
46     int stream_id) {
47   SpdyHeaderBlock block;
48   SetHeader("status", "101", &block);
49   return spdy_util_.ConstructSpdyReply(stream_id, block);
50 }
51 
ConstructSpdyWebSocketHandshakeRequestFrame(scoped_ptr<SpdyHeaderBlock> headers,SpdyStreamId stream_id,RequestPriority request_priority)52 SpdyFrame* SpdyWebSocketTestUtil::ConstructSpdyWebSocketHandshakeRequestFrame(
53     scoped_ptr<SpdyHeaderBlock> headers,
54     SpdyStreamId stream_id,
55     RequestPriority request_priority) {
56   return spdy_util_.ConstructSpdySyn(
57       stream_id, *headers, request_priority, kDefaultCompressed, false);
58 }
59 
ConstructSpdyWebSocketHandshakeResponseFrame(scoped_ptr<SpdyHeaderBlock> headers,SpdyStreamId stream_id,RequestPriority request_priority)60 SpdyFrame* SpdyWebSocketTestUtil::ConstructSpdyWebSocketHandshakeResponseFrame(
61     scoped_ptr<SpdyHeaderBlock> headers,
62     SpdyStreamId stream_id,
63     RequestPriority request_priority) {
64   return spdy_util_.ConstructSpdyReply(stream_id, *headers);
65 }
66 
ConstructSpdyWebSocketHeadersFrame(int stream_id,const char * length,bool fin)67 SpdyFrame* SpdyWebSocketTestUtil::ConstructSpdyWebSocketHeadersFrame(
68     int stream_id,
69     const char* length,
70     bool fin) {
71   scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock());
72   SetHeader("opcode", "1", headers.get());  // text frame
73   SetHeader("length", length, headers.get());
74   SetHeader("fin", fin ? "1" : "0", headers.get());
75   return spdy_util_.ConstructSpdySyn(stream_id, *headers, LOWEST, false, false);
76 }
77 
ConstructSpdyWebSocketDataFrame(const char * data,int len,SpdyStreamId stream_id,bool fin)78 SpdyFrame* SpdyWebSocketTestUtil::ConstructSpdyWebSocketDataFrame(
79     const char* data,
80     int len,
81     SpdyStreamId stream_id,
82     bool fin) {
83 
84   // Construct SPDY data frame.
85   BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
86   return framer.CreateDataFrame(
87       stream_id,
88       data,
89       len,
90       fin ? DATA_FLAG_FIN : DATA_FLAG_NONE);
91 }
92 
ConstructSpdySettings(const SettingsMap & settings) const93 SpdyFrame* SpdyWebSocketTestUtil::ConstructSpdySettings(
94     const SettingsMap& settings) const {
95   return spdy_util_.ConstructSpdySettings(settings);
96 }
97 
ConstructSpdySettingsAck() const98 SpdyFrame* SpdyWebSocketTestUtil::ConstructSpdySettingsAck() const {
99   return spdy_util_.ConstructSpdySettingsAck();
100 }
101 
spdy_version() const102 SpdyMajorVersion SpdyWebSocketTestUtil::spdy_version() const {
103   return spdy_util_.spdy_version();
104 }
105 
GetHeaderKey(const std::string & key) const106 std::string SpdyWebSocketTestUtil::GetHeaderKey(
107     const std::string& key) const {
108   return (spdy_util_.is_spdy2() ? "" : ":") + key;
109 }
110 
111 }  // namespace net
112