#include "requests.h" Result(void) recvStr(EncryptedSocketTCP* sock, u32 size, str* out_s){ Deferral(4); str s = str_construct(malloc(size + 1), size, true); bool success = false; Defer(if(!success) free(s.data)); // receive message content try_void( EncryptedSocketTCP_recv( sock, str_castTo_Array_u8(s), SocketRecvFlag_WholeBuffer ) ); s.data[s.len] = 0; *out_s = s; success = true; Return RESULT_VOID; } Result(void) recvErrorMessage(EncryptedSocketTCP* sock, PacketHeader* res_header, str* out_err_msg) { Deferral(4); ErrorMessage res; try_void(PacketHeader_validateContentSize(res_header, sizeof(res))); try_void(EncryptedSocketTCP_recvStruct(sock, &res)); // limit msg_size to fit in single EncryptedSocketTCP_recv call // TODO: receive ErrorMessage content in a loop if(res.msg_size > sock->recv_buf.len) res.msg_size = sock->recv_buf.len; str err_msg; try_void(recvStr(sock, res.msg_size, &err_msg)); *out_err_msg = err_msg; Return RESULT_VOID; }