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

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

Issue 1980663003: Add a new QUIC ChloExtractor class used by the QuicProxyDispatcher to extract CHLO message from pac… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@121403250
Patch Set: review feedback (#1) Created 4 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
« no previous file with comments | « net/tools/quic/chlo_extractor.h ('k') | net/tools/quic/chlo_extractor_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) 2016 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/tools/quic/chlo_extractor.h"
6
7 #include "net/quic/crypto/crypto_framer.h"
8 #include "net/quic/crypto/crypto_handshake_message.h"
9 #include "net/quic/crypto/crypto_protocol.h"
10 #include "net/quic/crypto/quic_decrypter.h"
11 #include "net/quic/crypto/quic_encrypter.h"
12 #include "net/quic/quic_framer.h"
13
14 using base::StringPiece;
15
16 namespace net {
17
18 namespace {
19
20 class ChloFramerVisitor : public QuicFramerVisitorInterface,
21 public CryptoFramerVisitorInterface {
22 public:
23 ChloFramerVisitor(QuicFramer* framer, ChloExtractor::Delegate* delegate);
24
25 ~ChloFramerVisitor() override {}
26
27 // QuicFramerVisitorInterface implementation
28 void OnError(QuicFramer* framer) override {}
29 bool OnProtocolVersionMismatch(QuicVersion version) override;
30 void OnPacket() override {}
31 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {}
32 void OnVersionNegotiationPacket(
33 const QuicVersionNegotiationPacket& packet) override {}
34 bool OnUnauthenticatedPublicHeader(
35 const QuicPacketPublicHeader& header) override;
36 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override;
37 void OnDecryptedPacket(EncryptionLevel level) override {}
38 bool OnPacketHeader(const QuicPacketHeader& header) override;
39 bool OnStreamFrame(const QuicStreamFrame& frame) override;
40 bool OnAckFrame(const QuicAckFrame& frame) override;
41 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override;
42 bool OnPingFrame(const QuicPingFrame& frame) override;
43 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override;
44 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override;
45 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override;
46 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override;
47 bool OnBlockedFrame(const QuicBlockedFrame& frame) override;
48 bool OnPathCloseFrame(const QuicPathCloseFrame& frame) override;
49 bool OnPaddingFrame(const QuicPaddingFrame& frame) override;
50 void OnPacketComplete() override {}
51
52 // CryptoFramerVisitorInterface implementation.
53 void OnError(CryptoFramer* framer) override;
54 void OnHandshakeMessage(const CryptoHandshakeMessage& message) override;
55
56 bool found_chlo() { return found_chlo_; }
57
58 private:
59 QuicFramer* framer_;
60 ChloExtractor::Delegate* delegate_;
61 bool found_chlo_;
62 QuicConnectionId connection_id_;
63 };
64
65 ChloFramerVisitor::ChloFramerVisitor(QuicFramer* framer,
66 ChloExtractor::Delegate* delegate)
67 : framer_(framer),
68 delegate_(delegate),
69 found_chlo_(false),
70 connection_id_(0) {}
71
72 bool ChloFramerVisitor::OnProtocolVersionMismatch(QuicVersion version) {
73 if (!framer_->IsSupportedVersion(version)) {
74 return false;
75 }
76 framer_->set_version(version);
77 return true;
78 }
79
80 bool ChloFramerVisitor::OnUnauthenticatedPublicHeader(
81 const QuicPacketPublicHeader& header) {
82 connection_id_ = header.connection_id;
83 return true;
84 }
85 bool ChloFramerVisitor::OnUnauthenticatedHeader(
86 const QuicPacketHeader& header) {
87 return true;
88 }
89 bool ChloFramerVisitor::OnPacketHeader(const QuicPacketHeader& header) {
90 return true;
91 }
92 bool ChloFramerVisitor::OnStreamFrame(const QuicStreamFrame& frame) {
93 StringPiece data(frame.frame_buffer, frame.frame_length);
94 if (frame.stream_id == kCryptoStreamId && frame.offset == 0 &&
95 data.starts_with("CHLO")) {
96 CryptoFramer crypto_framer;
97 crypto_framer.set_visitor(this);
98 if (!crypto_framer.ProcessInput(data)) {
99 return false;
100 }
101 }
102 return true;
103 }
104
105 bool ChloFramerVisitor::OnAckFrame(const QuicAckFrame& frame) {
106 return true;
107 }
108
109 bool ChloFramerVisitor::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) {
110 return true;
111 }
112
113 bool ChloFramerVisitor::OnPingFrame(const QuicPingFrame& frame) {
114 return true;
115 }
116
117 bool ChloFramerVisitor::OnRstStreamFrame(const QuicRstStreamFrame& frame) {
118 return true;
119 }
120
121 bool ChloFramerVisitor::OnConnectionCloseFrame(
122 const QuicConnectionCloseFrame& frame) {
123 return true;
124 }
125
126 bool ChloFramerVisitor::OnGoAwayFrame(const QuicGoAwayFrame& frame) {
127 return true;
128 }
129
130 bool ChloFramerVisitor::OnWindowUpdateFrame(
131 const QuicWindowUpdateFrame& frame) {
132 return true;
133 }
134
135 bool ChloFramerVisitor::OnBlockedFrame(const QuicBlockedFrame& frame) {
136 return true;
137 }
138
139 bool ChloFramerVisitor::OnPathCloseFrame(const QuicPathCloseFrame& frame) {
140 return true;
141 }
142
143 bool ChloFramerVisitor::OnPaddingFrame(const QuicPaddingFrame& frame) {
144 return true;
145 }
146
147 void ChloFramerVisitor::OnError(CryptoFramer* framer) {}
148
149 void ChloFramerVisitor::OnHandshakeMessage(
150 const CryptoHandshakeMessage& message) {
151 delegate_->OnChlo(framer_->version(), connection_id_, message);
152 found_chlo_ = true;
153 }
154
155 } // namespace
156
157 // static
158 bool ChloExtractor::Extract(const QuicEncryptedPacket& packet,
159 const QuicVersionVector& versions,
160 Delegate* delegate) {
161 QuicFramer framer(versions, QuicTime::Zero(), Perspective::IS_SERVER);
162 ChloFramerVisitor visitor(&framer, delegate);
163 framer.set_visitor(&visitor);
164 if (!framer.ProcessPacket(packet)) {
165 return false;
166 }
167 return visitor.found_chlo();
168 }
169
170 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/chlo_extractor.h ('k') | net/tools/quic/chlo_extractor_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698