+static void do_request( HINTERNET con, const WCHAR *obj, DWORD flags )
+{
+ HINTERNET req;
+ DWORD status, size;
+ BOOL ret;
+
+ req = WinHttpOpenRequest( con, NULL, obj, NULL, NULL, NULL, flags );
+ ok( req != NULL, "failed to open a request %u\n", GetLastError() );
+
+ ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
+ ok( ret, "failed to send request %u\n", GetLastError() );
+
+ ret = WinHttpReceiveResponse( req, NULL );
+ ok( ret, "failed to receive response %u\n", GetLastError() );
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_STATUS_CODE|WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL );
+ ok( ret, "failed to query status code %u\n", GetLastError() );
+ ok( status == HTTP_STATUS_OK || broken(status == HTTP_STATUS_BAD_REQUEST) /* < win7 */,
+ "request %s with flags %08x failed %u\n", wine_dbgstr_w(obj), flags, status );
+ WinHttpCloseHandle( req );
+}
+
+static void test_request_path_escapes( int port )
+{
+ static const WCHAR objW[] =
+ {'/','e','s','c','a','p','e','\r','\n',0x1f,0x7f,'<',' ','%','o','n','e','?',0x1f,0x7f,' ','!','"','#',
+ '$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_','`',
+ '{','|','}','~','\r','\n',0};
+ static const WCHAR obj2W[] =
+ {'/','e','s','c','a','p','e','\r','\n',0x1f,0x7f,'<',' ','%','t','w','o','?',0x1f,0x7f,' ','!','"','#',
+ '$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_','`',
+ '{','|','}','~','\r','\n',0};
+ static const WCHAR obj3W[] =
+ {'/','e','s','c','a','p','e','\r','\n',0x1f,0x7f,'<',' ','%','t','h','r','e','e','?',0x1f,0x7f,' ','!',
+ '"','#','$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^',
+ '_','`','{','|','}','~','\r','\n',0};
+ static const WCHAR obj4W[] =
+ {'/','e','s','c','a','p','e','\r','\n',0x1f,0x7f,'<',' ','%','f','o','u','r','?',0x1f,0x7f,' ','!','"',
+ '#','$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_',
+ '`','{','|','}','~','\r','\n',0};
+ static const WCHAR obj5W[] =
+ {'/','e','s','c','a','p','e','&','t','e','x','t','=','o','n','e',0x80,0x7f,0x7e,0};
+ static const WCHAR obj6W[] =
+ {'/','e','s','c','a','p','e','&','t','e','x','t','=','t','w','o',0x80,0x7f,0x7e,0};
+ static const WCHAR obj7W[] =
+ {'/','e','s','c','a','p','e','&','t','e','x','t','=',0x541b,0x306e,0x540d,0x306f,0};
+ HINTERNET ses, con;
+
+ ses = WinHttpOpen( test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0 );
+ ok( ses != NULL, "failed to open session %u\n", GetLastError() );
+
+ con = WinHttpConnect( ses, localhostW, port, 0 );
+ ok( con != NULL, "failed to open a connection %u\n", GetLastError() );
+
+ do_request( con, objW, 0 );
+ do_request( con, obj2W, WINHTTP_FLAG_ESCAPE_PERCENT );
+ do_request( con, obj3W, WINHTTP_FLAG_ESCAPE_DISABLE );
+ do_request( con, obj4W, WINHTTP_FLAG_ESCAPE_DISABLE_QUERY );
+ do_request( con, obj5W, 0 );
+ do_request( con, obj6W, WINHTTP_FLAG_ESCAPE_DISABLE );
+ do_request( con, obj7W, WINHTTP_FLAG_ESCAPE_DISABLE );
+
+ WinHttpCloseHandle( con );
+ WinHttpCloseHandle( ses );
+}
+