From bd1b3d9f6ef8b4a8fa9b90eddb8cc3c8a146954f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 31 Aug 2022 20:25:42 +0530 Subject: [PATCH] Implement streaming mode for socket IO --- tools/cmd/at/socket_io.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tools/cmd/at/socket_io.go b/tools/cmd/at/socket_io.go index 53ac7490c..a6209a668 100644 --- a/tools/cmd/at/socket_io.go +++ b/tools/cmd/at/socket_io.go @@ -55,19 +55,43 @@ func read_response_from_conn(conn *net.Conn, timeout time.Duration) (serialized_ } func simple_socket_io(conn *net.Conn, io_data *rc_io_data) (serialized_response []byte, err error) { + const ( + BEFORE_FIRST_ESCAPE_CODE_SENT = iota + SENDING + WAITING_FOR_RESPONSE + ) + state := BEFORE_FIRST_ESCAPE_CODE_SENT + + wants_streaming := io_data.rc.Stream for { var chunk []byte - chunk, _, err = io_data.next_chunk() + var one_escape_code_done bool + chunk, one_escape_code_done, err = io_data.next_chunk() if err != nil { return } if len(chunk) == 0 { + state = WAITING_FOR_RESPONSE break } err = write_all_to_conn(conn, chunk) if err != nil { return } + if state == BEFORE_FIRST_ESCAPE_CODE_SENT && one_escape_code_done { + if wants_streaming { + var streaming_response []byte + streaming_response, err = read_response_from_conn(conn, io_data.timeout) + if err != nil { + return + } + if !is_stream_response(streaming_response) { + err = fmt.Errorf("Did not receive expected streaming response") + return + } + } + state = SENDING + } } if io_data.rc.NoResponse { return