diff options
Diffstat (limited to 'src/examples/mhd2spdy_spdy.c')
-rw-r--r-- | src/examples/mhd2spdy_spdy.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/examples/mhd2spdy_spdy.c b/src/examples/mhd2spdy_spdy.c index e7464c6a..17f170c1 100644 --- a/src/examples/mhd2spdy_spdy.c +++ b/src/examples/mhd2spdy_spdy.c | |||
@@ -147,6 +147,20 @@ spdy_cb_send(spdylay_session *session, | |||
147 | ssize_t rv; | 147 | ssize_t rv; |
148 | connection = (struct SPDY_Connection*)user_data; | 148 | connection = (struct SPDY_Connection*)user_data; |
149 | connection->want_io = IO_NONE; | 149 | connection->want_io = IO_NONE; |
150 | |||
151 | if(glob_opt.ignore_rst_stream | ||
152 | && 16 == length | ||
153 | && 0x80 == data[0] | ||
154 | && 0x00 == data[2] | ||
155 | && 0x03 == data[3] | ||
156 | ) | ||
157 | { | ||
158 | PRINT_INFO2("ignoring RST_STREAM for stream_id %i %i %i %i", data[8], data[9], data[10], data[11]); | ||
159 | glob_opt.ignore_rst_stream = false; | ||
160 | return 16; | ||
161 | } | ||
162 | glob_opt.ignore_rst_stream = false; | ||
163 | |||
150 | if(connection->is_tls) | 164 | if(connection->is_tls) |
151 | { | 165 | { |
152 | ERR_clear_error(); | 166 | ERR_clear_error(); |
@@ -269,7 +283,7 @@ spdy_cb_recv(spdylay_session *session, | |||
269 | 283 | ||
270 | 284 | ||
271 | static void | 285 | static void |
272 | spdy_cb_on_ctrl_send(spdylay_session *session, | 286 | spdy_cb_before_ctrl_send(spdylay_session *session, |
273 | spdylay_frame_type type, | 287 | spdylay_frame_type type, |
274 | spdylay_frame *frame, | 288 | spdylay_frame *frame, |
275 | void *user_data) | 289 | void *user_data) |
@@ -288,6 +302,15 @@ spdy_cb_on_ctrl_send(spdylay_session *session, | |||
288 | ++proxy->spdy_connection->streams_opened; | 302 | ++proxy->spdy_connection->streams_opened; |
289 | PRINT_INFO2("opening stream: str open %i; %s", glob_opt.streams_opened, proxy->url); | 303 | PRINT_INFO2("opening stream: str open %i; %s", glob_opt.streams_opened, proxy->url); |
290 | break; | 304 | break; |
305 | case SPDYLAY_RST_STREAM: | ||
306 | //try to ignore duplicate RST_STREAMs | ||
307 | //TODO this will ignore RST_STREAMs also for bogus data | ||
308 | glob_opt.ignore_rst_stream = NULL==spdylay_session_get_stream_user_data(session, frame->rst_stream.stream_id); | ||
309 | PRINT_INFO2("sending RST_STREAM for %i; ignore %i; status %i", | ||
310 | frame->rst_stream.stream_id, | ||
311 | glob_opt.ignore_rst_stream, | ||
312 | frame->rst_stream.status_code); | ||
313 | break; | ||
291 | default: | 314 | default: |
292 | break; | 315 | break; |
293 | } | 316 | } |
@@ -465,7 +488,7 @@ spdy_setup_spdylay_callbacks(spdylay_session_callbacks *callbacks) | |||
465 | memset(callbacks, 0, sizeof(spdylay_session_callbacks)); | 488 | memset(callbacks, 0, sizeof(spdylay_session_callbacks)); |
466 | callbacks->send_callback = spdy_cb_send; | 489 | callbacks->send_callback = spdy_cb_send; |
467 | callbacks->recv_callback = spdy_cb_recv; | 490 | callbacks->recv_callback = spdy_cb_recv; |
468 | callbacks->on_ctrl_send_callback = spdy_cb_on_ctrl_send; | 491 | callbacks->before_ctrl_send_callback = spdy_cb_before_ctrl_send; |
469 | callbacks->on_ctrl_recv_callback = spdy_cb_on_ctrl_recv; | 492 | callbacks->on_ctrl_recv_callback = spdy_cb_on_ctrl_recv; |
470 | callbacks->on_stream_close_callback = spdy_cb_on_stream_close; | 493 | callbacks->on_stream_close_callback = spdy_cb_on_stream_close; |
471 | callbacks->on_data_chunk_recv_callback = spdy_cb_on_data_chunk_recv; | 494 | callbacks->on_data_chunk_recv_callback = spdy_cb_on_data_chunk_recv; |