Makarand Dharmapurikar | 323bfa7 | 2016-12-01 10:51:10 -0800 | [diff] [blame^] | 1 | import logging |
| 2 | import http2_base_server |
| 3 | |
| 4 | class TestcaseGoaway(object): |
| 5 | """ |
| 6 | This test does the following: |
| 7 | Process incoming request normally, i.e. send headers, data and trailers. |
| 8 | Then send a GOAWAY frame with the stream id of the processed request. |
| 9 | It assert that the next request is made on a different TCP connection. |
| 10 | """ |
| 11 | def __init__(self, iteration): |
| 12 | self._base_server = http2_base_server.H2ProtocolBaseServer() |
| 13 | self._base_server._handlers['RequestReceived'] = self.on_request_received |
| 14 | self._base_server._handlers['DataReceived'] = self.on_data_received |
| 15 | self._base_server._handlers['WindowUpdated'] = self.on_window_update_default |
| 16 | self._base_server._handlers['SendDone'] = self.on_send_done |
| 17 | self._base_server._handlers['ConnectionLost'] = self.on_connection_lost |
| 18 | self._ready_to_send = False |
| 19 | self._iteration = iteration |
| 20 | |
| 21 | def get_base_server(self): |
| 22 | return self._base_server |
| 23 | |
| 24 | def on_connection_lost(self, reason): |
| 25 | logging.info('Disconnect received. Count %d'%self._iteration) |
| 26 | # _iteration == 2 => Two different connections have been used. |
| 27 | if self._iteration == 2: |
| 28 | self._base_server.on_connection_lost(reason) |
| 29 | |
| 30 | def on_send_done(self): |
| 31 | self._base_server.on_send_done_default() |
| 32 | if self._base_server._stream_id == 1: |
| 33 | logging.info('Sending GOAWAY for stream 1') |
| 34 | self._base_server._conn.close_connection(error_code=0, additional_data=None, last_stream_id=1) |
| 35 | |
| 36 | def on_request_received(self, event): |
| 37 | self._ready_to_send = False |
| 38 | self._base_server.on_request_received_default(event) |
| 39 | |
| 40 | def on_data_received(self, event): |
| 41 | self._base_server.on_data_received_default(event) |
| 42 | sr = self._base_server.parse_received_data(self._base_server._recv_buffer) |
| 43 | if sr: |
| 44 | logging.info('Creating response size = %s'%sr.response_size) |
| 45 | response_data = self._base_server.default_response_data(sr.response_size) |
| 46 | self._ready_to_send = True |
| 47 | self._base_server.setup_send(response_data) |
| 48 | |
| 49 | def on_window_update_default(self, event): |
| 50 | if self._ready_to_send: |
| 51 | self._base_server.default_send() |