62#define NF_ALLOW 0x0001
63#define NF_WINE_ALLOW 0x0002
64#define NF_SIGNAL 0x0004
65#define NF_MAIN_THREAD 0x0008
66#define NF_SAVE_BUFFER 0x0010
67#define NF_OTHER_THREAD 0x0020
93 BOOL status_ok, function_ok;
248 "unexpected function %u, expected %u. probably some notifications were missing\n",
280 win_skip(
"Unload event not supported\n");
302 skip(
"connection failed, skipping\n");
337 skip(
"connection failed, skipping\n");
384 ok(
ret,
"failed to set unload option\n");
408 skip(
"connection failed, skipping\n");
439 skip(
"connection failed, skipping\n");
567 skip(
"connection failed, skipping\n");
640 win_skip(
"Unload event not supported\n");
652 ok(
ret,
"failed to set context value %lu\n",
err );
659 ok( con !=
NULL,
"failed to open a connection %lu\n",
err );
666 ok( req !=
NULL,
"failed to open a request %lu\n",
err );
671 ok(
ret,
"WinHttpAddRequestHeaders failed to add new header, got %d with error %lu\n",
ret,
err);
679 skip(
"connection failed, skipping\n");
686 ok(
ret,
"failed to send request %lu\n",
err );
695 ok(
ret,
"failed to receive response %lu\n",
err );
701 ok(
ret,
"failed to receive response %lu\n",
err );
710 ok(
ret,
"failed unexpectedly %lu\n",
err );
718 ok(
ret,
"failed to query data available %lu\n",
err );
729 ok(
ret,
"failed to read data %lu\n",
err );
881#define BIG_BUFFER_SIZE (16 * 1024)
892 unsigned char *big_buffer;
896 unsigned int i, test_index,
offset;
898 if (!pWinHttpWebSocketCompleteUpgrade)
900 win_skip(
"WinHttpWebSocketCompleteUpgrade not supported\n" );
916 win_skip(
"Unload event not supported\n" );
942 ok( connection !=
NULL,
"got %lu\n",
err );
983 skip(
"connection failed, skipping\n" );
1006 ok(
ret,
"failed unexpectedly %lu\n",
err );
1056 err = pWinHttpWebSocketShutdown(
socket, 1000, (
void *)
"success",
sizeof(
"success") );
1064 err = pWinHttpWebSocketShutdown(
socket, 1000, (
void *)
"success",
sizeof(
"success") );
1079 "got unexpected eBufferType %u\n", ws_status->
eBufferType );
1082 ok(
buffer[0] ==
'R',
"unexpected data\n" );
1102 ok( offset <= BIG_BUFFER_SIZE, "got %lu\n", ws_status->dwBytesTransferred );
1111 if (big_buffer[
i] != ((
i & 0xff) ^ 0xcc))
break;
1116 close_status = 0xdead;
1120 ok( close_status == 0xdead,
"got %u\n", close_status );
1124 err = pWinHttpWebSocketClose(
socket, 1000, (
void *)
"success",
sizeof(
"success") );
1128 close_status = 0xdead;
1132 ok( close_status == 1000,
"got %u\n", close_status );
1173 ok(
ret,
"failed unexpectedly %lu\n",
err );
1186 ok(
buffer[0] ==
'R',
"unexpected data\n" );
1192 err = pWinHttpWebSocketClose(
socket, 1000, (
void *)
"success",
sizeof(
"success") );
1197 ok( !
result->AsyncResult.dwResult,
"got %Iu\n",
result->AsyncResult.dwResult );
1200 close_status = 0xdead;
1204 ok( close_status == 0xdead,
"got %u\n", close_status );
1209 close_status = 0xdead;
1213 ok( close_status == 1000,
"got %u\n", close_status );
1256 ok(
ret,
"failed unexpectedly %lu\n",
err );
1269 ok(
buffer[0] ==
'R',
"unexpected data\n" );
1276 err = pWinHttpWebSocketClose(
socket, 1000, (
void *)
"success",
sizeof(
"success") );
1326 ok(
ret,
"failed unexpectedly %lu\n",
err );
1339 ok(
buffer[0] ==
'R',
"unexpected data\n" );
1354 ok( !
result->AsyncResult.dwResult,
"got %Iu\n",
result->AsyncResult.dwResult );
1394 ok(
ret,
"failed unexpectedly %lu\n",
err );
1407 ok(
buffer[0] ==
'R',
"unexpected data\n" );
1417 err = pWinHttpWebSocketShutdown(
socket, 1000, (
void *)
"success",
sizeof(
"success") );
1420 close_status = 0xdead;
1424 ok( close_status == 0xdead,
"got %u\n", close_status );
1433 close_status = 0xdead;
1437 ok( close_status == 1000,
"got %u\n", close_status );
1445 err = pWinHttpWebSocketClose(
socket, 1000, (
void *)
"success",
sizeof(
"success") );
1477"HTTP/1.1 200 OK\r\n"
1478"Server: winetest\r\n"
1483"<HEAD><TITLE>winhttp test page</TITLE></HEAD>\r\n"
1484"<BODY>The quick brown fox jumped over the lazy dog<P></BODY>\r\n"
1499 int r,
c = -1,
i, on;
1504 int last_request = 0;
1536 if (
i < 4)
continue;
1558 }
while (!last_request);
1632 if (reuse_connection)
1694#define server_read_data(a) _server_read_data(a,__LINE__)
1728 if (allow_closing_connection)
1759#define read_request_data(a,b,c) _read_request_data(a,b,c,__LINE__)
1786 trace(
"Testing persistent connection...\n");
1792 "HTTP/1.1 200 OK\r\n"
1793 "Server: winetest\r\n"
1794 "Connection: keep-alive\r\n"
1795 "Content-Length: 1\r\n"
1805 "HTTP/1.1 200 OK\r\n"
1806 "Server: winetest\r\n"
1807 "Transfer-Encoding: chunked\r\n"
1808 "Connection: keep-alive\r\n"
1810 "9\r\n123456789\r\n"
1819 "HTTP/1.1 200 OK\r\n"
1820 "Server: winetest\r\n"
1821 "Content-Length: 2\r\n"
1830 "HTTP/1.1 200 OK\r\n"
1831 "Server: winetest\r\n"
1832 "Content-Length: 2\r\n"
1833 "Connection: close\r\n"
1860#define TEST_RECURSION_LIMIT 128
1880 ok(
ret,
"failed.\n");
1901 "expected callback to be called from the other thread, got main.\n" );
1910 if (!
context->read_from_callback)
1930 ok(
ret,
"failed to read data, GetLastError() %lu\n",
err );
1932 ok(
b != 0xff,
"got %#x.\n",
b );
1958 ok(
ret,
"failed to query data available, GetLastError() %lu\n",
err );
1967 if (!
context->headers_available
1970 "expected callback to be called from the same thread, got %lx.\n",
GetCurrentThreadId() );
1977 static DWORD request_callback_status_tests[] =
2001 ok( !!connection,
"failed to open a connection, GetLastError() %lu\n",
GetLastError() );
2019 skip(
"Connection failed, skipping\n");
2037 ok(
status == 200,
"request failed unexpectedly, status %lu\n",
status );
2040 ok(
ret,
"failed to query data available, GetLastError() %lu\n",
GetLastError() );
2048 if (
context.have_sync_callback)
2050 ok(
context.max_recursion_query >= 2,
"got %lu\n",
context.max_recursion_query );
2051 ok(
context.max_recursion_read >= 2,
"got %lu\n",
context.max_recursion_read );
2053 else skip(
"no sync callbacks\n");
2057 for (
i = 0;
i <
ARRAY_SIZE(request_callback_status_tests); ++
i)
2065 context.call_receive_response_status = request_callback_status_tests[
i];
2072 skip(
"Connection failed, skipping\n");
2106 pWinHttpWebSocketClose = (
void *)
GetProcAddress(
mod,
"WinHttpWebSocketClose" );
2107 pWinHttpWebSocketCompleteUpgrade = (
void *)
GetProcAddress(
mod,
"WinHttpWebSocketCompleteUpgrade" );
2108 pWinHttpWebSocketQueryCloseStatus = (
void *)
GetProcAddress(
mod,
"WinHttpWebSocketQueryCloseStatus" );
2109 pWinHttpWebSocketReceive = (
void *)
GetProcAddress(
mod,
"WinHttpWebSocketReceive" );
2111 pWinHttpWebSocketShutdown = (
void *)
GetProcAddress(
mod,
"WinHttpWebSocketShutdown" );
std::map< E_MODULE, HMODULE > mod
ULONG WSAAPI inet_addr(IN CONST CHAR FAR *cp)
static struct sockaddr_in sa
#define InterlockedIncrement
#define InterlockedDecrement
struct protocol * protocols
static void * context_ptr(context_t *context)
#define ERROR_INVALID_PARAMETER
#define GetProcAddress(x, y)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
_ACRTIMP size_t __cdecl strlen(const char *)
_ACRTIMP char *__cdecl strstr(const char *, const char *)
_ACRTIMP int __cdecl strcmp(const char *, const char *)
HINTERNET WINAPI WinHttpOpenRequest(HINTERNET hconnect, const WCHAR *verb, const WCHAR *object, const WCHAR *version, const WCHAR *referrer, const WCHAR **types, DWORD flags)
BOOL WINAPI WinHttpQueryOption(HINTERNET handle, DWORD option, void *buffer, DWORD *buflen)
HINTERNET WINAPI WinHttpOpen(LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWSTR bypass, DWORD flags)
HINTERNET WINAPI WinHttpConnect(HINTERNET hsession, const WCHAR *server, INTERNET_PORT port, DWORD reserved)
BOOL WINAPI WinHttpSetOption(HINTERNET handle, DWORD option, void *buffer, DWORD buflen)
BOOL WINAPI WinHttpCloseHandle(HINTERNET handle)
WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback(HINTERNET handle, WINHTTP_STATUS_CALLBACK callback, DWORD flags, DWORD_PTR reserved)
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
INT WSAAPI send(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags)
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLdouble GLdouble GLdouble r
GLboolean GLboolean GLboolean b
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl void winetest_pop_context(void)
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
#define memcpy(s1, s2, n)
static BOOL test_redirect
static const struct notification close_request_test[]
#define read_request_data(a, b, c)
static const struct notification websocket_test[]
static void open_async_request(int port, struct test_request *req, struct info *info, const WCHAR *path, BOOL reuse_connection)
static const struct notification server_reply_test[]
static DWORD CALLBACK server_thread(LPVOID param)
static const struct notification websocket_test2[]
static const struct notification reuse_socket_request_test[]
static const struct notification async_test[]
static const char okmsg[]
static const struct notification cache_test[]
static HANDLE server_socket_closed
static const struct notification websocket_test5[]
static const struct notification websocket_test3[]
static const struct notification redirect_test[]
static void test_connection_cache(BOOL async)
static struct notification websocket_test4[]
static const char page1[]
@ winhttp_websocket_shutdown
@ winhttp_websocket_close
@ winhttp_websocket_complete_upgrade
@ winhttp_receive_response
@ winhttp_websocket_receive
static const struct notification close_allow_connection_close_request_test[]
static void test_basic_request(int port, const WCHAR *verb, const WCHAR *path)
static void _read_request_data(struct test_request *req, struct info *info, const char *expected_data, unsigned line)
static HANDLE server_socket_available
#define TEST_RECURSION_LIMIT
static HANDLE server_socket_done
static USHORT void DWORD *static void DWORD WINHTTP_WEB_SOCKET_BUFFER_TYPE *static WINHTTP_WEB_SOCKET_BUFFER_TYPE
static void setup_test(struct info *info, enum api function, unsigned int line)
static const struct notification redirect_test_async[]
static void CALLBACK test_recursion_callback(HINTERNET handle, DWORD_PTR context_ptr, DWORD status, void *buffer, DWORD buflen)
static const struct notification cache_test_async[]
#define server_read_data(a)
static void test_async(void)
static const struct notification read_test[]
static void _server_read_data(const char *expect_prefix, unsigned int line)
static void test_websocket(BOOL secure)
static void CALLBACK check_notification(HINTERNET handle, DWORD_PTR context, DWORD status, LPVOID buffer, DWORD buflen)
static void test_persistent_connection(int port)
static void open_socket_request(int port, struct test_request *req, struct info *info)
static void server_send_reply(struct test_request *req, struct info *info, const char *msg)
static const struct notification open_socket_request_test[]
static void test_recursion(void)
BOOL WINAPI WinHttpQueryHeaders(HINTERNET hrequest, DWORD level, const WCHAR *name, void *buffer, DWORD *buflen, DWORD *index)
BOOL WINAPI WinHttpAddRequestHeaders(HINTERNET hrequest, const WCHAR *headers, DWORD len, DWORD flags)
BOOL WINAPI WinHttpQueryDataAvailable(HINTERNET hrequest, LPDWORD available)
BOOL WINAPI WinHttpWriteData(HINTERNET hrequest, const void *buffer, DWORD to_write, DWORD *written)
BOOL WINAPI WinHttpReadData(HINTERNET hrequest, void *buffer, DWORD to_read, DWORD *read)
BOOL WINAPI WinHttpSendRequest(HINTERNET hrequest, const WCHAR *headers, DWORD headers_len, void *optional, DWORD optional_len, DWORD total_len, DWORD_PTR context)
BOOL WINAPI WinHttpReceiveResponse(HINTERNET hrequest, LPVOID reserved)
INT WSAAPI setsockopt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen)
INT WSAAPI listen(IN SOCKET s, IN INT backlog)
INT WSAAPI shutdown(IN SOCKET s, IN INT how)
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType
const struct notification * test
DWORD call_receive_response_status
DWORD receive_response_thread_id
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
DWORD WINAPI GetLastError(void)
DWORD WINAPI GetCurrentThreadId(void)
#define ERROR_INVALID_OPERATION
#define WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
#define WINHTTP_CALLBACK_STATUS_CLOSE_COMPLETE
#define WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
#define WINHTTP_OPTION_CONTEXT_VALUE
#define WINHTTP_CALLBACK_STATUS_REDIRECT
#define WINHTTP_CALLBACK_STATUS_SENDING_REQUEST
#define WINHTTP_OPTION_UNLOAD_NOTIFY_EVENT
#define ERROR_WINHTTP_OPERATION_CANCELLED
#define WINHTTP_OPTION_SECURITY_FLAGS
#define WINHTTP_CALLBACK_STATUS_SHUTDOWN_COMPLETE
#define ERROR_WINHTTP_CANNOT_CONNECT
#define WINHTTP_CALLBACK_STATUS_REQUEST_SENT
#define WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE
#define WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
#define WINHTTP_QUERY_STATUS_CODE
#define WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION
#define WINHTTP_CALLBACK_STATUS_READ_COMPLETE
#define WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING
#define WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS
#define WINHTTP_ADDREQ_FLAG_ADD
#define WINHTTP_QUERY_FLAG_NUMBER
#define WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED
#define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
@ WINHTTP_WEB_SOCKET_CLOSE_OPERATION
@ WINHTTP_WEB_SOCKET_RECEIVE_OPERATION
#define WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER
@ WINHTTP_WEB_SOCKET_CLOSE_BUFFER_TYPE
@ WINHTTP_WEB_SOCKET_UTF8_FRAGMENT_BUFFER_TYPE
@ WINHTTP_WEB_SOCKET_UTF8_MESSAGE_BUFFER_TYPE
@ WINHTTP_WEB_SOCKET_BINARY_FRAGMENT_BUFFER_TYPE
@ WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE
#define WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER
#define WINHTTP_ACCESS_TYPE_NO_PROXY
#define WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE
enum _WINHTTP_WEB_SOCKET_BUFFER_TYPE WINHTTP_WEB_SOCKET_BUFFER_TYPE
#define WINHTTP_CALLBACK_STATUS_REQUEST_ERROR
#define WINHTTP_FLAG_ASYNC
#define WINHTTP_CALLBACK_STATUS_RESOLVING_NAME
#define WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE
#define WINHTTP_ADDREQ_FLAG_REPLACE
#define WINHTTP_CALLBACK_STATUS_NAME_RESOLVED
#define ERROR_WINHTTP_TIMEOUT
#define WINHTTP_CALLBACK_STATUS_HANDLE_CREATED
#define WINHTTP_FLAG_SECURE
#define WINHTTP_OPTION_WEB_SOCKET_SEND_BUFFER_SIZE
#define WINHTTP_OPTION_SECURE_PROTOCOLS
#define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2
#define WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET
#define SECURITY_FLAG_IGNORE_UNKNOWN_CA
#define SECURITY_FLAG_IGNORE_CERT_CN_INVALID