uint8_t* net_http_data(struct http_t *state, size_t* len, bool accept_error) { if (!state) return NULL; if (!accept_error && net_http_error(state)) { if (len) *len=0; return NULL; } if (len) *len=state->len; return (uint8_t*)state->data; }
static void rarch_task_http_transfer_handler(rarch_task_t *task) { http_handle_t *http = (http_handle_t*)task->state; http_transfer_data_t *data; switch (http->status) { case HTTP_STATUS_CONNECTION_TRANSFER_PARSE: rarch_main_data_http_conn_iterate_transfer_parse(http); http->status = HTTP_STATUS_TRANSFER; break; case HTTP_STATUS_CONNECTION_TRANSFER: if (!rarch_main_data_http_con_iterate_transfer(http)) http->status = HTTP_STATUS_CONNECTION_TRANSFER_PARSE; break; case HTTP_STATUS_TRANSFER: if (!rarch_main_data_http_iterate_transfer(task)) goto task_finished; break; case HTTP_STATUS_TRANSFER_PARSE: case HTTP_STATUS_POLL: goto task_finished; default: break; } if (task->cancelled || http->error) goto task_finished; return; task_finished: task->finished = true; if (http->handle) { size_t len = 0; char *tmp = (char*)net_http_data(http->handle, &len, false); if (tmp && http->cb) http->cb(tmp, len); if (net_http_error(http->handle) || task->cancelled) { tmp = (char*)net_http_data(http->handle, &len, true); if (tmp) free(tmp); if (task->cancelled) task->error = strdup("Task cancelled."); else task->error = strdup("Download failed."); } else { data = (http_transfer_data_t*)calloc(1, sizeof(*data)); data->data = tmp; data->len = len; task->task_data = data; } net_http_delete(http->handle); } else if (http->error) task->error = strdup("Internal error."); free(http); }