| 1 | module ssl |
| 2 | |
| 3 | import io |
| 4 | import net |
| 5 | import net.mbedtls |
| 6 | |
| 7 | const issue_16557_server_cert = @VMODROOT + '/examples/ssl_server/cert/server.crt' |
| 8 | const issue_16557_server_key = @VMODROOT + '/examples/ssl_server/cert/server.key' |
| 9 | const issue_16557_request = 'ping\r\n' |
| 10 | const issue_16557_response_chunk = 'hello over tls' |
| 11 | const issue_16557_response_repeat = 2_000 |
| 12 | |
| 13 | fn issue_16557_serve_once(mut listener mbedtls.SSLListener) { |
| 14 | defer { |
| 15 | listener.shutdown() or {} |
| 16 | } |
| 17 | mut conn := listener.accept() or { panic(err) } |
| 18 | defer { |
| 19 | conn.shutdown() or {} |
| 20 | } |
| 21 | mut request_buf := []u8{len: issue_16557_request.len} |
| 22 | _ = conn.read(mut request_buf) or { panic(err) } |
| 23 | response := issue_16557_expected_response() |
| 24 | mut start := 0 |
| 25 | for start < response.len { |
| 26 | end := if start + 257 > response.len { response.len } else { start + 257 } |
| 27 | conn.write_string(response[start..end]) or { panic(err) } |
| 28 | start = end |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | fn issue_16557_expected_response() string { |
| 33 | return issue_16557_response_chunk.repeat(issue_16557_response_repeat) |
| 34 | } |
| 35 | |
| 36 | fn test_io_read_all_reads_ssl_conn_until_eof() { |
| 37 | mut port_listener := net.listen_tcp(.ip, '127.0.0.1:0') or { panic(err) } |
| 38 | port := port_listener.addr() or { panic(err) }.port() or { panic(err) } |
| 39 | port_listener.close() or { panic(err) } |
| 40 | |
| 41 | mut listener := mbedtls.new_ssl_listener('127.0.0.1:${port}', mbedtls.SSLConnectConfig{ |
| 42 | cert: issue_16557_server_cert |
| 43 | cert_key: issue_16557_server_key |
| 44 | validate: false |
| 45 | }) or { panic(err) } |
| 46 | server := spawn issue_16557_serve_once(mut listener) |
| 47 | |
| 48 | mut client := new_ssl_conn(validate: false) or { panic(err) } |
| 49 | defer { |
| 50 | client.shutdown() or {} |
| 51 | } |
| 52 | client.dial('127.0.0.1', port) or { panic(err) } |
| 53 | client.write_string(issue_16557_request) or { panic(err) } |
| 54 | |
| 55 | bytes := io.read_all(reader: client) or { panic(err) } |
| 56 | server.wait() |
| 57 | |
| 58 | assert bytes == issue_16557_expected_response().bytes() |
| 59 | } |
| 60 | |