Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: net/tools/quic/quic_spdy_server_stream.cc

Issue 111073003: Cleanup of QUIC stream classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/tools/quic/quic_spdy_server_stream.h" 5 #include "net/tools/quic/quic_spdy_server_stream.h"
6 6
7 #include "base/memory/singleton.h"
7 #include "net/quic/quic_session.h" 8 #include "net/quic/quic_session.h"
8 #include "net/spdy/spdy_framer.h" 9 #include "net/spdy/spdy_framer.h"
10 #include "net/tools/quic/quic_in_memory_cache.h"
9 #include "net/tools/quic/spdy_utils.h" 11 #include "net/tools/quic/spdy_utils.h"
10 12
13 using base::StringPiece;
11 using std::string; 14 using std::string;
12 15
13 namespace net { 16 namespace net {
14 namespace tools { 17 namespace tools {
15 18
16 static const size_t kHeaderBufInitialSize = 4096; 19 static const size_t kHeaderBufInitialSize = 4096;
17 20
18 QuicSpdyServerStream::QuicSpdyServerStream(QuicStreamId id, 21 QuicSpdyServerStream::QuicSpdyServerStream(QuicStreamId id,
19 QuicSession* session) 22 QuicSession* session)
20 : QuicReliableServerStream(id, session), 23 : ReliableQuicStream(id, session),
21 read_buf_(new GrowableIOBuffer()), 24 read_buf_(new GrowableIOBuffer()),
22 request_headers_received_(false) { 25 request_headers_received_(false) {
23 } 26 }
24 27
25 QuicSpdyServerStream::~QuicSpdyServerStream() { 28 QuicSpdyServerStream::~QuicSpdyServerStream() {
26 } 29 }
27 30
28 uint32 QuicSpdyServerStream::ProcessData(const char* data, uint32 length) { 31 uint32 QuicSpdyServerStream::ProcessData(const char* data, uint32 length) {
29 uint32 total_bytes_processed = 0; 32 uint32 total_bytes_processed = 0;
30 33
31 // Are we still reading the request headers. 34 // Are we still reading the request headers.
32 if (!request_headers_received_) { 35 if (!request_headers_received_) {
33 // Grow the read buffer if necessary. 36 // Grow the read buffer if necessary.
34 if (read_buf_->RemainingCapacity() < (int)length) { 37 if (read_buf_->RemainingCapacity() < (int)length) {
35 read_buf_->SetCapacity(read_buf_->capacity() + kHeaderBufInitialSize); 38 read_buf_->SetCapacity(read_buf_->capacity() + kHeaderBufInitialSize);
36 } 39 }
37 memcpy(read_buf_->data(), data, length); 40 memcpy(read_buf_->data(), data, length);
38 read_buf_->set_offset(read_buf_->offset() + length); 41 read_buf_->set_offset(read_buf_->offset() + length);
39 ParseRequestHeaders(); 42 ParseRequestHeaders();
40 } else { 43 } else {
41 mutable_body()->append(data + total_bytes_processed, 44 body_.append(data + total_bytes_processed, length - total_bytes_processed);
42 length - total_bytes_processed);
43 } 45 }
44 return length; 46 return length;
45 } 47 }
46 48
47 void QuicSpdyServerStream::OnFinRead() { 49 void QuicSpdyServerStream::OnFinRead() {
48 ReliableQuicStream::OnFinRead(); 50 ReliableQuicStream::OnFinRead();
49 if (write_side_closed() || fin_buffered()) { 51 if (write_side_closed() || fin_buffered()) {
50 return; 52 return;
51 } 53 }
52 54
53 if (!request_headers_received_) { 55 if (!request_headers_received_) {
54 SendErrorResponse(); // We're not done reading headers. 56 SendErrorResponse(); // We're not done reading headers.
55 } else if ((headers().content_length_status() == 57 } else if ((headers().content_length_status() ==
56 BalsaHeadersEnums::VALID_CONTENT_LENGTH) && 58 BalsaHeadersEnums::VALID_CONTENT_LENGTH) &&
57 mutable_body()->size() != headers().content_length()) { 59 body_.size() != headers().content_length()) {
58 SendErrorResponse(); // Invalid content length 60 SendErrorResponse(); // Invalid content length
59 } else { 61 } else {
60 SendResponse(); 62 SendResponse();
61 } 63 }
62 } 64 }
63 65
64 void QuicSpdyServerStream::SendHeaders( 66 void QuicSpdyServerStream::SendHeaders(
65 const BalsaHeaders& response_headers) { 67 const BalsaHeaders& response_headers) {
66 SpdyHeaderBlock header_block = 68 SpdyHeaderBlock header_block =
67 SpdyUtils::ResponseHeadersToSpdyHeaders(response_headers); 69 SpdyUtils::ResponseHeadersToSpdyHeaders(response_headers);
68 70
69 string headers_string; 71 string headers_string;
70 headers_string = session()->compressor()->CompressHeaders(header_block); 72 headers_string = session()->compressor()->CompressHeaders(header_block);
71 73
72 WriteData(headers_string, false); 74 WriteData(headers_string, false);
73 } 75 }
74 76
75 int QuicSpdyServerStream::ParseRequestHeaders() { 77 int QuicSpdyServerStream::ParseRequestHeaders() {
76 size_t read_buf_len = static_cast<size_t>(read_buf_->offset()); 78 size_t read_buf_len = static_cast<size_t>(read_buf_->offset());
77 SpdyFramer framer(SPDY3); 79 SpdyFramer framer(SPDY3);
78 SpdyHeaderBlock headers; 80 SpdyHeaderBlock headers;
79 char* data = read_buf_->StartOfBuffer(); 81 char* data = read_buf_->StartOfBuffer();
80 size_t len = framer.ParseHeaderBlockInBuffer(data, read_buf_->offset(), 82 size_t len = framer.ParseHeaderBlockInBuffer(data, read_buf_->offset(),
81 &headers); 83 &headers);
82 if (len == 0) { 84 if (len == 0) {
83 return -1; 85 return -1;
84 } 86 }
85 87
86 if (!SpdyUtils::FillBalsaRequestHeaders(headers, mutable_headers())) { 88 if (!SpdyUtils::FillBalsaRequestHeaders(headers, &headers_)) {
87 SendErrorResponse(); 89 SendErrorResponse();
88 return -1; 90 return -1;
89 } 91 }
90 92
91 size_t delta = read_buf_len - len; 93 size_t delta = read_buf_len - len;
92 if (delta > 0) { 94 if (delta > 0) {
93 mutable_body()->append(data + len, delta); 95 body_.append(data + len, delta);
94 } 96 }
95 97
96 request_headers_received_ = true; 98 request_headers_received_ = true;
97 return len; 99 return len;
98 } 100 }
99 101
102 void QuicSpdyServerStream::SendResponse() {
103 // Find response in cache. If not found, send error response.
104 const QuicInMemoryCache::Response* response =
105 QuicInMemoryCache::GetInstance()->GetResponse(headers_);
106 if (response == NULL) {
107 SendErrorResponse();
108 return;
109 }
110
111 DLOG(INFO) << "Sending response for stream " << id();
112 SendHeaders(response->headers());
113 WriteData(response->body(), true);
114 }
115
116 void QuicSpdyServerStream::SendErrorResponse() {
117 DLOG(INFO) << "Sending error response for stream " << id();
118 BalsaHeaders headers;
119 headers.SetResponseFirstlineFromStringPieces(
120 "HTTP/1.1", "500", "Server Error");
121 headers.ReplaceOrAppendHeader("content-length", "3");
122 SendHeaders(headers);
123 WriteData("bad", true);
124 }
125
126 QuicConsumedData QuicSpdyServerStream::WriteData(StringPiece data, bool fin) {
127 // We only support SPDY and HTTP, and neither handles bidirectional streaming.
128 if (!read_side_closed()) {
129 CloseReadSide();
130 }
131 return ReliableQuicStream::WriteData(data, fin);
132 }
133
100 } // namespace tools 134 } // namespace tools
101 } // namespace net 135 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/quic_spdy_server_stream.h ('k') | net/tools/quic/quic_spdy_server_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698