static int rarch_main_data_http_conn_iterate_transfer_parse(http_handle_t *http) { if (net_http_connection_done(http->connection.handle)) { if (http->connection.handle && http->connection.cb) http->connection.cb(http, 0); } net_http_connection_free(http->connection.handle); http->connection.handle = NULL; return 0; }
int net_http_get(const char **result, size_t *size, const char *url, retro_time_t *timeout) { size_t length; uint8_t* data = NULL; char* res = NULL; int ret = NET_HTTP_GET_OK; struct http_t* http = NULL; retro_time_t t0 = cpu_features_get_time_usec(); struct http_connection_t *conn = net_http_connection_new(url); *result = NULL; /* Error creating the connection descriptor. */ if (!conn) goto error; /* Don't bother with timeouts here, it's just a string scan. */ while (!net_http_connection_iterate(conn)) {} /* Error finishing the connection descriptor. */ if (!net_http_connection_done(conn)) { ret = NET_HTTP_GET_MALFORMED_URL; goto error; } http = net_http_new(conn); /* Error connecting to the endpoint. */ if (!http) { ret = NET_HTTP_GET_CONNECT_ERROR; goto error; } while (!net_http_update(http, NULL, NULL)) { /* Timeout error. */ if (timeout && (cpu_features_get_time_usec() - t0) > *timeout) { ret = NET_HTTP_GET_TIMEOUT; goto error; } } data = net_http_data(http, &length, false); if (data) { res = (char*)malloc(length + 1); /* Allocation error. */ if ( !res ) goto error; memcpy((void*)res, (void*)data, length); free(data); res[length] = 0; *result = res; } else { length = 0; *result = NULL; } if (size) *size = length; error: if ( http ) net_http_delete( http ); if ( conn ) net_http_connection_free( conn ); if (timeout) { t0 = cpu_features_get_time_usec() - t0; if (t0 < *timeout) *timeout -= t0; else *timeout = 0; } return ret; }