size_t shoes_curl_header_funk(char *ptr, size_t size, size_t nmemb, void *user) { shoes_curl_data *data = (shoes_curl_data *)user; size_t realsize = size * nmemb; if (data->status == 0 && data->handler != NULL) { curl_easy_getinfo(data->curl, CURLINFO_RESPONSE_CODE, (long *)&data->status); if (data->handler != NULL) { shoes_http_event *event = SHOE_ALLOC(shoes_http_event); SHOE_MEMZERO(event, shoes_http_event, 1); event->stage = SHOES_HTTP_STATUS; event->status = data->status; data->handler(event, data->data); SHOE_FREE(event); } } HTTP_HEADER(ptr, realsize, data->handler, data->data); if ((data->mem != NULL || data->fp != NULL) && strncmp(ptr, content_len_str, strlen(content_len_str)) == 0) { data->total = strtoull(ptr + strlen(content_len_str), NULL, 10); if (data->mem != NULL && data->total > data->memlen) { data->memlen = data->total; SHOE_REALLOC_N(data->mem, char, data->memlen); if (data->mem == NULL) return -1; }
size_t shoes_curl_header_funk(char *ptr, size_t size, size_t nmemb, shoes_curl_data *data) { size_t realsize = size * nmemb; if (data->status == 0) { shoes_download_event event; event.stage = SHOES_HTTP_STATUS; curl_easy_getinfo(data->curl, CURLINFO_RESPONSE_CODE, &event.status); data->status = event.status; if (data->handler != NULL) data->handler(&event, data->data); } HTTP_HEADER(ptr, realsize, data->handler, data->data); if (strncmp(ptr, content_len_str, strlen(content_len_str)) == 0) { data->total = strtoull(ptr + strlen(content_len_str), NULL, 10); if (data->mem != NULL && data->total > data->memlen) { data->memlen = data->total; SHOE_REALLOC_N(data->mem, char, data->memlen); if (data->mem == NULL) return -1; }
void shoes_winhttp_headers(HINTERNET req, shoes_download_handler handler, void *data) { DWORD size; WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &size, WINHTTP_NO_HEADER_INDEX); if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) { int whdrlen = 0, hdrlen = 0; LPCWSTR whdr; LPSTR hdr = SHOE_ALLOC_N(CHAR, MAX_PATH); LPCWSTR hdrs = SHOE_ALLOC_N(WCHAR, size/sizeof(WCHAR)); BOOL res = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS, WINHTTP_HEADER_NAME_BY_INDEX, (LPVOID)hdrs, &size, WINHTTP_NO_HEADER_INDEX); if (res) { for (whdr = hdrs; whdr - hdrs < size / sizeof(WCHAR); whdr += whdrlen) { WideCharToMultiByte(CP_UTF8, 0, whdr, -1, hdr, MAX_PATH, NULL, NULL); hdrlen = strlen(hdr); HTTP_HEADER(hdr, hdrlen, handler, data); whdrlen = wcslen(whdr) + 1; } } SHOE_FREE(hdrs); SHOE_FREE(hdr); } }