| Index: net/spdy/spdy_test_util.cc
|
| ===================================================================
|
| --- net/spdy/spdy_test_util.cc (revision 124866)
|
| +++ net/spdy/spdy_test_util.cc (working copy)
|
| @@ -1,1007 +0,0 @@
|
| -// 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_test_util.h"
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/string_number_conversions.h"
|
| -#include "base/string_util.h"
|
| -#include "net/http/http_network_session.h"
|
| -#include "net/http/http_network_transaction.h"
|
| -#include "net/http/http_server_properties_impl.h"
|
| -#include "net/spdy/spdy_framer.h"
|
| -#include "net/spdy/spdy_http_utils.h"
|
| -
|
| -namespace net {
|
| -
|
| -// Chop a frame into an array of MockWrites.
|
| -// |data| is the frame to chop.
|
| -// |length| is the length of the frame to chop.
|
| -// |num_chunks| is the number of chunks to create.
|
| -MockWrite* ChopWriteFrame(const char* data, int length, int num_chunks) {
|
| - MockWrite* chunks = new MockWrite[num_chunks];
|
| - int chunk_size = length / num_chunks;
|
| - for (int index = 0; index < num_chunks; index++) {
|
| - const char* ptr = data + (index * chunk_size);
|
| - if (index == num_chunks - 1)
|
| - chunk_size += length % chunk_size; // The last chunk takes the remainder.
|
| - chunks[index] = MockWrite(ASYNC, ptr, chunk_size);
|
| - }
|
| - return chunks;
|
| -}
|
| -
|
| -// Chop a SpdyFrame into an array of MockWrites.
|
| -// |frame| is the frame to chop.
|
| -// |num_chunks| is the number of chunks to create.
|
| -MockWrite* ChopWriteFrame(const spdy::SpdyFrame& frame, int num_chunks) {
|
| - return ChopWriteFrame(frame.data(),
|
| - frame.length() + spdy::SpdyFrame::kHeaderSize,
|
| - num_chunks);
|
| -}
|
| -
|
| -// Chop a frame into an array of MockReads.
|
| -// |data| is the frame to chop.
|
| -// |length| is the length of the frame to chop.
|
| -// |num_chunks| is the number of chunks to create.
|
| -MockRead* ChopReadFrame(const char* data, int length, int num_chunks) {
|
| - MockRead* chunks = new MockRead[num_chunks];
|
| - int chunk_size = length / num_chunks;
|
| - for (int index = 0; index < num_chunks; index++) {
|
| - const char* ptr = data + (index * chunk_size);
|
| - if (index == num_chunks - 1)
|
| - chunk_size += length % chunk_size; // The last chunk takes the remainder.
|
| - chunks[index] = MockRead(ASYNC, ptr, chunk_size);
|
| - }
|
| - return chunks;
|
| -}
|
| -
|
| -// Chop a SpdyFrame into an array of MockReads.
|
| -// |frame| is the frame to chop.
|
| -// |num_chunks| is the number of chunks to create.
|
| -MockRead* ChopReadFrame(const spdy::SpdyFrame& frame, int num_chunks) {
|
| - return ChopReadFrame(frame.data(),
|
| - frame.length() + spdy::SpdyFrame::kHeaderSize,
|
| - num_chunks);
|
| -}
|
| -
|
| -// Adds headers and values to a map.
|
| -// |extra_headers| is an array of { name, value } pairs, arranged as strings
|
| -// where the even entries are the header names, and the odd entries are the
|
| -// header values.
|
| -// |headers| gets filled in from |extra_headers|.
|
| -void AppendHeadersToSpdyFrame(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - spdy::SpdyHeaderBlock* headers) {
|
| - std::string this_header;
|
| - std::string this_value;
|
| -
|
| - if (!extra_header_count)
|
| - return;
|
| -
|
| - // Sanity check: Non-NULL header list.
|
| - DCHECK(NULL != extra_headers) << "NULL header value pair list";
|
| - // Sanity check: Non-NULL header map.
|
| - DCHECK(NULL != headers) << "NULL header map";
|
| - // Copy in the headers.
|
| - for (int i = 0; i < extra_header_count; i++) {
|
| - // Sanity check: Non-empty header.
|
| - DCHECK_NE('\0', *extra_headers[i * 2]) << "Empty header value pair";
|
| - this_header = extra_headers[i * 2];
|
| - std::string::size_type header_len = this_header.length();
|
| - if (!header_len)
|
| - continue;
|
| - this_value = extra_headers[1 + (i * 2)];
|
| - std::string new_value;
|
| - if (headers->find(this_header) != headers->end()) {
|
| - // More than one entry in the header.
|
| - // Don't add the header again, just the append to the value,
|
| - // separated by a NULL character.
|
| -
|
| - // Adjust the value.
|
| - new_value = (*headers)[this_header];
|
| - // Put in a NULL separator.
|
| - new_value.append(1, '\0');
|
| - // Append the new value.
|
| - new_value += this_value;
|
| - } else {
|
| - // Not a duplicate, just write the value.
|
| - new_value = this_value;
|
| - }
|
| - (*headers)[this_header] = new_value;
|
| - }
|
| -}
|
| -
|
| -// Writes |val| to a location of size |len|, in big-endian format.
|
| -// in the buffer pointed to by |buffer_handle|.
|
| -// Updates the |*buffer_handle| pointer by |len|
|
| -// Returns the number of bytes written
|
| -int AppendToBuffer(int val,
|
| - int len,
|
| - unsigned char** buffer_handle,
|
| - int* buffer_len_remaining) {
|
| - if (len <= 0)
|
| - return 0;
|
| - DCHECK((size_t) len <= sizeof(len)) << "Data length too long for data type";
|
| - DCHECK(NULL != buffer_handle) << "NULL buffer handle";
|
| - DCHECK(NULL != *buffer_handle) << "NULL pointer";
|
| - DCHECK(NULL != buffer_len_remaining)
|
| - << "NULL buffer remainder length pointer";
|
| - DCHECK_GE(*buffer_len_remaining, len) << "Insufficient buffer size";
|
| - for (int i = 0; i < len; i++) {
|
| - int shift = (8 * (len - (i + 1)));
|
| - unsigned char val_chunk = (val >> shift) & 0x0FF;
|
| - *(*buffer_handle)++ = val_chunk;
|
| - *buffer_len_remaining += 1;
|
| - }
|
| - return len;
|
| -}
|
| -
|
| -// Construct a SPDY packet.
|
| -// |head| is the start of the packet, up to but not including
|
| -// the header value pairs.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// |tail| is any (relatively constant) header-value pairs to add.
|
| -// |buffer| is the buffer we're filling in.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyPacket(const SpdyHeaderInfo& header_info,
|
| - const char* const extra_headers[],
|
| - int extra_header_count,
|
| - const char* const tail[],
|
| - int tail_header_count) {
|
| - spdy::SpdyFramer framer;
|
| - spdy::SpdyHeaderBlock headers;
|
| - // Copy in the extra headers to our map.
|
| - AppendHeadersToSpdyFrame(extra_headers, extra_header_count, &headers);
|
| - // Copy in the tail headers to our map.
|
| - if (tail && tail_header_count)
|
| - AppendHeadersToSpdyFrame(tail, tail_header_count, &headers);
|
| - spdy::SpdyFrame* frame = NULL;
|
| - switch (header_info.kind) {
|
| - case spdy::SYN_STREAM:
|
| - frame = framer.CreateSynStream(header_info.id, header_info.assoc_id,
|
| - header_info.priority,
|
| - header_info.control_flags,
|
| - header_info.compressed, &headers);
|
| - break;
|
| - case spdy::SYN_REPLY:
|
| - frame = framer.CreateSynReply(header_info.id, header_info.control_flags,
|
| - header_info.compressed, &headers);
|
| - break;
|
| - case spdy::RST_STREAM:
|
| - frame = framer.CreateRstStream(header_info.id, header_info.status);
|
| - break;
|
| - case spdy::HEADERS:
|
| - frame = framer.CreateHeaders(header_info.id, header_info.control_flags,
|
| - header_info.compressed, &headers);
|
| - break;
|
| - default:
|
| - frame = framer.CreateDataFrame(header_info.id, header_info.data,
|
| - header_info.data_length,
|
| - header_info.data_flags);
|
| - break;
|
| - }
|
| - return frame;
|
| -}
|
| -
|
| -// Construct an expected SPDY SETTINGS frame.
|
| -// |settings| are the settings to set.
|
| -// Returns the constructed frame. The caller takes ownership of the frame.
|
| -spdy::SpdyFrame* ConstructSpdySettings(
|
| - const spdy::SpdySettings& settings) {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreateSettings(settings);
|
| -}
|
| -
|
| -// Construct an expected SPDY CREDENTIAL frame.
|
| -// |credential| is the credential to sen.
|
| -// Returns the constructed frame. The caller takes ownership of the frame.
|
| -spdy::SpdyFrame* ConstructSpdyCredential(
|
| - const spdy::SpdyCredential& credential) {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreateCredentialFrame(credential);
|
| -}
|
| -
|
| -// Construct a SPDY PING frame.
|
| -// Returns the constructed frame. The caller takes ownership of the frame.
|
| -spdy::SpdyFrame* ConstructSpdyPing() {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreatePingFrame(1);
|
| -}
|
| -
|
| -// Construct a SPDY GOAWAY frame.
|
| -// Returns the constructed frame. The caller takes ownership of the frame.
|
| -spdy::SpdyFrame* ConstructSpdyGoAway() {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreateGoAway(0);
|
| -}
|
| -
|
| -// Construct a SPDY WINDOW_UPDATE frame.
|
| -// Returns the constructed frame. The caller takes ownership of the frame.
|
| -spdy::SpdyFrame* ConstructSpdyWindowUpdate(
|
| - const spdy::SpdyStreamId stream_id, uint32 delta_window_size) {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreateWindowUpdate(stream_id, delta_window_size);
|
| -}
|
| -
|
| -// Construct a SPDY RST_STREAM frame.
|
| -// Returns the constructed frame. The caller takes ownership of the frame.
|
| -spdy::SpdyFrame* ConstructSpdyRstStream(spdy::SpdyStreamId stream_id,
|
| - spdy::SpdyStatusCodes status) {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreateRstStream(stream_id, status);
|
| -}
|
| -
|
| -// Construct a single SPDY header entry, for validation.
|
| -// |extra_headers| are the extra header-value pairs.
|
| -// |buffer| is the buffer we're filling in.
|
| -// |index| is the index of the header we want.
|
| -// Returns the number of bytes written into |buffer|.
|
| -int ConstructSpdyHeader(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - char* buffer,
|
| - int buffer_length,
|
| - int index) {
|
| - const char* this_header = NULL;
|
| - const char* this_value = NULL;
|
| - if (!buffer || !buffer_length)
|
| - return 0;
|
| - *buffer = '\0';
|
| - // Sanity check: Non-empty header list.
|
| - DCHECK(NULL != extra_headers) << "NULL extra headers pointer";
|
| - // Sanity check: Index out of range.
|
| - DCHECK((index >= 0) && (index < extra_header_count))
|
| - << "Index " << index
|
| - << " out of range [0, " << extra_header_count << ")";
|
| - this_header = extra_headers[index * 2];
|
| - // Sanity check: Non-empty header.
|
| - if (!*this_header)
|
| - return 0;
|
| - std::string::size_type header_len = strlen(this_header);
|
| - if (!header_len)
|
| - return 0;
|
| - this_value = extra_headers[1 + (index * 2)];
|
| - // Sanity check: Non-empty value.
|
| - if (!*this_value)
|
| - this_value = "";
|
| - int n = base::snprintf(buffer,
|
| - buffer_length,
|
| - "%s: %s\r\n",
|
| - this_header,
|
| - this_value);
|
| - return n;
|
| -}
|
| -
|
| -spdy::SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - bool compressed,
|
| - int stream_id,
|
| - RequestPriority request_priority,
|
| - spdy::SpdyControlType type,
|
| - spdy::SpdyControlFlags flags,
|
| - const char* const* kHeaders,
|
| - int kHeadersSize) {
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - compressed,
|
| - stream_id,
|
| - request_priority,
|
| - type,
|
| - flags,
|
| - kHeaders,
|
| - kHeadersSize,
|
| - 0);
|
| -}
|
| -
|
| -spdy::SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - bool compressed,
|
| - int stream_id,
|
| - RequestPriority request_priority,
|
| - spdy::SpdyControlType type,
|
| - spdy::SpdyControlFlags flags,
|
| - const char* const* kHeaders,
|
| - int kHeadersSize,
|
| - int associated_stream_id) {
|
| - const SpdyHeaderInfo kSynStartHeader = {
|
| - type, // Kind = Syn
|
| - stream_id, // Stream ID
|
| - associated_stream_id, // Associated stream ID
|
| - ConvertRequestPriorityToSpdyPriority(request_priority),
|
| - // Priority
|
| - flags, // Control Flags
|
| - compressed, // Compressed
|
| - spdy::INVALID, // Status
|
| - NULL, // Data
|
| - 0, // Length
|
| - spdy::DATA_FLAG_NONE // Data Flags
|
| - };
|
| - return ConstructSpdyPacket(kSynStartHeader,
|
| - extra_headers,
|
| - extra_header_count,
|
| - kHeaders,
|
| - kHeadersSize / 2);
|
| -}
|
| -
|
| -// Constructs a standard SPDY GET SYN packet, optionally compressed
|
| -// for the url |url|.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyGet(const char* const url,
|
| - bool compressed,
|
| - int stream_id,
|
| - RequestPriority request_priority) {
|
| - const SpdyHeaderInfo kSynStartHeader = {
|
| - spdy::SYN_STREAM, // Kind = Syn
|
| - stream_id, // Stream ID
|
| - 0, // Associated stream ID
|
| - net::ConvertRequestPriorityToSpdyPriority(request_priority),
|
| - // Priority
|
| - spdy::CONTROL_FLAG_FIN, // Control Flags
|
| - compressed, // Compressed
|
| - spdy::INVALID, // Status
|
| - NULL, // Data
|
| - 0, // Length
|
| - spdy::DATA_FLAG_NONE // Data Flags
|
| - };
|
| -
|
| - GURL gurl(url);
|
| -
|
| - // This is so ugly. Why are we using char* in here again?
|
| - std::string str_path = gurl.PathForRequest();
|
| - std::string str_scheme = gurl.scheme();
|
| - std::string str_host = gurl.host();
|
| - if (gurl.has_port()) {
|
| - str_host += ":";
|
| - str_host += gurl.port();
|
| - }
|
| - scoped_array<char> req(new char[str_path.size() + 1]);
|
| - scoped_array<char> scheme(new char[str_scheme.size() + 1]);
|
| - scoped_array<char> host(new char[str_host.size() + 1]);
|
| - memcpy(req.get(), str_path.c_str(), str_path.size());
|
| - memcpy(scheme.get(), str_scheme.c_str(), str_scheme.size());
|
| - memcpy(host.get(), str_host.c_str(), str_host.size());
|
| - req.get()[str_path.size()] = '\0';
|
| - scheme.get()[str_scheme.size()] = '\0';
|
| - host.get()[str_host.size()] = '\0';
|
| -
|
| - const char* const headers[] = {
|
| - "method",
|
| - "GET",
|
| - "url",
|
| - req.get(),
|
| - "host",
|
| - host.get(),
|
| - "scheme",
|
| - scheme.get(),
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyPacket(
|
| - kSynStartHeader,
|
| - NULL,
|
| - 0,
|
| - headers,
|
| - arraysize(headers) / 2);
|
| -}
|
| -
|
| -// Constructs a standard SPDY GET SYN packet, optionally compressed.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyGet(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - bool compressed,
|
| - int stream_id,
|
| - RequestPriority request_priority) {
|
| - return ConstructSpdyGet(extra_headers, extra_header_count, compressed,
|
| - stream_id, request_priority, true);
|
| -}
|
| -
|
| -// Constructs a standard SPDY GET SYN packet, optionally compressed.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyGet(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - bool compressed,
|
| - int stream_id,
|
| - RequestPriority request_priority,
|
| - bool direct) {
|
| - const char* const kStandardGetHeaders[] = {
|
| - "method",
|
| - "GET",
|
| - "url",
|
| - (direct ? "/" : "http://www.google.com/"),
|
| - "host",
|
| - "www.google.com",
|
| - "scheme",
|
| - "http",
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - compressed,
|
| - stream_id,
|
| - request_priority,
|
| - spdy::SYN_STREAM,
|
| - spdy::CONTROL_FLAG_FIN,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders));
|
| -}
|
| -
|
| -// Constructs a standard SPDY SYN_STREAM frame for a CONNECT request.
|
| -spdy::SpdyFrame* ConstructSpdyConnect(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - int stream_id) {
|
| - const char* const kConnectHeaders[] = {
|
| - "method", "CONNECT",
|
| - "url", "www.google.com:443",
|
| - "host", "www.google.com",
|
| - "version", "HTTP/1.1",
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - /*compressed*/ false,
|
| - stream_id,
|
| - LOWEST,
|
| - spdy::SYN_STREAM,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kConnectHeaders,
|
| - arraysize(kConnectHeaders));
|
| -}
|
| -
|
| -// Constructs a standard SPDY push SYN packet.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyPush(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - int stream_id,
|
| - int associated_stream_id) {
|
| - const char* const kStandardGetHeaders[] = {
|
| - "hello",
|
| - "bye",
|
| - "status",
|
| - "200",
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - stream_id,
|
| - LOWEST,
|
| - spdy::SYN_STREAM,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders),
|
| - associated_stream_id);
|
| -}
|
| -
|
| -spdy::SpdyFrame* ConstructSpdyPush(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - int stream_id,
|
| - int associated_stream_id,
|
| - const char* url) {
|
| - const char* const kStandardGetHeaders[] = {
|
| - "hello",
|
| - "bye",
|
| - "status",
|
| - "200 OK",
|
| - "url",
|
| - url,
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - stream_id,
|
| - LOWEST,
|
| - spdy::SYN_STREAM,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders),
|
| - associated_stream_id);
|
| -
|
| -}
|
| -spdy::SpdyFrame* ConstructSpdyPush(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - int stream_id,
|
| - int associated_stream_id,
|
| - const char* url,
|
| - const char* status,
|
| - const char* location) {
|
| - const char* const kStandardGetHeaders[] = {
|
| - "hello",
|
| - "bye",
|
| - "status",
|
| - status,
|
| - "location",
|
| - location,
|
| - "url",
|
| - url,
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - stream_id,
|
| - LOWEST,
|
| - spdy::SYN_STREAM,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders),
|
| - associated_stream_id);
|
| -}
|
| -
|
| -spdy::SpdyFrame* ConstructSpdyPush(int stream_id,
|
| - int associated_stream_id,
|
| - const char* url) {
|
| - const char* const kStandardGetHeaders[] = {
|
| - "url",
|
| - url
|
| - };
|
| - return ConstructSpdyControlFrame(0,
|
| - 0,
|
| - false,
|
| - stream_id,
|
| - LOWEST,
|
| - spdy::SYN_STREAM,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders),
|
| - associated_stream_id);
|
| -}
|
| -
|
| -spdy::SpdyFrame* ConstructSpdyPushHeaders(int stream_id,
|
| - const char* const extra_headers[],
|
| - int extra_header_count) {
|
| - const char* const kStandardGetHeaders[] = {
|
| - "status",
|
| - "200 OK",
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - stream_id,
|
| - LOWEST,
|
| - spdy::HEADERS,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders));
|
| -}
|
| -
|
| -// Constructs a standard SPDY SYN_REPLY packet with the specified status code.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdySynReplyError(
|
| - const char* const status,
|
| - const char* const* const extra_headers,
|
| - int extra_header_count,
|
| - int stream_id) {
|
| - const char* const kStandardGetHeaders[] = {
|
| - "hello",
|
| - "bye",
|
| - "status",
|
| - status,
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - stream_id,
|
| - LOWEST,
|
| - spdy::SYN_REPLY,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders));
|
| -}
|
| -
|
| -// Constructs a standard SPDY SYN_REPLY packet to match the SPDY GET.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyGetSynReplyRedirect(int stream_id) {
|
| - static const char* const kExtraHeaders[] = {
|
| - "location",
|
| - "http://www.foo.com/index.php",
|
| - };
|
| - return ConstructSpdySynReplyError("301 Moved Permanently", kExtraHeaders,
|
| - arraysize(kExtraHeaders)/2, stream_id);
|
| -}
|
| -
|
| -// Constructs a standard SPDY SYN_REPLY packet with an Internal Server
|
| -// Error status code.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdySynReplyError(int stream_id) {
|
| - return ConstructSpdySynReplyError("500 Internal Server Error", NULL, 0, 1);
|
| -}
|
| -
|
| -
|
| -
|
| -
|
| -// Constructs a standard SPDY SYN_REPLY packet to match the SPDY GET.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyGetSynReply(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - int stream_id) {
|
| - static const char* const kStandardGetHeaders[] = {
|
| - "hello",
|
| - "bye",
|
| - "status",
|
| - "200",
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - stream_id,
|
| - LOWEST,
|
| - spdy::SYN_REPLY,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders));
|
| -}
|
| -
|
| -// Constructs a standard SPDY POST SYN packet.
|
| -// |content_length| is the size of post data.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyPost(int64 content_length,
|
| - const char* const extra_headers[],
|
| - int extra_header_count) {
|
| - std::string length_str = base::Int64ToString(content_length);
|
| - const char* post_headers[] = {
|
| - "method",
|
| - "POST",
|
| - "url",
|
| - "/",
|
| - "host",
|
| - "www.google.com",
|
| - "scheme",
|
| - "http",
|
| - "version",
|
| - "HTTP/1.1",
|
| - "content-length",
|
| - length_str.c_str()
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - 1,
|
| - LOWEST,
|
| - spdy::SYN_STREAM,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - post_headers,
|
| - arraysize(post_headers));
|
| -}
|
| -
|
| -// Constructs a chunked transfer SPDY POST SYN packet.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructChunkedSpdyPost(const char* const extra_headers[],
|
| - int extra_header_count) {
|
| - const char* post_headers[] = {
|
| - "method",
|
| - "POST",
|
| - "url",
|
| - "/",
|
| - "host",
|
| - "www.google.com",
|
| - "scheme",
|
| - "http",
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - 1,
|
| - LOWEST,
|
| - spdy::SYN_STREAM,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - post_headers,
|
| - arraysize(post_headers));
|
| -}
|
| -
|
| -// Constructs a standard SPDY SYN_REPLY packet to match the SPDY POST.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdyFrame.
|
| -spdy::SpdyFrame* ConstructSpdyPostSynReply(const char* const extra_headers[],
|
| - int extra_header_count) {
|
| - static const char* const kStandardGetHeaders[] = {
|
| - "hello",
|
| - "bye",
|
| - "status",
|
| - "200",
|
| - "url",
|
| - "/index.php",
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyControlFrame(extra_headers,
|
| - extra_header_count,
|
| - false,
|
| - 1,
|
| - LOWEST,
|
| - spdy::SYN_REPLY,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders));
|
| -}
|
| -
|
| -// Constructs a single SPDY data frame with the default contents.
|
| -spdy::SpdyFrame* ConstructSpdyBodyFrame(int stream_id, bool fin) {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreateDataFrame(
|
| - stream_id, kUploadData, kUploadDataSize,
|
| - fin ? spdy::DATA_FLAG_FIN : spdy::DATA_FLAG_NONE);
|
| -}
|
| -
|
| -// Constructs a single SPDY data frame with the given content.
|
| -spdy::SpdyFrame* ConstructSpdyBodyFrame(int stream_id, const char* data,
|
| - uint32 len, bool fin) {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreateDataFrame(
|
| - stream_id, data, len, fin ? spdy::DATA_FLAG_FIN : spdy::DATA_FLAG_NONE);
|
| -}
|
| -
|
| -// Wraps |frame| in the payload of a data frame in stream |stream_id|.
|
| -spdy::SpdyFrame* ConstructWrappedSpdyFrame(
|
| - const scoped_ptr<spdy::SpdyFrame>& frame,
|
| - int stream_id) {
|
| - return ConstructSpdyBodyFrame(stream_id, frame->data(),
|
| - frame->length() + spdy::SpdyFrame::kHeaderSize,
|
| - false);
|
| -}
|
| -
|
| -// Construct an expected SPDY reply string.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// |buffer| is the buffer we're filling in.
|
| -// Returns the number of bytes written into |buffer|.
|
| -int ConstructSpdyReplyString(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - char* buffer,
|
| - int buffer_length) {
|
| - int packet_size = 0;
|
| - char* buffer_write = buffer;
|
| - int buffer_left = buffer_length;
|
| - spdy::SpdyHeaderBlock headers;
|
| - if (!buffer || !buffer_length)
|
| - return 0;
|
| - // Copy in the extra headers.
|
| - AppendHeadersToSpdyFrame(extra_headers, extra_header_count, &headers);
|
| - // The iterator gets us the list of header/value pairs in sorted order.
|
| - spdy::SpdyHeaderBlock::iterator next = headers.begin();
|
| - spdy::SpdyHeaderBlock::iterator last = headers.end();
|
| - for ( ; next != last; ++next) {
|
| - // Write the header.
|
| - int value_len, current_len, offset;
|
| - const char* header_string = next->first.c_str();
|
| - packet_size += AppendToBuffer(header_string,
|
| - next->first.length(),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - packet_size += AppendToBuffer(": ",
|
| - strlen(": "),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - // Write the value(s).
|
| - const char* value_string = next->second.c_str();
|
| - // Check if it's split among two or more values.
|
| - value_len = next->second.length();
|
| - current_len = strlen(value_string);
|
| - offset = 0;
|
| - // Handle the first N-1 values.
|
| - while (current_len < value_len) {
|
| - // Finish this line -- write the current value.
|
| - packet_size += AppendToBuffer(value_string + offset,
|
| - current_len - offset,
|
| - &buffer_write,
|
| - &buffer_left);
|
| - packet_size += AppendToBuffer("\n",
|
| - strlen("\n"),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - // Advance to next value.
|
| - offset = current_len + 1;
|
| - current_len += 1 + strlen(value_string + offset);
|
| - // Start another line -- add the header again.
|
| - packet_size += AppendToBuffer(header_string,
|
| - next->first.length(),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - packet_size += AppendToBuffer(": ",
|
| - strlen(": "),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - }
|
| - EXPECT_EQ(value_len, current_len);
|
| - // Copy the last (or only) value.
|
| - packet_size += AppendToBuffer(value_string + offset,
|
| - value_len - offset,
|
| - &buffer_write,
|
| - &buffer_left);
|
| - packet_size += AppendToBuffer("\n",
|
| - strlen("\n"),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - }
|
| - return packet_size;
|
| -}
|
| -
|
| -// Create a MockWrite from the given SpdyFrame.
|
| -MockWrite CreateMockWrite(const spdy::SpdyFrame& req) {
|
| - return MockWrite(
|
| - ASYNC, req.data(), req.length() + spdy::SpdyFrame::kHeaderSize);
|
| -}
|
| -
|
| -// Create a MockWrite from the given SpdyFrame and sequence number.
|
| -MockWrite CreateMockWrite(const spdy::SpdyFrame& req, int seq) {
|
| - return CreateMockWrite(req, seq, ASYNC);
|
| -}
|
| -
|
| -// Create a MockWrite from the given SpdyFrame and sequence number.
|
| -MockWrite CreateMockWrite(const spdy::SpdyFrame& req, int seq, IoMode mode) {
|
| - return MockWrite(
|
| - mode, req.data(), req.length() + spdy::SpdyFrame::kHeaderSize, seq);
|
| -}
|
| -
|
| -// Create a MockRead from the given SpdyFrame.
|
| -MockRead CreateMockRead(const spdy::SpdyFrame& resp) {
|
| - return MockRead(
|
| - ASYNC, resp.data(), resp.length() + spdy::SpdyFrame::kHeaderSize);
|
| -}
|
| -
|
| -// Create a MockRead from the given SpdyFrame and sequence number.
|
| -MockRead CreateMockRead(const spdy::SpdyFrame& resp, int seq) {
|
| - return CreateMockRead(resp, seq, ASYNC);
|
| -}
|
| -
|
| -// Create a MockRead from the given SpdyFrame and sequence number.
|
| -MockRead CreateMockRead(const spdy::SpdyFrame& resp, int seq, IoMode mode) {
|
| - return MockRead(
|
| - mode, resp.data(), resp.length() + spdy::SpdyFrame::kHeaderSize, seq);
|
| -}
|
| -
|
| -// Combines the given SpdyFrames into the given char array and returns
|
| -// the total length.
|
| -int CombineFrames(const spdy::SpdyFrame** frames, int num_frames,
|
| - char* buff, int buff_len) {
|
| - int total_len = 0;
|
| - for (int i = 0; i < num_frames; ++i) {
|
| - total_len += frames[i]->length() + spdy::SpdyFrame::kHeaderSize;
|
| - }
|
| - DCHECK_LE(total_len, buff_len);
|
| - char* ptr = buff;
|
| - for (int i = 0; i < num_frames; ++i) {
|
| - int len = frames[i]->length() + spdy::SpdyFrame::kHeaderSize;
|
| - memcpy(ptr, frames[i]->data(), len);
|
| - ptr += len;
|
| - }
|
| - return total_len;
|
| -}
|
| -
|
| -SpdySessionDependencies::SpdySessionDependencies()
|
| - : host_resolver(new MockCachingHostResolver),
|
| - cert_verifier(new CertVerifier),
|
| - proxy_service(ProxyService::CreateDirect()),
|
| - ssl_config_service(new SSLConfigServiceDefaults),
|
| - socket_factory(new MockClientSocketFactory),
|
| - deterministic_socket_factory(new DeterministicMockClientSocketFactory),
|
| - http_auth_handler_factory(
|
| - HttpAuthHandlerFactory::CreateDefault(host_resolver.get())) {
|
| - // Note: The CancelledTransaction test does cleanup by running all
|
| - // tasks in the message loop (RunAllPending). Unfortunately, that
|
| - // doesn't clean up tasks on the host resolver thread; and
|
| - // TCPConnectJob is currently not cancellable. Using synchronous
|
| - // lookups allows the test to shutdown cleanly. Until we have
|
| - // cancellable TCPConnectJobs, use synchronous lookups.
|
| - host_resolver->set_synchronous_mode(true);
|
| -}
|
| -
|
| -SpdySessionDependencies::SpdySessionDependencies(ProxyService* proxy_service)
|
| - : host_resolver(new MockHostResolver),
|
| - cert_verifier(new CertVerifier),
|
| - proxy_service(proxy_service),
|
| - ssl_config_service(new SSLConfigServiceDefaults),
|
| - socket_factory(new MockClientSocketFactory),
|
| - deterministic_socket_factory(new DeterministicMockClientSocketFactory),
|
| - http_auth_handler_factory(
|
| - HttpAuthHandlerFactory::CreateDefault(host_resolver.get())) {}
|
| -
|
| -SpdySessionDependencies::~SpdySessionDependencies() {}
|
| -
|
| -// static
|
| -HttpNetworkSession* SpdySessionDependencies::SpdyCreateSession(
|
| - SpdySessionDependencies* session_deps) {
|
| - net::HttpNetworkSession::Params params;
|
| - params.client_socket_factory = session_deps->socket_factory.get();
|
| - params.host_resolver = session_deps->host_resolver.get();
|
| - params.cert_verifier = session_deps->cert_verifier.get();
|
| - params.proxy_service = session_deps->proxy_service.get();
|
| - params.ssl_config_service = session_deps->ssl_config_service;
|
| - params.http_auth_handler_factory =
|
| - session_deps->http_auth_handler_factory.get();
|
| - params.http_server_properties = &session_deps->http_server_properties;
|
| - return new HttpNetworkSession(params);
|
| -}
|
| -
|
| -// static
|
| -HttpNetworkSession* SpdySessionDependencies::SpdyCreateSessionDeterministic(
|
| - SpdySessionDependencies* session_deps) {
|
| - net::HttpNetworkSession::Params params;
|
| - params.client_socket_factory =
|
| - session_deps->deterministic_socket_factory.get();
|
| - params.host_resolver = session_deps->host_resolver.get();
|
| - params.cert_verifier = session_deps->cert_verifier.get();
|
| - params.proxy_service = session_deps->proxy_service.get();
|
| - params.ssl_config_service = session_deps->ssl_config_service;
|
| - params.http_auth_handler_factory =
|
| - session_deps->http_auth_handler_factory.get();
|
| - params.http_server_properties = &session_deps->http_server_properties;
|
| - return new HttpNetworkSession(params);
|
| -}
|
| -
|
| -SpdyURLRequestContext::SpdyURLRequestContext()
|
| - : ALLOW_THIS_IN_INITIALIZER_LIST(storage_(this)) {
|
| - storage_.set_host_resolver(new MockHostResolver());
|
| - storage_.set_cert_verifier(new CertVerifier);
|
| - storage_.set_proxy_service(ProxyService::CreateDirect());
|
| - storage_.set_ssl_config_service(new SSLConfigServiceDefaults);
|
| - storage_.set_http_auth_handler_factory(HttpAuthHandlerFactory::CreateDefault(
|
| - host_resolver()));
|
| - storage_.set_http_server_properties(new HttpServerPropertiesImpl);
|
| - net::HttpNetworkSession::Params params;
|
| - params.client_socket_factory = &socket_factory_;
|
| - params.host_resolver = host_resolver();
|
| - params.cert_verifier = cert_verifier();
|
| - params.proxy_service = proxy_service();
|
| - params.ssl_config_service = ssl_config_service();
|
| - params.http_auth_handler_factory = http_auth_handler_factory();
|
| - params.network_delegate = network_delegate();
|
| - params.http_server_properties = http_server_properties();
|
| - scoped_refptr<HttpNetworkSession> network_session(
|
| - new HttpNetworkSession(params));
|
| - storage_.set_http_transaction_factory(new HttpCache(
|
| - network_session,
|
| - HttpCache::DefaultBackend::InMemory(0)));
|
| -}
|
| -
|
| -SpdyURLRequestContext::~SpdyURLRequestContext() {
|
| -}
|
| -
|
| -const SpdyHeaderInfo MakeSpdyHeader(spdy::SpdyControlType type) {
|
| - const SpdyHeaderInfo kHeader = {
|
| - type, // Kind = Syn
|
| - 1, // Stream ID
|
| - 0, // Associated stream ID
|
| - 2, // Priority
|
| - spdy::CONTROL_FLAG_FIN, // Control Flags
|
| - false, // Compressed
|
| - spdy::INVALID, // Status
|
| - NULL, // Data
|
| - 0, // Length
|
| - spdy::DATA_FLAG_NONE // Data Flags
|
| - };
|
| - return kHeader;
|
| -}
|
| -} // namespace net
|
|
|