quic_test_packet_maker.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/test_tools/quic_test_packet_maker.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_framer.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_http_utils.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_utils.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net { 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace test { 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version, 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicConnectionId connection_id) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : version_(version), 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection_id_(connection_id), 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) spdy_request_framer_(SPDY3), 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) spdy_response_framer_(SPDY3) { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicTestPacketMaker::~QuicTestPacketMaker() { 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket( 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber num, 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool include_version, 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamId stream_id, 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicRstStreamErrorCode error_code) { 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketHeader header; 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) header.public_header.connection_id = connection_id_; 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.reset_flag = false; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.version_flag = include_version; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.packet_sequence_number = num; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.entropy_flag = false; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.fec_flag = false; 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.fec_group = 0; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicRstStreamFrame rst(stream_id, error_code, 0); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&rst))); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket( 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber num, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool include_version, 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamId stream_id, 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicRstStreamErrorCode error_code, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber largest_received, 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber least_unacked, 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool send_feedback) { 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketHeader header; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) header.public_header.connection_id = connection_id_; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.reset_flag = false; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.version_flag = include_version; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.packet_sequence_number = num; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.entropy_flag = false; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.fec_flag = false; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.fec_group = 0; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) QuicAckFrame ack(MakeAckFrame(largest_received)); 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ack.delta_time_largest_observed = QuicTime::Delta::Zero(); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicFrames frames; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frames.push_back(QuicFrame(&ack)); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicCongestionFeedbackFrame feedback; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (send_feedback) { 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) feedback.type = kTCP; 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) feedback.tcp.receive_window = 256000; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frames.push_back(QuicFrame(&feedback)); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStopWaitingFrame stop_waiting; 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) stop_waiting.least_unacked = least_unacked; 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) frames.push_back(QuicFrame(&stop_waiting)); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicRstStreamFrame rst(stream_id, error_code, 0); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frames.push_back(QuicFrame(&rst)); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicPacket> packet( 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BuildUnsizedDataPacket(&framer, header, frames).packet); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ENCRYPTION_NONE, header.packet_sequence_number, *packet)); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeConnectionClosePacket( 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber num) { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketHeader header; 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) header.public_header.connection_id = connection_id_; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.reset_flag = false; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.version_flag = false; 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.packet_sequence_number = num; 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.entropy_flag = false; 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.fec_flag = false; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.fec_group = 0; 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicConnectionCloseFrame close; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED; 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) close.error_details = "Time to panic!"; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&close))); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket( 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber sequence_number, 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber largest_received, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber least_unacked, 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool send_feedback) { 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketHeader header; 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) header.public_header.connection_id = connection_id_; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.reset_flag = false; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.version_flag = false; 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.packet_sequence_number = sequence_number; 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.entropy_flag = false; 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.fec_flag = false; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header.fec_group = 0; 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) QuicAckFrame ack(MakeAckFrame(largest_received)); 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ack.delta_time_largest_observed = QuicTime::Delta::Zero(); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicCongestionFeedbackFrame feedback; 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) feedback.type = kTCP; 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) feedback.tcp.receive_window = 256000; 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicFrames frames; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frames.push_back(QuicFrame(&ack)); 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (send_feedback) { 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frames.push_back(QuicFrame(&feedback)); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStopWaitingFrame stop_waiting; 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) stop_waiting.least_unacked = least_unacked; 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) frames.push_back(QuicFrame(&stop_waiting)); 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicPacket> packet( 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BuildUnsizedDataPacket(&framer, header, frames).packet); 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ENCRYPTION_NONE, header.packet_sequence_number, *packet)); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns a newly created packet to send kData on stream 1. 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket( 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber sequence_number, 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamId stream_id, 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool should_include_version, 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool fin, 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamOffset offset, 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringPiece data) { 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeHeader(sequence_number, should_include_version); 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data)); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return MakePacket(header_, QuicFrame(&frame)); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket( 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber sequence_number, 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamId stream_id, 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool should_include_version, 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool fin, 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SpdyHeaderBlock& headers) { 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeHeader(sequence_number, should_include_version); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdySynStreamIR syn_stream(stream_id); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_stream.set_name_value_block(headers); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_stream.set_fin(fin); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_stream.set_priority(0); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SpdySerializedFrame> spdy_frame( 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) spdy_request_framer_.SerializeSynStream(syn_stream)); 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamFrame frame(kHeadersStreamId, false, 0, 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MakeIOVector(base::StringPiece(spdy_frame->data(), 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) spdy_frame->size()))); 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return MakePacket(header_, QuicFrame(&frame)); 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket( 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber sequence_number, 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamId stream_id, 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool should_include_version, 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool fin, 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SpdyHeaderBlock& headers) { 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeHeader(sequence_number, should_include_version); 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdySynReplyIR syn_reply(stream_id); 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_reply.set_name_value_block(headers); 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_reply.set_fin(fin); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SpdySerializedFrame> spdy_frame( 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) spdy_response_framer_.SerializeSynReply(syn_reply)); 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamFrame frame(kHeadersStreamId, false, 0, 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MakeIOVector(base::StringPiece(spdy_frame->data(), 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) spdy_frame->size()))); 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return MakePacket(header_, QuicFrame(&frame)); 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders( 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& method, 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& scheme, 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& path) { 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdyHeaderBlock headers; 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers[":method"] = method; 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers[":host"] = "www.google.com"; 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers[":path"] = path; 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers[":scheme"] = scheme; 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers[":version"] = "HTTP/1.1"; 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return headers; 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyHeaderBlock QuicTestPacketMaker::GetResponseHeaders( 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& status) { 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdyHeaderBlock headers; 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers[":status"] = status; 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers[":version"] = "HTTP/1.1"; 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers["content-type"] = "text/plain"; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return headers; 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket( 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicPacketHeader& header, 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicFrame& frame) { 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicFrames frames; 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frames.push_back(frame); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicPacket> packet( 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BuildUnsizedDataPacket(&framer, header, frames).packet); 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ENCRYPTION_NONE, header.packet_sequence_number, *packet)); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuicTestPacketMaker::InitializeHeader( 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicPacketSequenceNumber sequence_number, 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool should_include_version) { 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) header_.public_header.connection_id = connection_id_; 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header_.public_header.reset_flag = false; 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header_.public_header.version_flag = should_include_version; 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header_.packet_sequence_number = sequence_number; 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header_.fec_group = 0; 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header_.entropy_flag = false; 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) header_.fec_flag = false; 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace test 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace net 246