1 // Copyright 2014 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 #ifndef NET_TOOLS_QUIC_TEST_TOOLS_TEST_TOOLS_HTTP_MESSAGE_H_ 6 #define NET_TOOLS_QUIC_TEST_TOOLS_TEST_TOOLS_HTTP_MESSAGE_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/strings/string_piece.h" 12 #include "net/tools/balsa/balsa_enums.h" 13 #include "net/tools/balsa/balsa_headers.h" 14 15 namespace net { 16 namespace tools { 17 namespace test { 18 19 class HttpConstants { 20 public: 21 enum Version { 22 HTTP_UNKNOWN = 0, 23 HTTP_0_9, 24 HTTP_1_0, 25 HTTP_1_1 26 }; 27 28 enum Method { 29 UNKNOWN_METHOD = 0, 30 OPTIONS, 31 GET, 32 HEAD, 33 POST, 34 PUT, 35 DELETE, 36 TRACE, 37 CONNECT, 38 39 MKCOL, 40 UNLOCK, 41 }; 42 }; 43 44 // Stripped down wrapper class which basically contains headers and a body. 45 class HTTPMessage { 46 public: 47 typedef HttpConstants::Version Version; 48 typedef HttpConstants::Method Method; 49 50 // Convenient functions to map strings into enums. The string passed in is 51 // not assumed to be NULL-terminated. 52 static Version StringToVersion(base::StringPiece str); 53 static Method StringToMethod(base::StringPiece str); 54 55 static const char* MethodToString(Method method); 56 static const char* VersionToString(Version version); 57 58 // Default constructor makes an empty HTTP/1.1 GET request. This is typically 59 // used to construct a message that will be Initialize()-ed. 60 HTTPMessage(); 61 62 // Build a request message 63 HTTPMessage(Version version, Method request, const std::string& path); 64 65 virtual ~HTTPMessage(); 66 67 const std::string& body() const { return body_; } 68 69 // Adds a header line to the message. 70 void AddHeader(const std::string& header, const std::string& value); 71 72 // Removes a header line from the message. 73 void RemoveHeader(const std::string& header); 74 75 // A utility function which calls RemoveHeader followed by AddHeader. 76 void ReplaceHeader(const std::string& header, const std::string& value); 77 78 // Adds a body and the optional content-length header field (omitted to test 79 // read until close test case). To generate a message that has a header field 80 // of 0 content-length, call AddBody("", true). 81 // Multiple calls to AddBody()/AddChunkedBody() has the effect of overwriting 82 // the previous entry without warning. 83 void AddBody(const std::string& body, bool add_content_length); 84 85 bool has_complete_message() const { return has_complete_message_; } 86 void set_has_complete_message(bool value) { has_complete_message_ = value; } 87 88 // Do some basic http message consistency checks like: 89 // - Valid transfer-encoding header 90 // - Valid content-length header 91 // - Messages we expect to be complete are complete. 92 // This check can be disabled by setting skip_message_validation. 93 void ValidateMessage() const; 94 95 bool skip_message_validation() const { return skip_message_validation_; } 96 void set_skip_message_validation(bool value) { 97 skip_message_validation_ = value; 98 } 99 100 // Allow direct access to the body string. This should be used with caution: 101 // it will not update the request headers like AddBody and AddChunkedBody do. 102 void set_body(const std::string& body) { body_ = body; } 103 104 const BalsaHeaders* headers() const { return &headers_; } 105 BalsaHeaders* headers() { return &headers_; } 106 107 protected: 108 BalsaHeaders headers_; 109 110 std::string body_; // the body with chunked framing/gzip compression 111 112 bool is_request_; 113 114 // True if the message should be considered complete during serialization. 115 // Used by SPDY and Streamed RPC clients to decide wherever or not 116 // to include fin flags and during message validation (if enabled). 117 bool has_complete_message_; 118 119 // Allows disabling message validation when creating test messages 120 // that are intentionally invalid. 121 bool skip_message_validation_; 122 123 private: 124 void InitializeFields(); 125 126 DISALLOW_COPY_AND_ASSIGN(HTTPMessage); 127 }; 128 129 } // namespace test 130 } // namespace tools 131 } // namespace net 132 133 #endif // NET_TOOLS_QUIC_TEST_TOOLS_TEST_TOOLS_HTTP_MESSAGE_H_ 134