static struct vlc_http_msg *vlc_http_file_open(struct vlc_http_file *file, uintmax_t offset) { struct vlc_http_msg *resp; resp = vlc_http_res_open(&file->resource, vlc_http_file_req, &offset); if (resp == NULL) return NULL; int status = vlc_http_msg_get_status(resp); if (status == 206) { const char *str = vlc_http_msg_get_header(resp, "Content-Range"); if (str == NULL) /* A multipart/byteranges response. This is not what we asked for * and we do not support it. */ goto fail; uintmax_t start, end; if (sscanf(str, "bytes %ju-%ju", &start, &end) != 2 || start != offset || start > end) /* A single range response is what we asked for, but not at that * start offset. */ goto fail; } return resp; fail: vlc_http_msg_destroy(resp); errno = EIO; return NULL; }
int vlc_http_res_get_status(struct vlc_http_resource *res) { if (res->response == NULL) { if (res->failure) return -1; res->response = vlc_http_res_open(res, res + 1); if (res->response == NULL) { res->failure = true; return -1; } } return vlc_http_msg_get_status(res->response); }