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

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

Issue 14651009: Land Recent QUIC changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix integer constant is too large for 'unsigned long' type Created 7 years, 7 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 OnSynStream(SpdyStreamId stream_id,
27 SpdyStreamId associated_stream_id,
28 SpdyPriority priority,
29 uint8 credential_slot,
30 bool fin,
31 bool unidirectional) OVERRIDE {}
32 virtual void OnSynReply(SpdyStreamId stream_id, bool fin) OVERRIDE {}
33 virtual void OnHeaders(SpdyStreamId stream_id, bool fin) OVERRIDE {}
34 virtual bool OnControlFrameHeaderData(SpdyStreamId stream_id,
35 const char* header_data,
36 size_t len) OVERRIDE;
37 virtual bool OnCredentialFrameData(const char* credential_data,
38 size_t len) OVERRIDE {
39 return false;
40 }
41 virtual void OnDataFrameHeader(SpdyStreamId stream_id,
42 size_t length,
43 bool fin) OVERRIDE {}
44 virtual void OnStreamFrameData(SpdyStreamId stream_id,
45 const char* data,
46 size_t len,
47 bool fin) OVERRIDE {}
48 virtual void OnSetting(SpdySettingsIds id,
49 uint8 flags,
50 uint32 value) OVERRIDE {}
51 virtual void OnPing(uint32 unique_id) OVERRIDE {}
52 virtual void OnRstStream(SpdyStreamId stream_id,
53 SpdyRstStreamStatus status) OVERRIDE {}
54 virtual void OnGoAway(SpdyStreamId last_accepted_stream_id,
55 SpdyGoAwayStatus status) OVERRIDE {}
56 virtual void OnWindowUpdate(SpdyStreamId stream_id,
57 uint32 delta_window_size) OVERRIDE {}
58 virtual void OnSynStreamCompressed(size_t uncompressed_size,
59 size_t compressed_size) OVERRIDE {}
60 void set_visitor(QuicSpdyDecompressor::Visitor* visitor) {
61 DCHECK(visitor);
62 visitor_ = visitor;
63 }
64
65 private:
66 QuicSpdyDecompressor::Visitor* visitor_;
67 bool error_;
68 };
69
70 bool SpdyFramerVisitor::OnControlFrameHeaderData(SpdyStreamId stream_id,
71 const char* header_data,
72 size_t len) {
73 DCHECK(visitor_);
74 return visitor_->OnDecompressedData(StringPiece(header_data, len));
75 }
76
77 QuicSpdyDecompressor::QuicSpdyDecompressor()
78 : spdy_framer_(3),
79 spdy_visitor_(new SpdyFramerVisitor(NULL)),
80 current_header_id_(1),
81 has_current_compressed_size_(false),
82 current_compressed_size_(0),
83 compressed_bytes_consumed_(0) {
84 spdy_framer_.set_visitor(spdy_visitor_.get());
85 }
86
87 QuicSpdyDecompressor::~QuicSpdyDecompressor() {
88 }
89
90 size_t QuicSpdyDecompressor::DecompressData(StringPiece data,
91 Visitor* visitor) {
92 spdy_visitor_->set_visitor(visitor);
93 size_t bytes_consumed = 0;
94
95 if (!has_current_compressed_size_) {
96 const size_t kCompressedBufferSizeSize = sizeof(uint32);
97 DCHECK_GT(kCompressedBufferSizeSize, compressed_size_buffer_.length());
98 size_t missing_size =
99 kCompressedBufferSizeSize - compressed_size_buffer_.length();
100 if (data.length() < missing_size) {
101 data.AppendToString(&compressed_size_buffer_);
102 return data.length();
103 }
104 bytes_consumed += missing_size;
105 data.substr(0, missing_size).AppendToString(&compressed_size_buffer_);
106 DCHECK_EQ(kCompressedBufferSizeSize, compressed_size_buffer_.length());
107 memcpy(&current_compressed_size_, compressed_size_buffer_.data(),
108 kCompressedBufferSizeSize);
109 compressed_size_buffer_.clear();
110 has_current_compressed_size_ = true;
111 data = data.substr(missing_size);
112 compressed_bytes_consumed_ = 0;
113 }
114
115 size_t bytes_to_consume =
116 min(current_compressed_size_ - compressed_bytes_consumed_,
117 static_cast<uint32>(data.length()));
118 if (bytes_to_consume > 0) {
119 bool success = spdy_framer_.IncrementallyDecompressControlFrameHeaderData(
120 current_header_id_, data.data(), bytes_to_consume);
121 DCHECK(success);
122 compressed_bytes_consumed_ += bytes_to_consume;
123 bytes_consumed += bytes_to_consume;
124 }
125 if (current_compressed_size_ - compressed_bytes_consumed_ == 0) {
126 ResetForNextHeaders();
127 }
128 return bytes_consumed;
129 }
130
131 void QuicSpdyDecompressor::ResetForNextHeaders() {
132 has_current_compressed_size_ = false;
133 current_compressed_size_ = 0;
134 compressed_bytes_consumed_ = 0;
135 ++current_header_id_;
136 }
137
138 } // 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