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

Side by Side Diff: net/quic/quic_spdy_decompressor.cc

Issue 185203003: Killing off QUICv12, including cleaning out all of the code for handling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Deleted unused StripUint32 Created 6 years, 9 months 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
« no previous file with comments | « net/quic/quic_spdy_decompressor.h ('k') | net/quic/quic_spdy_decompressor_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 #include "net/quic/quic_spdy_decompressor.h"
6
7 #include <algorithm>
8
9 #include "base/logging.h"
10
11 using base::StringPiece;
12 using std::min;
13
14 namespace net {
15
16 class SpdyFramerVisitor : public SpdyFramerVisitorInterface {
17 public:
18 explicit SpdyFramerVisitor(QuicSpdyDecompressor::Visitor* visitor)
19 : visitor_(visitor),
20 error_(false) {
21 }
22
23 virtual void OnError(SpdyFramer* framer) OVERRIDE {
24 error_ = true;
25 }
26 virtual void OnDataFrameHeader(SpdyStreamId stream_id,
27 size_t length,
28 bool fin) OVERRIDE {}
29 virtual void OnStreamFrameData(SpdyStreamId stream_id,
30 const char* data,
31 size_t len,
32 bool fin) OVERRIDE {}
33 virtual bool OnControlFrameHeaderData(SpdyStreamId stream_id,
34 const char* header_data,
35 size_t len) OVERRIDE;
36 virtual void OnSynStream(SpdyStreamId stream_id,
37 SpdyStreamId associated_stream_id,
38 SpdyPriority priority,
39 bool fin,
40 bool unidirectional) OVERRIDE {}
41 virtual void OnSynReply(SpdyStreamId stream_id, bool fin) OVERRIDE {}
42 virtual void OnRstStream(SpdyStreamId stream_id,
43 SpdyRstStreamStatus status) OVERRIDE {}
44 virtual void OnSetting(SpdySettingsIds id,
45 uint8 flags,
46 uint32 value) OVERRIDE {}
47 virtual void OnSettingsAck() OVERRIDE {}
48 virtual void OnSettingsEnd() OVERRIDE {}
49 virtual void OnPing(SpdyPingId unique_id, bool is_ack) OVERRIDE {}
50 virtual void OnGoAway(SpdyStreamId last_accepted_stream_id,
51 SpdyGoAwayStatus status) OVERRIDE {}
52 virtual void OnHeaders(SpdyStreamId stream_id, bool fin) OVERRIDE {}
53 virtual void OnWindowUpdate(SpdyStreamId stream_id,
54 uint32 delta_window_size) OVERRIDE {}
55 virtual void OnPushPromise(SpdyStreamId stream_id,
56 SpdyStreamId promised_stream_id) OVERRIDE {}
57 void set_visitor(QuicSpdyDecompressor::Visitor* visitor) {
58 DCHECK(visitor);
59 visitor_ = visitor;
60 }
61
62 private:
63 QuicSpdyDecompressor::Visitor* visitor_;
64 bool error_;
65 };
66
67 bool SpdyFramerVisitor::OnControlFrameHeaderData(SpdyStreamId stream_id,
68 const char* header_data,
69 size_t len) {
70 DCHECK(visitor_);
71 return visitor_->OnDecompressedData(StringPiece(header_data, len));
72 }
73
74 QuicSpdyDecompressor::QuicSpdyDecompressor()
75 : spdy_framer_(SPDY3),
76 spdy_visitor_(new SpdyFramerVisitor(NULL)),
77 current_header_id_(1),
78 has_current_compressed_size_(false),
79 current_compressed_size_(0),
80 compressed_bytes_consumed_(0) {
81 spdy_framer_.set_visitor(spdy_visitor_.get());
82 }
83
84 QuicSpdyDecompressor::~QuicSpdyDecompressor() {
85 }
86
87 size_t QuicSpdyDecompressor::DecompressData(StringPiece data,
88 Visitor* visitor) {
89 spdy_visitor_->set_visitor(visitor);
90 size_t bytes_consumed = 0;
91
92 if (!has_current_compressed_size_) {
93 const size_t kCompressedBufferSizeSize = sizeof(uint32);
94 DCHECK_GT(kCompressedBufferSizeSize, compressed_size_buffer_.length());
95 size_t missing_size =
96 kCompressedBufferSizeSize - compressed_size_buffer_.length();
97 if (data.length() < missing_size) {
98 data.AppendToString(&compressed_size_buffer_);
99 return data.length();
100 }
101 bytes_consumed += missing_size;
102 data.substr(0, missing_size).AppendToString(&compressed_size_buffer_);
103 DCHECK_EQ(kCompressedBufferSizeSize, compressed_size_buffer_.length());
104 memcpy(&current_compressed_size_, compressed_size_buffer_.data(),
105 kCompressedBufferSizeSize);
106 compressed_size_buffer_.clear();
107 has_current_compressed_size_ = true;
108 data = data.substr(missing_size);
109 compressed_bytes_consumed_ = 0;
110 }
111
112 size_t bytes_to_consume =
113 min(current_compressed_size_ - compressed_bytes_consumed_,
114 static_cast<uint32>(data.length()));
115 if (bytes_to_consume > 0) {
116 if (!spdy_framer_.IncrementallyDecompressControlFrameHeaderData(
117 current_header_id_, data.data(), bytes_to_consume)) {
118 visitor->OnDecompressionError();
119 return bytes_consumed;
120 }
121 compressed_bytes_consumed_ += bytes_to_consume;
122 bytes_consumed += bytes_to_consume;
123 }
124 if (current_compressed_size_ - compressed_bytes_consumed_ == 0) {
125 ResetForNextHeaders();
126 }
127 return bytes_consumed;
128 }
129
130 void QuicSpdyDecompressor::ResetForNextHeaders() {
131 has_current_compressed_size_ = false;
132 current_compressed_size_ = 0;
133 compressed_bytes_consumed_ = 0;
134 ++current_header_id_;
135 }
136
137 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_spdy_decompressor.h ('k') | net/quic/quic_spdy_decompressor_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698