@@ -83,72 +83,79 @@ class Stream : public LinkedObject<Stream> {
83
83
// buffer level.
84
84
enum class StreamState { PendingHeaders, PendingDataOrTrailers, Closed };
85
85
86
+ struct DirectionalState {
87
+ StreamEncoder* encoder_;
88
+ NiceMock<MockStreamDecoder> decoder_;
89
+ StreamState stream_state_;
90
+ uint32_t read_disable_count_{};
91
+ } request_, response_;
92
+
86
93
Stream (TestClientConnectionImpl& client, const TestHeaderMapImpl& request_headers,
87
- bool end_stream)
88
- : request_encoder_( &client.newStream(response_decoder_)) {
94
+ bool end_stream) {
95
+ request_. encoder_ = &client.newStream (response_. decoder_ );
89
96
ON_CALL (server_stream_callbacks_, onResetStream (_)).WillByDefault (InvokeWithoutArgs ([this ] {
90
- request_state_ = response_state_ = StreamState::Closed;
97
+ request_. stream_state_ = response_. stream_state_ = StreamState::Closed;
91
98
}));
92
- request_encoder_ ->encodeHeaders (request_headers, end_stream);
93
- request_state_ = end_stream ? StreamState::Closed : StreamState::PendingDataOrTrailers;
94
- response_state_ = StreamState::PendingHeaders;
99
+ request_. encoder_ ->encodeHeaders (request_headers, end_stream);
100
+ request_. stream_state_ = end_stream ? StreamState::Closed : StreamState::PendingDataOrTrailers;
101
+ response_. stream_state_ = StreamState::PendingHeaders;
95
102
}
96
103
97
104
// Some stream action applied in either the request or resposne direction.
98
- void directionalAction (StreamState & state, StreamEncoder& encoder ,
105
+ void directionalAction (DirectionalState & state,
99
106
const test::common::http::http2::DirectionalAction& directional_action) {
100
107
const bool end_stream = directional_action.end_stream ();
101
108
switch (directional_action.directional_action_selector_case ()) {
102
109
case test::common::http::http2::DirectionalAction::kContinueHeaders : {
103
- if (state == StreamState::PendingHeaders) {
110
+ if (state. stream_state_ == StreamState::PendingHeaders) {
104
111
Http::TestHeaderMapImpl headers = Fuzz::fromHeaders (directional_action.continue_headers ());
105
112
headers.setReferenceKey (Headers::get ().Status , " 100" );
106
- encoder. encode100ContinueHeaders (headers);
113
+ state. encoder_ -> encode100ContinueHeaders (headers);
107
114
}
108
115
break ;
109
116
}
110
117
case test::common::http::http2::DirectionalAction::kHeaders : {
111
- if (state == StreamState::PendingHeaders) {
112
- encoder. encodeHeaders (Fuzz::fromHeaders (directional_action.headers ()), end_stream);
113
- state = end_stream ? StreamState::Closed : StreamState::PendingDataOrTrailers;
118
+ if (state. stream_state_ == StreamState::PendingHeaders) {
119
+ state. encoder_ -> encodeHeaders (Fuzz::fromHeaders (directional_action.headers ()), end_stream);
120
+ state. stream_state_ = end_stream ? StreamState::Closed : StreamState::PendingDataOrTrailers;
114
121
}
115
122
break ;
116
123
}
117
124
case test::common::http::http2::DirectionalAction::kData : {
118
- if (state == StreamState::PendingDataOrTrailers) {
125
+ if (state. stream_state_ == StreamState::PendingDataOrTrailers) {
119
126
Buffer::OwnedImpl buf (std::string (directional_action.data () % (1024 * 1024 ), ' a' ));
120
- encoder. encodeData (buf, end_stream);
121
- state = end_stream ? StreamState::Closed : StreamState::PendingDataOrTrailers;
127
+ state. encoder_ -> encodeData (buf, end_stream);
128
+ state. stream_state_ = end_stream ? StreamState::Closed : StreamState::PendingDataOrTrailers;
122
129
}
123
130
break ;
124
131
}
125
132
case test::common::http::http2::DirectionalAction::kTrailers : {
126
- if (state == StreamState::PendingDataOrTrailers) {
127
- encoder. encodeTrailers (Fuzz::fromHeaders (directional_action.trailers ()));
128
- state = StreamState::Closed;
133
+ if (state. stream_state_ == StreamState::PendingDataOrTrailers) {
134
+ state. encoder_ -> encodeTrailers (Fuzz::fromHeaders (directional_action.trailers ()));
135
+ state. stream_state_ = StreamState::Closed;
129
136
}
130
137
break ;
131
138
}
132
139
case test::common::http::http2::DirectionalAction::kResetStream : {
133
- if (state != StreamState::Closed) {
134
- encoder. getStream ().resetStream (
140
+ if (state. stream_state_ != StreamState::Closed) {
141
+ state. encoder_ -> getStream ().resetStream (
135
142
static_cast <Http::StreamResetReason>(directional_action.reset_stream ()));
136
- request_state_ = response_state_ = StreamState::Closed;
143
+ request_. stream_state_ = response_. stream_state_ = StreamState::Closed;
137
144
}
138
145
break ;
139
146
}
140
147
case test::common::http::http2::DirectionalAction::kReadDisable : {
141
- if (state != StreamState::Closed) {
148
+ if (state. stream_state_ != StreamState::Closed) {
142
149
const bool disable = directional_action.read_disable ();
143
- if (read_disable_count_ == 0 && !disable) {
150
+ if (state. read_disable_count_ == 0 && !disable) {
144
151
return ;
145
152
}
146
153
if (disable) {
147
- ++read_disable_count_;
154
+ ++state. read_disable_count_ ;
148
155
} else {
149
- --read_disable_count_;
156
+ --state. read_disable_count_ ;
150
157
}
151
- encoder. getStream ().readDisable (disable);
158
+ state. encoder_ -> getStream ().readDisable (disable);
152
159
}
153
160
break ;
154
161
}
@@ -161,11 +168,11 @@ class Stream : public LinkedObject<Stream> {
161
168
void streamAction (const test::common::http::http2::StreamAction& stream_action) {
162
169
switch (stream_action.stream_action_selector_case ()) {
163
170
case test::common::http::http2::StreamAction::kRequest : {
164
- directionalAction (request_state_, *request_encoder_ , stream_action.request ());
171
+ directionalAction (request_ , stream_action.request ());
165
172
break ;
166
173
}
167
174
case test::common::http::http2::StreamAction::kResponse : {
168
- directionalAction (response_state_, *response_encoder_ , stream_action.response ());
175
+ directionalAction (response_ , stream_action.response ());
169
176
break ;
170
177
}
171
178
default :
@@ -175,13 +182,6 @@ class Stream : public LinkedObject<Stream> {
175
182
}
176
183
177
184
NiceMock<MockStreamCallbacks> server_stream_callbacks_;
178
- NiceMock<MockStreamDecoder> response_decoder_;
179
- StreamEncoder* request_encoder_;
180
- StreamEncoder* response_encoder_;
181
- NiceMock<MockStreamDecoder> request_decoder_;
182
- StreamState request_state_;
183
- StreamState response_state_;
184
- uint32_t read_disable_count_{};
185
185
};
186
186
187
187
// Buffer between client and server H2 codecs. This models each write operation
@@ -283,9 +283,9 @@ DEFINE_PROTO_FUZZER(const test::common::http::http2::CodecImplFuzzTestCase& inpu
283
283
auto stream_ptr = pending_streams.front ()->removeFromList (pending_streams);
284
284
Stream* const stream = stream_ptr.get ();
285
285
stream_ptr->moveIntoListBack (std::move (stream_ptr), streams);
286
- stream->response_encoder_ = &encoder;
286
+ stream->response_ . encoder_ = &encoder;
287
287
encoder.getStream ().addCallbacks (stream->server_stream_callbacks_ );
288
- return stream->request_decoder_ ;
288
+ return stream->request_ . decoder_ ;
289
289
}));
290
290
291
291
try {
0 commit comments