[WINHTTP]

* Sync with Wine 1.7.1.
CORE-7469

svn path=/trunk/; revision=60426
This commit is contained in:
Amine Khaldi 2013-09-28 15:23:56 +00:00
parent 2437be8ea5
commit 74ff2a18e0
7 changed files with 679 additions and 355 deletions

View file

@ -1,11 +1,8 @@
add_typelib(winhttp_tlb.idl)
add_definitions(
-D__WINESRC__
-D_WINE)
include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine)
spec2def(winhttp.dll winhttp.spec ADD_IMPORTLIB)
list(APPEND SOURCE
@ -16,19 +13,14 @@ list(APPEND SOURCE
request.c
session.c
url.c
rsrc.rc
${CMAKE_CURRENT_BINARY_DIR}/winhttp.def)
set_source_files_properties(rsrc.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/winhttp_tlb.tlb)
add_library(winhttp SHARED ${SOURCE})
add_typelib(winhttp_tlb.idl)
add_library(winhttp SHARED ${SOURCE} rsrc.rc)
set_module_type(winhttp win32dll)
target_link_libraries(winhttp uuid wine)
add_delay_importlibs(winhttp oleaut32 ole32 crypt32 secur32)
add_importlibs(winhttp user32 advapi32 ws2_32 msvcrt kernel32 ntdll)
# wininet_tlb.tlb needs stdole2.tlb
add_dependencies(winhttp stdole2)
add_dependencies(winhttp stdole2) # wininet_tlb.tlb needs stdole2.tlb
add_cd_file(TARGET winhttp DESTINATION reactos/system32 FOR all)

View file

@ -50,6 +50,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
DisableThreadLibraryCalls(hInstDLL);
break;
case DLL_PROCESS_DETACH:
if (lpv) break;
netconn_unload();
break;
}

View file

@ -426,7 +426,7 @@ BOOL netconn_secure_connect( netconn_t *conn, WCHAR *hostname )
size = send(conn->socket, out_buf.pvBuffer, out_buf.cbBuffer, 0);
if(size != out_buf.cbBuffer) {
ERR("send failed\n");
status = ERROR_WINHTTP_SECURE_CHANNEL_ERROR;
res = ERROR_WINHTTP_SECURE_CHANNEL_ERROR;
break;
}
@ -551,7 +551,7 @@ static BOOL send_ssl_chunk(netconn_t *conn, const void *msg, size_t size)
return TRUE;
}
BOOL netconn_send( netconn_t *conn, const void *msg, size_t len, int flags, int *sent )
BOOL netconn_send( netconn_t *conn, const void *msg, size_t len, int *sent )
{
if (!netconn_connected( conn )) return FALSE;
if (conn->secure)
@ -559,8 +559,6 @@ BOOL netconn_send( netconn_t *conn, const void *msg, size_t len, int flags, int
const BYTE *ptr = msg;
size_t chunk_size;
if (flags) FIXME("flags %08x not supported in SSL\n", flags);
*sent = 0;
while(len) {
@ -575,7 +573,7 @@ BOOL netconn_send( netconn_t *conn, const void *msg, size_t len, int flags, int
return TRUE;
}
if ((*sent = send( conn->socket, msg, len, flags )) == -1)
if ((*sent = send( conn->socket, msg, len, 0 )) == -1)
{
set_last_error( sock_get_error( errno ) );
return FALSE;
@ -687,17 +685,7 @@ BOOL netconn_recv( netconn_t *conn, void *buf, size_t len, int flags, int *recvd
SIZE_T size, cread;
BOOL res, eof;
if (flags & ~(MSG_PEEK | MSG_WAITALL))
FIXME("SSL_read does not support the following flags: %08x\n", flags);
if (flags & MSG_PEEK && conn->peek_msg)
{
if (len < conn->peek_len) FIXME("buffer isn't big enough, should we wrap?\n");
*recvd = min( len, conn->peek_len );
memcpy( buf, conn->peek_msg, *recvd );
return TRUE;
}
else if (conn->peek_msg)
if (conn->peek_msg)
{
*recvd = min( len, conn->peek_len );
memcpy( buf, conn->peek_msg, *recvd );
@ -711,7 +699,7 @@ BOOL netconn_recv( netconn_t *conn, void *buf, size_t len, int flags, int *recvd
conn->peek_msg = NULL;
}
/* check if we have enough data from the peek buffer */
if (!(flags & MSG_WAITALL) || (*recvd == len)) return TRUE;
if (!(flags & MSG_WAITALL) || *recvd == len) return TRUE;
}
size = *recvd;
@ -732,14 +720,6 @@ BOOL netconn_recv( netconn_t *conn, void *buf, size_t len, int flags, int *recvd
size += cread;
}while(!size || ((flags & MSG_WAITALL) && size < len));
if(size && (flags & MSG_PEEK)) {
conn->peek_msg_mem = conn->peek_msg = heap_alloc(size);
if(!conn->peek_msg)
return FALSE;
memcpy(conn->peek_msg, buf, size);
}
TRACE("received %ld bytes\n", size);
*recvd = size;
return TRUE;
@ -772,84 +752,6 @@ BOOL netconn_query_data_available( netconn_t *conn, DWORD *available )
return TRUE;
}
BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen )
{
// ReactOS: use select instead of poll
fd_set infd;
BOOL ret = FALSE;
DWORD recvd = 0;
if (!netconn_connected( conn )) return FALSE;
if (conn->secure)
{
while (recvd < *buflen)
{
int dummy;
if (!netconn_recv( conn, &buffer[recvd], 1, 0, &dummy ))
{
set_last_error( ERROR_CONNECTION_ABORTED );
break;
}
if (buffer[recvd] == '\n')
{
ret = TRUE;
break;
}
if (buffer[recvd] != '\r') recvd++;
}
if (ret)
{
buffer[recvd++] = 0;
*buflen = recvd;
TRACE("received line %s\n", debugstr_a(buffer));
}
return ret;
}
FD_ZERO(&infd);
FD_SET(conn->socket, &infd);
while (recvd < *buflen)
{
int res;
struct timeval tv, *ptv;
socklen_t len = sizeof(tv);
if ((res = getsockopt( conn->socket, SOL_SOCKET, SO_RCVTIMEO, (void*)&tv, &len ) != -1))
ptv = &tv;
else
ptv = NULL;
if (select( 0, &infd, NULL, NULL, ptv ) > 0)
{
if ((res = recv( conn->socket, &buffer[recvd], 1, 0 )) <= 0)
{
if (res == -1) set_last_error( sock_get_error( errno ) );
break;
}
if (buffer[recvd] == '\n')
{
ret = TRUE;
break;
}
if (buffer[recvd] != '\r') recvd++;
}
else
{
set_last_error( ERROR_WINHTTP_TIMEOUT );
break;
}
}
if (ret)
{
buffer[recvd++] = 0;
*buflen = recvd;
TRACE("received line %s\n", debugstr_a(buffer));
}
return ret;
}
DWORD netconn_set_timeout( netconn_t *netconn, BOOL send, int value )
{
struct timeval tv;

File diff suppressed because it is too large Load diff

View file

@ -560,6 +560,9 @@ static void request_destroy( object_header_t *hdr )
release_object( &request->connect->hdr );
destroy_authinfo( request->authinfo );
destroy_authinfo( request->proxy_authinfo );
heap_free( request->verb );
heap_free( request->path );
heap_free( request->version );

View file

@ -51,6 +51,7 @@ static const WCHAR headW[] = {'H','E','A','D',0};
static const WCHAR slashW[] = {'/',0};
static const WCHAR http1_0[] = {'H','T','T','P','/','1','.','0',0};
static const WCHAR http1_1[] = {'H','T','T','P','/','1','.','1',0};
static const WCHAR chunkedW[] = {'c','h','u','n','k','e','d',0};
typedef struct _object_header_t object_header_t;
@ -146,6 +147,29 @@ typedef struct
BOOL is_request; /* part of request headers? */
} header_t;
enum auth_scheme
{
SCHEME_INVALID = -1,
SCHEME_BASIC,
SCHEME_NTLM,
SCHEME_PASSPORT,
SCHEME_DIGEST,
SCHEME_NEGOTIATE
};
struct authinfo
{
enum auth_scheme scheme;
CredHandle cred;
CtxtHandle ctx;
TimeStamp exp;
ULONG attr;
ULONG max_token;
char *data;
unsigned int data_len;
BOOL finished; /* finished authenticating */
};
typedef struct
{
object_header_t hdr;
@ -154,6 +178,8 @@ typedef struct
LPWSTR path;
LPWSTR version;
LPWSTR raw_headers;
void *optional;
DWORD optional_len;
netconn_t netconn;
int resolve_timeout;
int connect_timeout;
@ -162,10 +188,16 @@ typedef struct
LPWSTR status_text;
DWORD content_length; /* total number of bytes to be read (per chunk) */
DWORD content_read; /* bytes read so far */
BOOL read_chunked; /* are we reading in chunked mode? */
DWORD read_pos; /* current read position in read_buf */
DWORD read_size; /* valid data size in read_buf */
char read_buf[4096]; /* buffer for already read but not returned data */
header_t *headers;
DWORD num_headers;
WCHAR **accept_types;
DWORD num_accept_types;
struct authinfo *authinfo;
struct authinfo *proxy_authinfo;
} request_t;
typedef struct _task_header_t task_header_t;
@ -229,14 +261,13 @@ BOOL netconn_close( netconn_t * ) DECLSPEC_HIDDEN;
BOOL netconn_connect( netconn_t *, const struct sockaddr *, unsigned int, int ) DECLSPEC_HIDDEN;
BOOL netconn_connected( netconn_t * ) DECLSPEC_HIDDEN;
BOOL netconn_create( netconn_t *, int, int, int ) DECLSPEC_HIDDEN;
BOOL netconn_get_next_line( netconn_t *, char *, DWORD * ) DECLSPEC_HIDDEN;
BOOL netconn_init( netconn_t * ) DECLSPEC_HIDDEN;
void netconn_unload( void ) DECLSPEC_HIDDEN;
BOOL netconn_query_data_available( netconn_t *, DWORD * ) DECLSPEC_HIDDEN;
BOOL netconn_recv( netconn_t *, void *, size_t, int, int * ) DECLSPEC_HIDDEN;
BOOL netconn_resolve( WCHAR *, INTERNET_PORT, struct sockaddr *, socklen_t *, int ) DECLSPEC_HIDDEN;
BOOL netconn_secure_connect( netconn_t *, WCHAR * ) DECLSPEC_HIDDEN;
BOOL netconn_send( netconn_t *, const void *, size_t, int, int * ) DECLSPEC_HIDDEN;
BOOL netconn_send( netconn_t *, const void *, size_t, int * ) DECLSPEC_HIDDEN;
DWORD netconn_set_timeout( netconn_t *, BOOL, int ) DECLSPEC_HIDDEN;
const void *netconn_get_certificate( netconn_t * ) DECLSPEC_HIDDEN;
int netconn_get_cipher_strength( netconn_t * ) DECLSPEC_HIDDEN;
@ -245,7 +276,8 @@ BOOL set_cookies( request_t *, const WCHAR * ) DECLSPEC_HIDDEN;
BOOL add_cookie_headers( request_t * ) DECLSPEC_HIDDEN;
BOOL add_request_headers( request_t *, LPCWSTR, DWORD, DWORD ) DECLSPEC_HIDDEN;
void delete_domain( domain_t * ) DECLSPEC_HIDDEN;
BOOL set_server_for_hostname( connect_t *connect, LPCWSTR server, INTERNET_PORT port ) DECLSPEC_HIDDEN;
BOOL set_server_for_hostname( connect_t *, LPCWSTR, INTERNET_PORT ) DECLSPEC_HIDDEN;
void destroy_authinfo( struct authinfo * ) DECLSPEC_HIDDEN;
extern HRESULT WinHttpRequest_create( IUnknown *, void ** ) DECLSPEC_HIDDEN;

View file

@ -202,7 +202,7 @@ reactos/dll/win32/wer # Autosync
reactos/dll/win32/windowscodecs # Synced to Wine-1.7.1
reactos/dll/win32/winemp3.acm # Synced to Wine-1.7.1
reactos/dll/win32/wing32 # Out of sync
reactos/dll/win32/winhttp # Synced to Wine-1.5.26
reactos/dll/win32/winhttp # Synced to Wine-1.7.1
reactos/dll/win32/wininet # Synced to Wine-1.5.26
reactos/dll/win32/winmm # Forked at Wine-20050628
reactos/dll/win32/winmm/midimap # Forked at Wine-20050628