mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-26 19:33:31 +00:00
[WININET] Sync with Wine Staging 2.16. CORE-13762
43deec9 wininet: Use standard wine_dbgstr_longlong. 085ce26 wininet: Drain content before reusing connection in open_http_connection. 59395d8 wininet: Never do blocking reads in chunked_read if zero chunk size is aready read. 4f40039 wininet: Release connection in HTTPREQ_Read only if remaining control data may be drainad without blocking. 8090d16 wininet: Store error state separately from end of stream in chunked stream. 752d078 wininet: Always use drain_content specific to stream type. 90b936f wininet: Try to read reamaining data in chunked_drain_content. 2ecdac8 wininet: Return error codes from HTTP streams. 7949a22 wininet: Correctly pass URL length to InternetCrackUrlW in get_redirect_url. a24b826 wininet: Improved cookie debug traces. f55a116 wininet: Fix potential use-after-free (Coverity). 89f1d8c wininet: Fixed connection_pool_cs declaration. cee9982 wininet: Return an error on redirect with no host name specified. 61e28c0 wininet: Moved INTERNET_STATUS_REDIRECT notification to HTTP_HandleRedirect. 9c95915 wininet: Correctly handle redirects to non-http URLs. svn path=/trunk/; revision=75946
This commit is contained in:
@@ -544,18 +544,12 @@ static DWORD get_cookie(substr_t host, substr_t path, DWORD flags, cookie_set_t
|
||||
}
|
||||
|
||||
for(domain = get_cookie_domain(host, FALSE); domain; domain = domain->parent) {
|
||||
TRACE("Trying %s domain...\n", debugstr_w(domain->domain));
|
||||
|
||||
LIST_FOR_EACH_ENTRY(container, &domain->path_list, cookie_container_t, entry) {
|
||||
struct list *cursor, *cursor2;
|
||||
|
||||
TRACE("path %s\n", debugstr_wn(container->path.str, container->path.len));
|
||||
|
||||
if(!cookie_match_path(container, path))
|
||||
continue;
|
||||
|
||||
TRACE("found domain %p\n", domain->domain);
|
||||
|
||||
LIST_FOR_EACH_SAFE(cursor, cursor2, &container->cookie_list) {
|
||||
cookie_t *cookie_iter = LIST_ENTRY(cursor, cookie_t, entry);
|
||||
|
||||
@@ -570,7 +564,6 @@ static DWORD get_cookie(substr_t host, substr_t path, DWORD flags, cookie_set_t
|
||||
if((cookie_iter->flags & INTERNET_COOKIE_HTTPONLY) && !(flags & INTERNET_COOKIE_HTTPONLY))
|
||||
continue;
|
||||
|
||||
|
||||
if(!res->size) {
|
||||
res->cookies = heap_alloc(4*sizeof(*res->cookies));
|
||||
if(!res->cookies)
|
||||
@@ -584,6 +577,9 @@ static DWORD get_cookie(substr_t host, substr_t path, DWORD flags, cookie_set_t
|
||||
res->size *= 2;
|
||||
}
|
||||
|
||||
TRACE("%s = %s domain %s path %s\n", debugstr_w(cookie_iter->name), debugstr_w(cookie_iter->data),
|
||||
debugstr_w(domain->domain), debugstr_wn(container->path.str, container->path.len));
|
||||
|
||||
if(res->cnt)
|
||||
res->string_len += 2; /* '; ' */
|
||||
res->cookies[res->cnt++] = cookie_iter;
|
||||
|
||||
@@ -180,13 +180,13 @@ static BOOL HTTP_DeleteCustomHeader(http_request_t *req, DWORD index);
|
||||
static LPWSTR HTTP_build_req( LPCWSTR *list, int len );
|
||||
static DWORD HTTP_HttpQueryInfoW(http_request_t*, DWORD, LPVOID, LPDWORD, LPDWORD);
|
||||
static UINT HTTP_DecodeBase64(LPCWSTR base64, LPSTR bin);
|
||||
static BOOL drain_content(http_request_t*,BOOL);
|
||||
static DWORD drain_content(http_request_t*,BOOL);
|
||||
|
||||
static CRITICAL_SECTION connection_pool_cs;
|
||||
static CRITICAL_SECTION_DEBUG connection_pool_debug =
|
||||
{
|
||||
0, 0, &connection_pool_cs,
|
||||
{ &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
|
||||
{ &connection_pool_debug.ProcessLocksList, &connection_pool_debug.ProcessLocksList },
|
||||
0, 0, { (DWORD_PTR)(__FILE__ ": connection_pool_cs") }
|
||||
};
|
||||
static CRITICAL_SECTION connection_pool_cs = { &connection_pool_debug, -1, 0, 0, 0, 0 };
|
||||
@@ -367,7 +367,7 @@ static WCHAR *get_host_header( http_request_t *req )
|
||||
struct data_stream_vtbl_t {
|
||||
BOOL (*end_of_data)(data_stream_t*,http_request_t*);
|
||||
DWORD (*read)(data_stream_t*,http_request_t*,BYTE*,DWORD,DWORD*,BOOL);
|
||||
BOOL (*drain_content)(data_stream_t*,http_request_t*);
|
||||
DWORD (*drain_content)(data_stream_t*,http_request_t*,BOOL);
|
||||
void (*destroy)(data_stream_t*);
|
||||
};
|
||||
|
||||
@@ -385,7 +385,8 @@ typedef struct {
|
||||
CHUNKED_STREAM_STATE_READING_CHUNK,
|
||||
CHUNKED_STREAM_STATE_DISCARD_EOL_AFTER_DATA,
|
||||
CHUNKED_STREAM_STATE_DISCARD_EOL_AT_END,
|
||||
CHUNKED_STREAM_STATE_END_OF_STREAM
|
||||
CHUNKED_STREAM_STATE_END_OF_STREAM,
|
||||
CHUNKED_STREAM_STATE_ERROR
|
||||
} state;
|
||||
} chunked_stream_t;
|
||||
|
||||
@@ -493,10 +494,10 @@ static DWORD gzip_read(data_stream_t *stream, http_request_t *req, BYTE *buf, DW
|
||||
return res;
|
||||
}
|
||||
|
||||
static BOOL gzip_drain_content(data_stream_t *stream, http_request_t *req)
|
||||
static DWORD gzip_drain_content(data_stream_t *stream, http_request_t *req, BOOL allow_blocking)
|
||||
{
|
||||
gzip_stream_t *gzip_stream = (gzip_stream_t*)stream;
|
||||
return gzip_stream->parent_stream->vtbl->drain_content(gzip_stream->parent_stream, req);
|
||||
return gzip_stream->parent_stream->vtbl->drain_content(gzip_stream->parent_stream, req, allow_blocking);
|
||||
}
|
||||
|
||||
static void gzip_destroy(data_stream_t *stream)
|
||||
@@ -2005,7 +2006,7 @@ static void HTTPREQ_CloseConnection(object_header_t *hdr)
|
||||
{
|
||||
http_request_t *req = (http_request_t*)hdr;
|
||||
|
||||
http_release_netconn(req, drain_content(req, FALSE));
|
||||
http_release_netconn(req, drain_content(req, FALSE) == ERROR_SUCCESS);
|
||||
}
|
||||
|
||||
static DWORD str_to_buffer(const WCHAR *str, void *buffer, DWORD *size, BOOL unicode)
|
||||
@@ -2628,7 +2629,7 @@ static DWORD netconn_read(data_stream_t *stream, http_request_t *req, BYTE *buf,
|
||||
return res;
|
||||
}
|
||||
|
||||
static BOOL netconn_drain_content(data_stream_t *stream, http_request_t *req)
|
||||
static DWORD netconn_drain_content(data_stream_t *stream, http_request_t *req, BOOL allow_blocking)
|
||||
{
|
||||
netconn_stream_t *netconn_stream = (netconn_stream_t*)stream;
|
||||
BYTE buf[1024];
|
||||
@@ -2636,18 +2637,20 @@ static BOOL netconn_drain_content(data_stream_t *stream, http_request_t *req)
|
||||
size_t size;
|
||||
|
||||
if(netconn_stream->content_length == ~0u)
|
||||
return FALSE;
|
||||
return WSAEISCONN;
|
||||
|
||||
while(netconn_stream->content_read < netconn_stream->content_length) {
|
||||
size = min(sizeof(buf), netconn_stream->content_length-netconn_stream->content_read);
|
||||
res = NETCON_recv(req->netconn, buf, size, FALSE, &len);
|
||||
if(res || !len)
|
||||
return FALSE;
|
||||
res = NETCON_recv(req->netconn, buf, size, allow_blocking, &len);
|
||||
if(res)
|
||||
return res;
|
||||
if(!len)
|
||||
return WSAECONNABORTED;
|
||||
|
||||
netconn_stream->content_read += len;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static void netconn_destroy(data_stream_t *stream)
|
||||
@@ -2672,7 +2675,14 @@ static char next_chunked_data_char(chunked_stream_t *stream)
|
||||
static BOOL chunked_end_of_data(data_stream_t *stream, http_request_t *req)
|
||||
{
|
||||
chunked_stream_t *chunked_stream = (chunked_stream_t*)stream;
|
||||
return chunked_stream->state == CHUNKED_STREAM_STATE_END_OF_STREAM;
|
||||
switch(chunked_stream->state) {
|
||||
case CHUNKED_STREAM_STATE_DISCARD_EOL_AT_END:
|
||||
case CHUNKED_STREAM_STATE_END_OF_STREAM:
|
||||
case CHUNKED_STREAM_STATE_ERROR:
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static DWORD chunked_read(data_stream_t *stream, http_request_t *req, BYTE *buf, DWORD size,
|
||||
@@ -2689,22 +2699,28 @@ static DWORD chunked_read(data_stream_t *stream, http_request_t *req, BYTE *buf,
|
||||
|
||||
/* Ensure that we have data in the buffer for states that need it. */
|
||||
if(!chunked_stream->buf_size) {
|
||||
BOOL blocking_read = allow_blocking;
|
||||
|
||||
switch(chunked_stream->state) {
|
||||
case CHUNKED_STREAM_STATE_READING_CHUNK_SIZE:
|
||||
case CHUNKED_STREAM_STATE_DISCARD_EOL_AFTER_SIZE:
|
||||
case CHUNKED_STREAM_STATE_DISCARD_EOL_AFTER_DATA:
|
||||
case CHUNKED_STREAM_STATE_DISCARD_EOL_AT_END:
|
||||
case CHUNKED_STREAM_STATE_DISCARD_EOL_AFTER_SIZE:
|
||||
/* never allow blocking after 0 chunk size */
|
||||
if(!chunked_stream->chunk_size)
|
||||
blocking_read = FALSE;
|
||||
/* fall through */
|
||||
case CHUNKED_STREAM_STATE_READING_CHUNK_SIZE:
|
||||
case CHUNKED_STREAM_STATE_DISCARD_EOL_AFTER_DATA:
|
||||
chunked_stream->buf_pos = 0;
|
||||
res = NETCON_recv(req->netconn, chunked_stream->buf, sizeof(chunked_stream->buf), allow_blocking, &read_bytes);
|
||||
res = NETCON_recv(req->netconn, chunked_stream->buf, sizeof(chunked_stream->buf), blocking_read, &read_bytes);
|
||||
if(res == ERROR_SUCCESS && read_bytes) {
|
||||
chunked_stream->buf_size += read_bytes;
|
||||
}else if(res == WSAEWOULDBLOCK) {
|
||||
if(ret_read)
|
||||
if(ret_read || allow_blocking)
|
||||
res = ERROR_SUCCESS;
|
||||
continue_read = FALSE;
|
||||
continue;
|
||||
}else {
|
||||
chunked_stream->state = CHUNKED_STREAM_STATE_END_OF_STREAM;
|
||||
chunked_stream->state = CHUNKED_STREAM_STATE_ERROR;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -2766,7 +2782,7 @@ static DWORD chunked_read(data_stream_t *stream, http_request_t *req, BYTE *buf,
|
||||
}
|
||||
|
||||
if(!read_bytes) {
|
||||
chunked_stream->state = CHUNKED_STREAM_STATE_END_OF_STREAM;
|
||||
chunked_stream->state = CHUNKED_STREAM_STATE_ERROR;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -2796,6 +2812,7 @@ static DWORD chunked_read(data_stream_t *stream, http_request_t *req, BYTE *buf,
|
||||
break;
|
||||
|
||||
case CHUNKED_STREAM_STATE_END_OF_STREAM:
|
||||
case CHUNKED_STREAM_STATE_ERROR:
|
||||
continue_read = FALSE;
|
||||
break;
|
||||
}
|
||||
@@ -2811,10 +2828,22 @@ static DWORD chunked_read(data_stream_t *stream, http_request_t *req, BYTE *buf,
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static BOOL chunked_drain_content(data_stream_t *stream, http_request_t *req)
|
||||
static DWORD chunked_drain_content(data_stream_t *stream, http_request_t *req, BOOL allow_blocking)
|
||||
{
|
||||
chunked_stream_t *chunked_stream = (chunked_stream_t*)stream;
|
||||
return chunked_stream->state == CHUNKED_STREAM_STATE_END_OF_STREAM;
|
||||
BYTE buf[1024];
|
||||
DWORD size, res;
|
||||
|
||||
while(chunked_stream->state != CHUNKED_STREAM_STATE_END_OF_STREAM
|
||||
&& chunked_stream->state != CHUNKED_STREAM_STATE_ERROR) {
|
||||
res = chunked_read(stream, req, buf, sizeof(buf), &size, allow_blocking);
|
||||
if(res != ERROR_SUCCESS)
|
||||
return res;
|
||||
}
|
||||
|
||||
if(chunked_stream->state != CHUNKED_STREAM_STATE_END_OF_STREAM)
|
||||
return ERROR_NO_DATA;
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static void chunked_destroy(data_stream_t *stream)
|
||||
@@ -2968,46 +2997,34 @@ static DWORD HTTPREQ_Read(http_request_t *req, void *buffer, DWORD size, DWORD *
|
||||
LeaveCriticalSection( &req->read_section );
|
||||
|
||||
*read = ret_read;
|
||||
TRACE( "retrieved %u bytes (%u)\n", ret_read, req->contentLength );
|
||||
TRACE( "retrieved %u bytes (res %u)\n", ret_read, res );
|
||||
|
||||
if(res != WSAEWOULDBLOCK && (!ret_read || res != ERROR_SUCCESS))
|
||||
http_release_netconn(req, res == ERROR_SUCCESS);
|
||||
if(res != WSAEWOULDBLOCK) {
|
||||
if(res != ERROR_SUCCESS)
|
||||
http_release_netconn(req, FALSE);
|
||||
else if(!ret_read && drain_content(req, FALSE) == ERROR_SUCCESS)
|
||||
http_release_netconn(req, TRUE);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static BOOL drain_content(http_request_t *req, BOOL blocking)
|
||||
static DWORD drain_content(http_request_t *req, BOOL blocking)
|
||||
{
|
||||
BOOL ret;
|
||||
DWORD res;
|
||||
|
||||
if(!is_valid_netconn(req->netconn) || req->contentLength == -1)
|
||||
return FALSE;
|
||||
TRACE("%p\n", req->netconn);
|
||||
|
||||
if(!is_valid_netconn(req->netconn))
|
||||
return ERROR_NO_DATA;
|
||||
|
||||
if(!strcmpW(req->verb, szHEAD))
|
||||
return TRUE;
|
||||
|
||||
if(!blocking)
|
||||
return req->data_stream->vtbl->drain_content(req->data_stream, req);
|
||||
return ERROR_SUCCESS;
|
||||
|
||||
EnterCriticalSection( &req->read_section );
|
||||
|
||||
while(1) {
|
||||
DWORD bytes_read, res;
|
||||
BYTE buf[4096];
|
||||
|
||||
res = HTTPREQ_Read(req, buf, sizeof(buf), &bytes_read, TRUE);
|
||||
if(res != ERROR_SUCCESS) {
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
if(!bytes_read) {
|
||||
ret = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
res = req->data_stream->vtbl->drain_content(req->data_stream, req, blocking);
|
||||
LeaveCriticalSection( &req->read_section );
|
||||
return ret;
|
||||
return res;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
@@ -3042,7 +3059,7 @@ static void async_read_file_proc(task_header_t *hdr)
|
||||
if(task->ret_read)
|
||||
complete_arg = read; /* QueryDataAvailable reports read bytes in request complete notification */
|
||||
if(res != ERROR_SUCCESS || !read)
|
||||
http_release_netconn(req, drain_content(req, FALSE));
|
||||
http_release_netconn(req, drain_content(req, FALSE) == ERROR_SUCCESS);
|
||||
}
|
||||
|
||||
TRACE("res %u read %u\n", res, read);
|
||||
@@ -3987,7 +4004,16 @@ static WCHAR *get_redirect_url(http_request_t *request)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
urlComponents.dwSchemeLength = 1;
|
||||
b = InternetCrackUrlW(redirect_url, url_length / sizeof(WCHAR), 0, &urlComponents);
|
||||
if(b && urlComponents.dwSchemeLength &&
|
||||
urlComponents.nScheme != INTERNET_SCHEME_HTTP && urlComponents.nScheme != INTERNET_SCHEME_HTTPS) {
|
||||
TRACE("redirect to non-http URL\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
urlComponents.lpszScheme = (request->hdr.dwFlags & INTERNET_FLAG_SECURE) ? szHttps : szHttp;
|
||||
urlComponents.dwSchemeLength = 0;
|
||||
urlComponents.lpszHostName = request->server->name;
|
||||
urlComponents.nPort = request->server->port;
|
||||
urlComponents.lpszUserName = session->userName;
|
||||
@@ -4024,30 +4050,36 @@ static WCHAR *get_redirect_url(http_request_t *request)
|
||||
/***********************************************************************
|
||||
* HTTP_HandleRedirect (internal)
|
||||
*/
|
||||
static DWORD HTTP_HandleRedirect(http_request_t *request, LPCWSTR lpszUrl)
|
||||
static DWORD HTTP_HandleRedirect(http_request_t *request, WCHAR *url)
|
||||
{
|
||||
URL_COMPONENTSW urlComponents = { sizeof(urlComponents) };
|
||||
http_session_t *session = request->session;
|
||||
WCHAR *path;
|
||||
size_t url_len = strlenW(url);
|
||||
|
||||
if(lpszUrl[0]=='/')
|
||||
if(url[0] == '/')
|
||||
{
|
||||
/* if it's an absolute path, keep the same session info */
|
||||
path = heap_strdupW(lpszUrl);
|
||||
urlComponents.lpszUrlPath = url;
|
||||
urlComponents.dwUrlPathLength = url_len;
|
||||
}
|
||||
else
|
||||
{
|
||||
URL_COMPONENTSW urlComponents = { sizeof(urlComponents) };
|
||||
BOOL custom_port = FALSE;
|
||||
substr_t host;
|
||||
|
||||
urlComponents.dwHostNameLength = 1;
|
||||
urlComponents.dwUserNameLength = 1;
|
||||
urlComponents.dwUrlPathLength = 1;
|
||||
if(!InternetCrackUrlW(lpszUrl, strlenW(lpszUrl), 0, &urlComponents))
|
||||
if(!InternetCrackUrlW(url, url_len, 0, &urlComponents))
|
||||
return INTERNET_GetLastError();
|
||||
|
||||
if (!urlComponents.dwHostNameLength)
|
||||
if(!urlComponents.dwHostNameLength)
|
||||
return ERROR_INTERNET_INVALID_URL;
|
||||
}
|
||||
|
||||
INTERNET_SendCallback(&request->hdr, request->hdr.dwContext, INTERNET_STATUS_REDIRECT,
|
||||
url, (url_len + 1) * sizeof(WCHAR));
|
||||
|
||||
if(urlComponents.dwHostNameLength) {
|
||||
BOOL custom_port = FALSE;
|
||||
substr_t host;
|
||||
|
||||
if(urlComponents.nScheme == INTERNET_SCHEME_HTTP) {
|
||||
if(request->hdr.dwFlags & INTERNET_FLAG_SECURE) {
|
||||
@@ -4094,17 +4126,18 @@ static DWORD HTTP_HandleRedirect(http_request_t *request, LPCWSTR lpszUrl)
|
||||
HTTP_ProcessHeader(request, hostW, request->server->host_port, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDHDR_FLAG_REQ);
|
||||
else
|
||||
HTTP_ProcessHeader(request, hostW, request->server->name, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDHDR_FLAG_REQ);
|
||||
|
||||
path = heap_strndupW(urlComponents.lpszUrlPath, urlComponents.dwUrlPathLength);
|
||||
}
|
||||
|
||||
heap_free(request->path);
|
||||
request->path = NULL;
|
||||
if (*path)
|
||||
if(urlComponents.dwUrlPathLength)
|
||||
{
|
||||
DWORD needed = 1;
|
||||
HRESULT rc;
|
||||
WCHAR dummy = 0;
|
||||
WCHAR *path;
|
||||
|
||||
path = heap_strndupW(urlComponents.lpszUrlPath, urlComponents.dwUrlPathLength);
|
||||
rc = UrlEscapeW(path, &dummy, &needed, URL_ESCAPE_SPACES_ONLY);
|
||||
if (rc != E_POINTER)
|
||||
ERR("Unable to escape string!(%s) (%d)\n",debugstr_w(path),rc);
|
||||
@@ -4116,10 +4149,9 @@ static DWORD HTTP_HandleRedirect(http_request_t *request, LPCWSTR lpszUrl)
|
||||
ERR("Unable to escape string!(%s) (%d)\n",debugstr_w(path),rc);
|
||||
strcpyW(request->path, path);
|
||||
}
|
||||
heap_free(path);
|
||||
}
|
||||
|
||||
heap_free(path);
|
||||
|
||||
/* Remove custom content-type/length headers on redirects. */
|
||||
remove_header(request, szContent_Type, TRUE);
|
||||
remove_header(request, szContent_Length, TRUE);
|
||||
@@ -4707,22 +4739,22 @@ static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
|
||||
netconn_t *netconn = NULL;
|
||||
DWORD res;
|
||||
|
||||
reset_data_stream(request);
|
||||
|
||||
if (request->netconn)
|
||||
{
|
||||
if (is_valid_netconn(request->netconn) && NETCON_is_alive(request->netconn))
|
||||
if (NETCON_is_alive(request->netconn) && drain_content(request, TRUE) == ERROR_SUCCESS)
|
||||
{
|
||||
reset_data_stream(request);
|
||||
*reusing = TRUE;
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
free_netconn(request->netconn);
|
||||
request->netconn = NULL;
|
||||
}
|
||||
|
||||
TRACE("freeing netconn\n");
|
||||
free_netconn(request->netconn);
|
||||
request->netconn = NULL;
|
||||
}
|
||||
|
||||
reset_data_stream(request);
|
||||
|
||||
res = HTTP_ResolveName(request);
|
||||
if(res != ERROR_SUCCESS)
|
||||
return res;
|
||||
@@ -5027,9 +5059,7 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders,
|
||||
heap_free(request->verb);
|
||||
request->verb = heap_strdupW(szGET);
|
||||
}
|
||||
http_release_netconn(request, drain_content(request, FALSE));
|
||||
INTERNET_SendCallback(&request->hdr, request->hdr.dwContext, INTERNET_STATUS_REDIRECT,
|
||||
new_url, (strlenW(new_url) + 1) * sizeof(WCHAR));
|
||||
http_release_netconn(request, drain_content(request, FALSE) == ERROR_SUCCESS);
|
||||
res = HTTP_HandleRedirect(request, new_url);
|
||||
heap_free(new_url);
|
||||
if (res == ERROR_SUCCESS) {
|
||||
@@ -5055,7 +5085,7 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders,
|
||||
request->session->password, host))
|
||||
{
|
||||
heap_free(requestString);
|
||||
if(!drain_content(request, TRUE)) {
|
||||
if(!drain_content(request, TRUE) == ERROR_SUCCESS) {
|
||||
FIXME("Could not drain content\n");
|
||||
http_release_netconn(request, FALSE);
|
||||
}
|
||||
@@ -5083,7 +5113,7 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders,
|
||||
NULL))
|
||||
{
|
||||
heap_free(requestString);
|
||||
if(!drain_content(request, TRUE)) {
|
||||
if(!drain_content(request, TRUE) == ERROR_SUCCESS) {
|
||||
FIXME("Could not drain content\n");
|
||||
http_release_netconn(request, FALSE);
|
||||
}
|
||||
@@ -5225,9 +5255,7 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_
|
||||
heap_free(request->verb);
|
||||
request->verb = heap_strdupW(szGET);
|
||||
}
|
||||
http_release_netconn(request, drain_content(request, FALSE));
|
||||
INTERNET_SendCallback(&request->hdr, request->hdr.dwContext, INTERNET_STATUS_REDIRECT,
|
||||
new_url, (strlenW(new_url) + 1) * sizeof(WCHAR));
|
||||
http_release_netconn(request, drain_content(request, FALSE) == ERROR_SUCCESS);
|
||||
res = HTTP_HandleRedirect(request, new_url);
|
||||
heap_free(new_url);
|
||||
if (res == ERROR_SUCCESS)
|
||||
|
||||
@@ -3424,8 +3424,8 @@ HANDLE WINAPI FindFirstUrlCacheEntryExA(
|
||||
LPVOID lpReserved3
|
||||
)
|
||||
{
|
||||
FIXME("(%s, 0x%08x, 0x%08x, 0x%08x%08x, %p, %p, %p, %p, %p) stub\n", debugstr_a(lpszUrlSearchPattern),
|
||||
dwFlags, dwFilter, (ULONG)(GroupId >> 32), (ULONG)GroupId, lpFirstCacheEntryInfo,
|
||||
FIXME("(%s, 0x%08x, 0x%08x, 0x%s, %p, %p, %p, %p, %p) stub\n", debugstr_a(lpszUrlSearchPattern),
|
||||
dwFlags, dwFilter, wine_dbgstr_longlong(GroupId), lpFirstCacheEntryInfo,
|
||||
lpdwFirstCacheEntryInfoBufferSize, lpReserved, pcbReserved2,lpReserved3);
|
||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||
return NULL;
|
||||
@@ -3443,8 +3443,8 @@ HANDLE WINAPI FindFirstUrlCacheEntryExW(
|
||||
LPVOID lpReserved3
|
||||
)
|
||||
{
|
||||
FIXME("(%s, 0x%08x, 0x%08x, 0x%08x%08x, %p, %p, %p, %p, %p) stub\n", debugstr_w(lpszUrlSearchPattern),
|
||||
dwFlags, dwFilter, (ULONG)(GroupId >> 32), (ULONG)GroupId, lpFirstCacheEntryInfo,
|
||||
FIXME("(%s, 0x%08x, 0x%08x, 0x%s, %p, %p, %p, %p, %p) stub\n", debugstr_w(lpszUrlSearchPattern),
|
||||
dwFlags, dwFilter, wine_dbgstr_longlong(GroupId), lpFirstCacheEntryInfo,
|
||||
lpdwFirstCacheEntryInfoBufferSize, lpReserved, pcbReserved2,lpReserved3);
|
||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||
return NULL;
|
||||
@@ -3720,8 +3720,8 @@ INTERNETAPI GROUPID WINAPI CreateUrlCacheGroup(DWORD dwFlags, LPVOID lpReserved)
|
||||
*/
|
||||
BOOL WINAPI DeleteUrlCacheGroup(GROUPID GroupId, DWORD dwFlags, LPVOID lpReserved)
|
||||
{
|
||||
FIXME("(0x%08x%08x, 0x%08x, %p) stub\n",
|
||||
(ULONG)(GroupId >> 32), (ULONG)GroupId, dwFlags, lpReserved);
|
||||
FIXME("(0x%s, 0x%08x, %p) stub\n",
|
||||
wine_dbgstr_longlong(GroupId), dwFlags, lpReserved);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -3743,8 +3743,8 @@ BOOL WINAPI SetUrlCacheEntryGroupA(LPCSTR lpszUrlName, DWORD dwFlags,
|
||||
GROUPID GroupId, LPBYTE pbGroupAttributes, DWORD cbGroupAttributes,
|
||||
LPVOID lpReserved)
|
||||
{
|
||||
FIXME("(%s, 0x%08x, 0x%08x%08x, %p, 0x%08x, %p) stub\n",
|
||||
debugstr_a(lpszUrlName), dwFlags, (ULONG)(GroupId >> 32), (ULONG)GroupId,
|
||||
FIXME("(%s, 0x%08x, 0x%s, %p, 0x%08x, %p) stub\n",
|
||||
debugstr_a(lpszUrlName), dwFlags, wine_dbgstr_longlong(GroupId),
|
||||
pbGroupAttributes, cbGroupAttributes, lpReserved);
|
||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||
return FALSE;
|
||||
@@ -3758,8 +3758,8 @@ BOOL WINAPI SetUrlCacheEntryGroupW(LPCWSTR lpszUrlName, DWORD dwFlags,
|
||||
GROUPID GroupId, LPBYTE pbGroupAttributes, DWORD cbGroupAttributes,
|
||||
LPVOID lpReserved)
|
||||
{
|
||||
FIXME("(%s, 0x%08x, 0x%08x%08x, %p, 0x%08x, %p) stub\n",
|
||||
debugstr_w(lpszUrlName), dwFlags, (ULONG)(GroupId >> 32), (ULONG)GroupId,
|
||||
FIXME("(%s, 0x%08x, 0x%s, %p, 0x%08x, %p) stub\n",
|
||||
debugstr_w(lpszUrlName), dwFlags, wine_dbgstr_longlong(GroupId),
|
||||
pbGroupAttributes, cbGroupAttributes, lpReserved);
|
||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||
return FALSE;
|
||||
@@ -3789,8 +3789,8 @@ BOOL WINAPI GetUrlCacheGroupAttributeA( GROUPID gid, DWORD dwFlags, DWORD dwAttr
|
||||
LPINTERNET_CACHE_GROUP_INFOA lpGroupInfo,
|
||||
LPDWORD lpdwGroupInfo, LPVOID lpReserved )
|
||||
{
|
||||
FIXME("(0x%08x%08x, 0x%08x, 0x%08x, %p, %p, %p) stub\n",
|
||||
(ULONG)(gid >> 32), (ULONG)gid, dwFlags, dwAttributes, lpGroupInfo,
|
||||
FIXME("(0x%s, 0x%08x, 0x%08x, %p, %p, %p) stub\n",
|
||||
wine_dbgstr_longlong(gid), dwFlags, dwAttributes, lpGroupInfo,
|
||||
lpdwGroupInfo, lpReserved);
|
||||
return FALSE;
|
||||
}
|
||||
@@ -3799,8 +3799,8 @@ BOOL WINAPI GetUrlCacheGroupAttributeW( GROUPID gid, DWORD dwFlags, DWORD dwAttr
|
||||
LPINTERNET_CACHE_GROUP_INFOW lpGroupInfo,
|
||||
LPDWORD lpdwGroupInfo, LPVOID lpReserved )
|
||||
{
|
||||
FIXME("(0x%08x%08x, 0x%08x, 0x%08x, %p, %p, %p) stub\n",
|
||||
(ULONG)(gid >> 32), (ULONG)gid, dwFlags, dwAttributes, lpGroupInfo,
|
||||
FIXME("(0x%s, 0x%08x, 0x%08x, %p, %p, %p) stub\n",
|
||||
wine_dbgstr_longlong(gid), dwFlags, dwAttributes, lpGroupInfo,
|
||||
lpdwGroupInfo, lpReserved);
|
||||
return FALSE;
|
||||
}
|
||||
@@ -3808,16 +3808,16 @@ BOOL WINAPI GetUrlCacheGroupAttributeW( GROUPID gid, DWORD dwFlags, DWORD dwAttr
|
||||
BOOL WINAPI SetUrlCacheGroupAttributeA( GROUPID gid, DWORD dwFlags, DWORD dwAttributes,
|
||||
LPINTERNET_CACHE_GROUP_INFOA lpGroupInfo, LPVOID lpReserved )
|
||||
{
|
||||
FIXME("(0x%08x%08x, 0x%08x, 0x%08x, %p, %p) stub\n",
|
||||
(ULONG)(gid >> 32), (ULONG)gid, dwFlags, dwAttributes, lpGroupInfo, lpReserved);
|
||||
FIXME("(0x%s, 0x%08x, 0x%08x, %p, %p) stub\n",
|
||||
wine_dbgstr_longlong(gid), dwFlags, dwAttributes, lpGroupInfo, lpReserved);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL WINAPI SetUrlCacheGroupAttributeW( GROUPID gid, DWORD dwFlags, DWORD dwAttributes,
|
||||
LPINTERNET_CACHE_GROUP_INFOW lpGroupInfo, LPVOID lpReserved )
|
||||
{
|
||||
FIXME("(0x%08x%08x, 0x%08x, 0x%08x, %p, %p) stub\n",
|
||||
(ULONG)(gid >> 32), (ULONG)gid, dwFlags, dwAttributes, lpGroupInfo, lpReserved);
|
||||
FIXME("(0x%s, 0x%08x, 0x%08x, %p, %p) stub\n",
|
||||
wine_dbgstr_longlong(gid), dwFlags, dwAttributes, lpGroupInfo, lpReserved);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ reactos/dll/win32/windowscodecsext # Synced to WineStaging-2.9
|
||||
reactos/dll/win32/winemp3.acm # Synced to WineStaging-2.16
|
||||
reactos/dll/win32/wing32 # Synced to WineStaging-2.9
|
||||
reactos/dll/win32/winhttp # Synced to WineStaging-2.16
|
||||
reactos/dll/win32/wininet # Synced to WineStaging-2.9
|
||||
reactos/dll/win32/wininet # Synced to WineStaging-2.16
|
||||
reactos/dll/win32/winmm # Forked at Wine-20050628
|
||||
reactos/dll/win32/winmm/midimap # Forked at Wine-20050628
|
||||
reactos/dll/win32/winmm/wavemap # Forked at Wine-20050628
|
||||
|
||||
Reference in New Issue
Block a user