44 lines
1.1 KiB
C
44 lines
1.1 KiB
C
#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;
|
|
}
|