1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef NET_SPDY_SPDY_WEBSOCKET_TEST_UTIL_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define NET_SPDY_SPDY_WEBSOCKET_TEST_UTIL_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/request_priority.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/spdy/spdy_header_block.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/spdy/spdy_protocol.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/spdy/spdy_test_util_common.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace net {
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SpdyWebSocketTestUtil {
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit SpdyWebSocketTestUtil(NextProto protocol);
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the value corresponding to the given key (passed through
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // GetHeaderKey()), or the empty string if none exists.
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string GetHeader(const SpdyHeaderBlock& headers,
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        const std::string& key) const;
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Adds the given key/value pair to |headers|, passing the key
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // through GetHeaderKey().
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetHeader(const std::string& key,
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 const std::string& value,
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 SpdyHeaderBlock* headers) const;
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Constructs a standard SPDY SYN_STREAM frame for WebSocket over
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // SPDY opening handshake.
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrame* ConstructSpdyWebSocketSynStream(int stream_id,
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             const char* path,
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             const char* host,
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             const char* origin);
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Constructs a standard SPDY SYN_REPLY packet to match the
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // WebSocket over SPDY opening handshake.
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrame* ConstructSpdyWebSocketSynReply(int stream_id);
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Constructs a WebSocket over SPDY handshake request packet.
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrame* ConstructSpdyWebSocketHandshakeRequestFrame(
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      scoped_ptr<SpdyHeaderBlock> headers,
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpdyStreamId stream_id,
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      RequestPriority request_priority);
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Constructs a WebSocket over SPDY handshake response packet.
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrame* ConstructSpdyWebSocketHandshakeResponseFrame(
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      scoped_ptr<SpdyHeaderBlock> headers,
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpdyStreamId stream_id,
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      RequestPriority request_priority);
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Constructs a SPDY HEADERS frame for a WebSocket frame over SPDY.
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrame* ConstructSpdyWebSocketHeadersFrame(int stream_id,
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                const char* length,
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                bool fin);
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Constructs a WebSocket over SPDY data packet.
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrame* ConstructSpdyWebSocketDataFrame(const char* data,
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             int len,
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             SpdyStreamId stream_id,
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             bool fin);
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Forwards to |spdy_util_|.
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrame* ConstructSpdySettings(const SettingsMap& settings) const;
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SpdyFrame* ConstructSpdySettingsAck() const;
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyMajorVersion spdy_version() const;
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Modify the header key based on the SPDY version and return it.
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string GetHeaderKey(const std::string& key) const;
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyTestUtil spdy_util_;
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace net
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // NET_SPDY_SPDY_WEBSOCKET_TEST_UTIL_H_
79