| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/quic/quic_headers_stream.h" | 5 #include "net/quic/quic_headers_stream.h" |
| 6 | 6 |
| 7 #include "net/quic/quic_session.h" | 7 #include "net/quic/quic_session.h" |
| 8 | 8 |
| 9 using base::StringPiece; | 9 using base::StringPiece; |
| 10 | 10 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 SpdyFrameType type, | 147 SpdyFrameType type, |
| 148 size_t frame_len) OVERRIDE { | 148 size_t frame_len) OVERRIDE { |
| 149 if (stream_->IsConnected()) { | 149 if (stream_->IsConnected()) { |
| 150 stream_->OnCompressedFrameSize(frame_len); | 150 stream_->OnCompressedFrameSize(frame_len); |
| 151 } | 151 } |
| 152 } | 152 } |
| 153 | 153 |
| 154 private: | 154 private: |
| 155 void CloseConnection(const string& details) { | 155 void CloseConnection(const string& details) { |
| 156 if (stream_->IsConnected()) { | 156 if (stream_->IsConnected()) { |
| 157 stream_->CloseConnectionWithDetails( | 157 stream_->CloseConnectionWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 158 QUIC_INVALID_HEADERS_STREAM_DATA, details); | 158 details); |
| 159 } | 159 } |
| 160 } | 160 } |
| 161 | 161 |
| 162 private: | 162 private: |
| 163 QuicHeadersStream* stream_; | 163 QuicHeadersStream* stream_; |
| 164 | 164 |
| 165 DISALLOW_COPY_AND_ASSIGN(SpdyFramerVisitor); | 165 DISALLOW_COPY_AND_ASSIGN(SpdyFramerVisitor); |
| 166 }; | 166 }; |
| 167 | 167 |
| 168 QuicHeadersStream::QuicHeadersStream(QuicSession* session) | 168 QuicHeadersStream::QuicHeadersStream(QuicSession* session) |
| 169 : ReliableQuicStream(kHeadersStreamId, session), | 169 : ReliableQuicStream(kHeadersStreamId, session), |
| 170 stream_id_(kInvalidStreamId), | 170 stream_id_(kInvalidStreamId), |
| 171 fin_(false), | 171 fin_(false), |
| 172 frame_len_(0), | 172 frame_len_(0), |
| 173 spdy_framer_(SPDY3), | 173 spdy_framer_(SPDY3), |
| 174 spdy_framer_visitor_(new SpdyFramerVisitor(this)) { | 174 spdy_framer_visitor_(new SpdyFramerVisitor(this)) { |
| 175 spdy_framer_.set_visitor(spdy_framer_visitor_.get()); | 175 spdy_framer_.set_visitor(spdy_framer_visitor_.get()); |
| 176 spdy_framer_.set_debug_visitor(spdy_framer_visitor_.get()); | 176 spdy_framer_.set_debug_visitor(spdy_framer_visitor_.get()); |
| 177 DisableFlowControl(); | 177 DisableFlowControl(); |
| 178 } | 178 } |
| 179 | 179 |
| 180 QuicHeadersStream::~QuicHeadersStream() {} | 180 QuicHeadersStream::~QuicHeadersStream() { |
| 181 } |
| 181 | 182 |
| 182 size_t QuicHeadersStream::WriteHeaders( | 183 size_t QuicHeadersStream::WriteHeaders( |
| 183 QuicStreamId stream_id, | 184 QuicStreamId stream_id, |
| 184 const SpdyHeaderBlock& headers, | 185 const SpdyHeaderBlock& headers, |
| 185 bool fin, | 186 bool fin, |
| 186 QuicAckNotifier::DelegateInterface* ack_notifier_delegate) { | 187 QuicAckNotifier::DelegateInterface* ack_notifier_delegate) { |
| 187 scoped_ptr<SpdySerializedFrame> frame; | 188 scoped_ptr<SpdySerializedFrame> frame; |
| 188 if (session()->is_server()) { | 189 if (session()->is_server()) { |
| 189 SpdySynReplyIR syn_reply(stream_id); | 190 SpdySynReplyIR syn_reply(stream_id); |
| 190 syn_reply.set_name_value_block(headers); | 191 syn_reply.set_name_value_block(headers); |
| 191 syn_reply.set_fin(fin); | 192 syn_reply.set_fin(fin); |
| 192 frame.reset(spdy_framer_.SerializeFrame(syn_reply)); | 193 frame.reset(spdy_framer_.SerializeFrame(syn_reply)); |
| 193 } else { | 194 } else { |
| 194 SpdySynStreamIR syn_stream(stream_id); | 195 SpdySynStreamIR syn_stream(stream_id); |
| 195 syn_stream.set_name_value_block(headers); | 196 syn_stream.set_name_value_block(headers); |
| 196 syn_stream.set_fin(fin); | 197 syn_stream.set_fin(fin); |
| 197 frame.reset(spdy_framer_.SerializeFrame(syn_stream)); | 198 frame.reset(spdy_framer_.SerializeFrame(syn_stream)); |
| 198 } | 199 } |
| 199 WriteOrBufferData(StringPiece(frame->data(), frame->size()), false, | 200 WriteOrBufferData( |
| 200 ack_notifier_delegate); | 201 StringPiece(frame->data(), frame->size()), false, ack_notifier_delegate); |
| 201 return frame->size(); | 202 return frame->size(); |
| 202 } | 203 } |
| 203 | 204 |
| 204 uint32 QuicHeadersStream::ProcessRawData(const char* data, | 205 uint32 QuicHeadersStream::ProcessRawData(const char* data, uint32 data_len) { |
| 205 uint32 data_len) { | |
| 206 return spdy_framer_.ProcessInput(data, data_len); | 206 return spdy_framer_.ProcessInput(data, data_len); |
| 207 } | 207 } |
| 208 | 208 |
| 209 QuicPriority QuicHeadersStream::EffectivePriority() const { return 0; } | 209 QuicPriority QuicHeadersStream::EffectivePriority() const { |
| 210 return 0; |
| 211 } |
| 210 | 212 |
| 211 void QuicHeadersStream::OnSynStream(SpdyStreamId stream_id, | 213 void QuicHeadersStream::OnSynStream(SpdyStreamId stream_id, |
| 212 SpdyPriority priority, | 214 SpdyPriority priority, |
| 213 bool fin) { | 215 bool fin) { |
| 214 if (!session()->is_server()) { | 216 if (!session()->is_server()) { |
| 215 CloseConnectionWithDetails( | 217 CloseConnectionWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 216 QUIC_INVALID_HEADERS_STREAM_DATA, | 218 "SPDY SYN_STREAM frame received at the client"); |
| 217 "SPDY SYN_STREAM frame received at the client"); | |
| 218 return; | 219 return; |
| 219 } | 220 } |
| 220 DCHECK_EQ(kInvalidStreamId, stream_id_); | 221 DCHECK_EQ(kInvalidStreamId, stream_id_); |
| 221 stream_id_ = stream_id; | 222 stream_id_ = stream_id; |
| 222 fin_ = fin; | 223 fin_ = fin; |
| 223 session()->OnStreamHeadersPriority(stream_id, priority); | 224 session()->OnStreamHeadersPriority(stream_id, priority); |
| 224 } | 225 } |
| 225 | 226 |
| 226 void QuicHeadersStream::OnSynReply(SpdyStreamId stream_id, bool fin) { | 227 void QuicHeadersStream::OnSynReply(SpdyStreamId stream_id, bool fin) { |
| 227 if (session()->is_server()) { | 228 if (session()->is_server()) { |
| 228 CloseConnectionWithDetails( | 229 CloseConnectionWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 229 QUIC_INVALID_HEADERS_STREAM_DATA, | 230 "SPDY SYN_REPLY frame received at the server"); |
| 230 "SPDY SYN_REPLY frame received at the server"); | |
| 231 return; | 231 return; |
| 232 } | 232 } |
| 233 DCHECK_EQ(kInvalidStreamId, stream_id_); | 233 DCHECK_EQ(kInvalidStreamId, stream_id_); |
| 234 stream_id_ = stream_id; | 234 stream_id_ = stream_id; |
| 235 fin_ = fin; | 235 fin_ = fin; |
| 236 } | 236 } |
| 237 | 237 |
| 238 void QuicHeadersStream::OnControlFrameHeaderData(SpdyStreamId stream_id, | 238 void QuicHeadersStream::OnControlFrameHeaderData(SpdyStreamId stream_id, |
| 239 const char* header_data, | 239 const char* header_data, |
| 240 size_t len) { | 240 size_t len) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 256 DCHECK_EQ(kInvalidStreamId, stream_id_); | 256 DCHECK_EQ(kInvalidStreamId, stream_id_); |
| 257 DCHECK_EQ(0u, frame_len_); | 257 DCHECK_EQ(0u, frame_len_); |
| 258 frame_len_ = frame_len; | 258 frame_len_ = frame_len; |
| 259 } | 259 } |
| 260 | 260 |
| 261 bool QuicHeadersStream::IsConnected() { | 261 bool QuicHeadersStream::IsConnected() { |
| 262 return session()->connection()->connected(); | 262 return session()->connection()->connected(); |
| 263 } | 263 } |
| 264 | 264 |
| 265 } // namespace net | 265 } // namespace net |
| OLD | NEW |