int HTTPConnectionReadBodyLine(HTTPConnectionRef const conn, str_t out[], size_t const max) { if(!conn) return UV_EINVAL; if(!max) return UV_EINVAL; uv_buf_t buf[1]; int rc; size_t i; HTTPEvent type; out[0] = '\0'; for(;;) { rc = HTTPConnectionPeek(conn, &type, buf); if(rc < 0) return rc; if(HTTPMessageEnd == type) { if(out[0]) return 0; HTTPConnectionPop(conn, buf->len); return UV_EOF; } if(HTTPBody != type) { assertf(0, "Unexpected HTTP event %d", type); return UV_UNKNOWN; } for(i = 0; i < buf->len; ++i) { if('\r' == buf->base[i]) break; if('\n' == buf->base[i]) break; } append_buf_to_string(out, max, buf->base, i); HTTPConnectionPop(conn, i); if(i < buf->len) break; } rc = HTTPConnectionPeek(conn, &type, buf); if(rc < 0) return rc; if(HTTPMessageEnd == type) { if(out[0]) return 0; HTTPConnectionPop(conn, i); return UV_EOF; } if(HTTPBody != type) return UV_UNKNOWN; if('\r' == buf->base[0]) HTTPConnectionPop(conn, 1); rc = HTTPConnectionPeek(conn, &type, buf); if(rc < 0) return rc; if(HTTPMessageEnd == type) { if(out[0]) return 0; HTTPConnectionPop(conn, i); return UV_EOF; } if(HTTPBody != type) return UV_UNKNOWN; if('\n' == buf->base[0]) HTTPConnectionPop(conn, 1); return 0; }
int MultipartFormReadHeaderValue(MultipartFormRef const form, str_t value[], size_t const max) { if(!form) return UV_EINVAL; uv_buf_t buf[1]; int rc; MultipartEvent type; if(max > 0) value[0] = '\0'; for(;;) { rc = MultipartFormPeek(form, &type, buf); if(rc < 0) return rc; if(MultipartHeaderField == type) break; if(MultipartHeadersComplete == type) break; MultipartFormPop(form, buf->len); if(MultipartHeaderValue != type) { assertf(0, "Unexpected multipart event %d", type); return UV_UNKNOWN; } append_buf_to_string(value, max, buf->base, buf->len); } return 0; }