NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.3: NDN, CCN, CCNx, content centric networks
API Documentation
pool.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011, Peter Thorson. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  * * Redistributions of source code must retain the above copyright
7  * notice, this list of conditions and the following disclaimer.
8  * * Redistributions in binary form must reproduce the above copyright
9  * notice, this list of conditions and the following disclaimer in the
10  * documentation and/or other materials provided with the distribution.
11  * * Neither the name of the WebSocket++ Project nor the
12  * names of its contributors may be used to endorse or promote products
13  * derived from this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
19  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  */
27 //#define BOOST_TEST_DYN_LINK
28 #define BOOST_TEST_MODULE hybi_00_processor
29 #include <boost/test/unit_test.hpp>
30 
31 #include <iostream>
32 #include <string>
33 
37 
38 
39 BOOST_AUTO_TEST_CASE( exact_match ) {
43 
44  std::string handshake = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: upgrade\r\nUpgrade: websocket\r\nOrigin: http://example.com\r\nSec-WebSocket-Key1: 3e6b263 4 17 80\r\nSec-WebSocket-Key2: 17 9 G`ZD9 2 2b 7X 3 /r90\r\n\r\n";
45 
46  r.consume(handshake.c_str(),handshake.size());
47  r.replace_header("Sec-WebSocket-Key3","WjN}|M(6");
48 
51  BOOST_CHECK(p.validate_handshake(r));
52 
54  bool exception;
55 
56  try {
57  u = p.get_uri(r);
58  } catch (const websocketpp::uri_exception& e) {
59  exception = true;
60  }
61 
62  BOOST_CHECK(exception == false);
63  BOOST_CHECK(u->get_secure() == false);
64  BOOST_CHECK(u->get_host() == "www.example.com");
65  BOOST_CHECK(u->get_resource() == "/");
66  BOOST_CHECK(u->get_port() == websocketpp::URI_DEFAULT_PORT);
67 
68  p.process_handshake(r,response);
69 
70  BOOST_CHECK(response.get_header("Connection") == "Upgrade");
71  BOOST_CHECK(response.get_header("Upgrade") == "websocket");
72  BOOST_CHECK(response.get_header("Sec-WebSocket-Origin") == "http://example.com");
73 
74  BOOST_CHECK(response.get_header("Sec-WebSocket-Location") == "ws://www.example.com/");
75  BOOST_CHECK(response.get_header("Sec-WebSocket-Key3") == "n`9eBk9z$R8pOtVb");
76 }
77 
78 BOOST_AUTO_TEST_CASE( non_get_method ) {
81 
82  std::string handshake = "POST / HTTP/1.1\r\nHost: www.example.com\r\nConnection: upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key1: 3e6b263 4 17 80\r\nSec-WebSocket-Key2: 17 9 G`ZD9 2 2b 7X 3 /r90\r\n\r\n";
83 
84  r.consume(handshake.c_str(),handshake.size());
85  r.replace_header("Sec-WebSocket-Key3","janelle!");
86 
89  BOOST_CHECK(!p.validate_handshake(r));
90 }
91 
92 BOOST_AUTO_TEST_CASE( old_http_version ) {
95 
96  std::string handshake = "GET / HTTP/1.0\r\nHost: www.example.com\r\nConnection: upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key1: 3e6b263 4 17 80\r\nSec-WebSocket-Key2: 17 9 G`ZD9 2 2b 7X 3 /r90\r\n\r\n";
97 
98  r.consume(handshake.c_str(),handshake.size());
99  r.replace_header("Sec-WebSocket-Key3","janelle!");
100 
103  BOOST_CHECK(!p.validate_handshake(r));
104 }
105 
106 BOOST_AUTO_TEST_CASE( missing_handshake_key1 ) {
109 
110  std::string handshake = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key1: 3e6b263 4 17 80\r\n\r\n";
111 
112  r.consume(handshake.c_str(),handshake.size());
113  r.replace_header("Sec-WebSocket-Key3","janelle!");
114 
117  BOOST_CHECK(!p.validate_handshake(r));
118 }
119 
120 BOOST_AUTO_TEST_CASE( missing_handshake_key2 ) {
123 
124  std::string handshake = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key2: 17 9 G`ZD9 2 2b 7X 3 /r90\r\n\r\n";
125 
126  r.consume(handshake.c_str(),handshake.size());
127  r.replace_header("Sec-WebSocket-Key3","janelle!");
128 
131  BOOST_CHECK(!p.validate_handshake(r));
132 }
133 
134 BOOST_AUTO_TEST_CASE( bad_host ) {
138  bool exception = false;
139 
140  std::string handshake = "GET / HTTP/1.1\r\nHost: www.example.com:70000\r\nConnection: upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key2: 17 9 G`ZD9 2 2b 7X 3 /r90\r\n\r\n";
141 
142  r.consume(handshake.c_str(),handshake.size());
143  r.replace_header("Sec-WebSocket-Key3","janelle!");
144 
147  BOOST_CHECK(!p.validate_handshake(r));
148 
149  try {
150  u = p.get_uri(r);
151  } catch (const websocketpp::uri_exception& e) {
152  exception = true;
153  }
154 
155  BOOST_CHECK(exception == true);
156 }
int get_version() const
Get the protocol version of this processor.
Definition: hybi00.hpp:73
lib::error_code validate_handshake(request_type const &r) const
validate a WebSocket handshake request for this version
Definition: hybi00.hpp:77
bool is_websocket_handshake(request_type &r)
Determine whether or not a generic HTTP request is a WebSocket handshake.
Definition: processor.hpp:68
lib::error_code process_handshake(request_type const &req, std::string const &subprotocol, response_type &res) const
Calculate the appropriate response for this websocket request.
Definition: hybi00.hpp:100
int get_websocket_version(request_type &r)
Extract the version from a WebSocket handshake request.
Definition: processor.hpp:107
Stores, parses, and manipulates HTTP responses.
Definition: response.hpp:57
uri_ptr get_uri(request_type const &request) const
Extracts client uri from a handshake request.
Definition: hybi00.hpp:217
std::string const & get_header(std::string const &key) const
Get the value of an HTTP header.
Definition: parser.hpp:45
lib::shared_ptr< uri > uri_ptr
Pointer to a URI.
Definition: uri.hpp:351
void replace_header(std::string const &key, std::string const &val)
Set a value for an HTTP header, replacing an existing value.
Definition: parser.hpp:81
BOOST_AUTO_TEST_CASE(exact_match)
Definition: pool.cpp:39
Stores, parses, and manipulates HTTP requests.
Definition: request.hpp:50
size_t consume(char const *buf, size_t len)
Process bytes in the input buffer.
Definition: request.hpp:41
Processor for Hybi Draft version 00.
Definition: hybi00.hpp:54