Skip to content

Commit b5446af

Browse files
author
Ognjen Sobajic
committed
Merge branch 'development' of https://git01.codeplex.com/casablanca into development
2 parents 96489f2 + 76156f0 commit b5446af

File tree

8 files changed

+177
-8
lines changed

8 files changed

+177
-8
lines changed

Release/collateral/Samples/BlackJack/BlackJack_Client/BlackJackClient.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ void PrintTable(const http_response &response, bool &refresh)
127127
if ( suppressMoney )
128128
ucout << "'" << name.as_string() << "'" ;
129129
else
130-
fprintf(stdout, "'%s' Balance = $%02g ", name.as_string().c_str(), bet.as_double());
130+
ucout << "'" << name.as_string() << "' Balance = $" << bet.as_double() << " ";
131+
131132
PrintHand(suppressMoney, BJHand::FromJSON(player[HAND]));
132133
ucout << std::endl;
133134
}

Release/include/cpprest/http_client.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@
2929
#ifndef _CASA_HTTP_CLIENT_H
3030
#define _CASA_HTTP_CLIENT_H
3131

32+
#if defined (__cplusplus_winrt)
33+
#define __WRL_NO_DEFAULT_LIB__
34+
#include <wrl.h>
35+
#include <msxml6.h>
36+
namespace web { namespace http{namespace client{
37+
typedef IXMLHTTPRequest2* native_handle;}}}
38+
#else
39+
namespace web { namespace http{namespace client{
40+
typedef void* native_handle;}}}
41+
#endif // __cplusplus_winrt
3242

3343
#include <memory>
3444
#include <limits>
@@ -53,6 +63,16 @@ namespace web { namespace http
5363
namespace client
5464
{
5565

66+
#ifdef _MS_WINDOWS
67+
namespace details {
68+
#ifdef __cplusplus_winrt
69+
class winrt_client ;
70+
#else
71+
class winhttp_client;
72+
#endif // __cplusplus_winrt
73+
}
74+
#endif // _MS_WINDOWS
75+
5676
/// <summary>
5777
/// credentials represents a set of user credentials (username and password) to be used
5878
/// for the client and proxy authentication
@@ -130,6 +150,7 @@ class http_client_config
130150
#if !defined(__cplusplus_winrt)
131151
, m_validate_certificates(true)
132152
#endif
153+
,m_set_user_nativehandle_options([](native_handle)->void{})
133154
{
134155
}
135156

@@ -245,6 +266,15 @@ class http_client_config
245266
}
246267
#endif
247268

269+
/// <summary>
270+
/// Sets a callback to enable custom setting of winhttp options
271+
/// </summary>
272+
/// <param name="callback">A user callback allowing for customization of the request</param>
273+
void set_nativehandle_options(std::function<void(native_handle)> callback)
274+
{
275+
m_set_user_nativehandle_options = callback;
276+
}
277+
248278
private:
249279
web_proxy m_proxy;
250280
http::client::credentials m_credentials;
@@ -255,9 +285,29 @@ class http_client_config
255285
#if !defined(__cplusplus_winrt)
256286
bool m_validate_certificates;
257287
#endif
288+
std::function<void(native_handle)> m_set_user_nativehandle_options;
258289

259290
utility::seconds m_timeout;
260291
size_t m_chunksize;
292+
293+
#ifdef _MS_WINDOWS
294+
#ifdef __cplusplus_winrt
295+
friend class details::winrt_client;
296+
#else
297+
friend class details::winhttp_client;
298+
#endif // __cplusplus_winrt
299+
#endif // _MS_WINDOWS
300+
301+
302+
/// <summary>
303+
/// Invokes a user callback to allow for customization of the requst
304+
/// </summary>
305+
/// <param name="handle">The internal http_request handle</param>
306+
/// <returns>True if users set WinHttp/IXAMLHttpRequest2 options correctly, false otherwise.</returns>
307+
void call_user_nativehandle_options(native_handle handle) const
308+
{
309+
m_set_user_nativehandle_options(handle);
310+
}
261311
};
262312

263313
/// <summary>

Release/setup/CasablancaSetup.wxs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
<?define VSTargetShort = "VS 2012" ?>
1111
<?define VSTargetFileSuffix = "110" ?>
1212
<?define SDK_RegKeyName = "110" ?>
13+
<?define ExtSDKWinVer = "v8.0" ?>
1314
<?elseif $(var.VSTargetVersion) = 12 ?>
1415
<?include VS12\guiddefs.wxi ?>
1516
<?define VSTargetShort = "VS 2013" ?>
1617
<?define VSTargetFileSuffix = "120" ?>
1718
<?define SDK_RegKeyName = "120" ?>
19+
<?define ExtSDKWinVer = "v8.1" ?>
1820
<?endif ?>
1921

2022
<!-- last GUID used:
@@ -163,7 +165,7 @@
163165
<?if $(var.VSTargetVersion) != 10 ?>
164166
<Directory Id="Microsoft_SDKs" Name="Microsoft SDKs">
165167
<Directory Id="Windows" Name="Windows">
166-
<Directory Id="v8.0" Name="v8.0">
168+
<Directory Id="winver" Name="$(var.ExtSDKWinVer)">
167169
<Directory Id="ExtensionSDKs" Name="ExtensionSDKs">
168170
<Directory Id="CppRESTWindowsSDK" Name="CppRESTWindowsSDK">
169171
<Directory Id="dir_ver" Name="$(var.ProductVersion)">

Release/src/http/client/http_win7.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,17 @@ namespace web { namespace http
644644

645645
winhttp_context->m_request_data = &m_request_data;
646646

647+
//call the callback function of user customized options
648+
try
649+
{
650+
client_config().call_user_nativehandle_options(winhttp_context->m_request_handle);
651+
}
652+
catch (...)
653+
{
654+
request->report_exception(std::current_exception());
655+
return;
656+
}
657+
647658
_start_request_send(winhttp_context, content_length);
648659

649660
return;

Release/src/http/client/http_win8.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,15 @@ namespace web { namespace http
7777
// Do not read more than the specified read_length
7878
msl::utilities::SafeInt<size_t> safe_count = static_cast<size_t>(cb);
7979
size_t size_to_read = safe_count.Min(m_read_length);
80-
80+
8181
size_t count = m_buffer.getn((uint8_t *)pv, size_to_read).get();
82-
82+
8383
if (count == 0 && size_to_read != 0)
8484
{
8585
*pcbRead = (ULONG)count;
8686
return (HRESULT)STG_E_READFAULT;
8787
}
88-
88+
8989
_ASSERTE(count != static_cast<size_t>(-1));
9090

9191
if (pcbRead != nullptr)
@@ -162,7 +162,7 @@ namespace web { namespace http
162162

163163
private:
164164
concurrency::streams::streambuf<uint8_t> m_buffer;
165-
165+
166166
request_context *m_request;
167167

168168
// Total count of bytes read
@@ -303,7 +303,7 @@ namespace web { namespace http
303303
{
304304
IXMLHTTPRequest2 * req = m_request->m_hRequest;
305305
if ( req != nullptr ) req->AddRef();
306-
306+
307307
if (m_request->m_exceptionPtr != nullptr)
308308
m_request->report_exception(m_request->m_exceptionPtr);
309309
else
@@ -363,7 +363,7 @@ namespace web { namespace http
363363
request->report_error(L"The method string is invalid.");
364364
return;
365365
}
366-
366+
367367
if ( msg.method() == http::methods::TRCE )
368368
{
369369
// Not supported by WinInet. Generate a more specific exception than what WinInet does.
@@ -490,6 +490,18 @@ namespace web { namespace http
490490
return;
491491
}
492492

493+
//call the callback function of user customized options
494+
try
495+
{
496+
config.call_user_nativehandle_options(xhr);
497+
}
498+
catch (...)
499+
{
500+
request->report_exception(std::current_exception());
501+
xhr->Release();
502+
return;
503+
}
504+
493505
if (content_length == 0)
494506
{
495507
hr = xhr->Send(nullptr, 0);

Release/tests/Functional/http/client/VS11/HttpClient110_test.vcxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
<SubSystem>Windows</SubSystem>
9090
<GenerateDebugInformation>true</GenerateDebugInformation>
9191
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
92+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
9293
</Link>
9394
</ItemDefinitionGroup>
9495
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
@@ -103,6 +104,7 @@
103104
<SubSystem>Windows</SubSystem>
104105
<GenerateDebugInformation>true</GenerateDebugInformation>
105106
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
107+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
106108
</Link>
107109
</ItemDefinitionGroup>
108110
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -117,6 +119,7 @@
117119
<SubSystem>Windows</SubSystem>
118120
<GenerateDebugInformation>true</GenerateDebugInformation>
119121
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
122+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
120123
</Link>
121124
</ItemDefinitionGroup>
122125
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -135,6 +138,7 @@
135138
<EnableCOMDATFolding>true</EnableCOMDATFolding>
136139
<OptimizeReferences>true</OptimizeReferences>
137140
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
141+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
138142
</Link>
139143
</ItemDefinitionGroup>
140144
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
@@ -153,6 +157,7 @@
153157
<EnableCOMDATFolding>true</EnableCOMDATFolding>
154158
<OptimizeReferences>true</OptimizeReferences>
155159
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
160+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
156161
</Link>
157162
</ItemDefinitionGroup>
158163
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -171,6 +176,7 @@
171176
<EnableCOMDATFolding>true</EnableCOMDATFolding>
172177
<OptimizeReferences>true</OptimizeReferences>
173178
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
179+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
174180
</Link>
175181
</ItemDefinitionGroup>
176182
<ItemGroup>

Release/tests/Functional/http/client/VS12/HttpClient120_test.vcxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
<SubSystem>Windows</SubSystem>
104104
<GenerateDebugInformation>true</GenerateDebugInformation>
105105
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
106+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
106107
</Link>
107108
</ItemDefinitionGroup>
108109
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
@@ -116,6 +117,7 @@
116117
<SubSystem>Windows</SubSystem>
117118
<GenerateDebugInformation>true</GenerateDebugInformation>
118119
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
120+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
119121
</Link>
120122
</ItemDefinitionGroup>
121123
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -129,6 +131,7 @@
129131
<SubSystem>Windows</SubSystem>
130132
<GenerateDebugInformation>true</GenerateDebugInformation>
131133
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
134+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
132135
</Link>
133136
</ItemDefinitionGroup>
134137
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -146,6 +149,7 @@
146149
<EnableCOMDATFolding>true</EnableCOMDATFolding>
147150
<OptimizeReferences>true</OptimizeReferences>
148151
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
152+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
149153
</Link>
150154
</ItemDefinitionGroup>
151155
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
@@ -163,6 +167,7 @@
163167
<EnableCOMDATFolding>true</EnableCOMDATFolding>
164168
<OptimizeReferences>true</OptimizeReferences>
165169
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
170+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
166171
</Link>
167172
</ItemDefinitionGroup>
168173
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -180,6 +185,7 @@
180185
<EnableCOMDATFolding>true</EnableCOMDATFolding>
181186
<OptimizeReferences>true</OptimizeReferences>
182187
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
188+
<AdditionalDependencies>Winhttp.lib;httpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
183189
</Link>
184190
</ItemDefinitionGroup>
185191
<ItemGroup>

Release/tests/Functional/http/client/authentication_tests.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@
2424
****/
2525

2626
#include "stdafx.h"
27+
#include <stdexcept>
28+
29+
#ifdef _MS_WINDOWS
30+
#ifdef __cplusplus_winrt
31+
#define __WRL_NO_DEFAULT_LIB__
32+
#include <wrl.h>
33+
#include <msxml6.h>
34+
#else
35+
#include <windows.h>
36+
#include <winhttp.h>
37+
#endif
38+
#endif
2739

2840
using namespace web;
2941
using namespace utility;
@@ -409,6 +421,75 @@ TEST_FIXTURE(server_properties, failed_authentication_resend_request_error, "Req
409421
VERIFY_ARE_EQUAL(200, response.status_code());
410422
}
411423

424+
#ifdef __cplusplus_winrt
425+
TEST_FIXTURE(uri_address, set_user_options_winrt)
426+
{
427+
test_http_server::scoped_server scoped(m_uri);
428+
scoped.server()->next_request().then([](test_request *p_request)
429+
{
430+
p_request->reply(status_codes::OK);
431+
});
432+
433+
http_client_config config;
434+
config.set_nativehandle_options([](native_handle handle)->void{
435+
auto hr = handle->SetProperty(XHR_PROP_TIMEOUT, 1000);
436+
if(!SUCCEEDED(hr))
437+
throw std::runtime_error("The Test Exception");
438+
});
439+
http_client client(m_uri, config);
440+
auto response = client.request(methods::GET).get();
441+
VERIFY_ARE_EQUAL(200, response.status_code());
442+
}
443+
#endif // __cplusplus_winrt
444+
445+
#ifdef _MS_WINDOWS
446+
#if !defined(__cplusplus_winrt)
447+
TEST_FIXTURE(server_properties, set_user_options, "Requires", "Server;UserName;Password")
448+
{
449+
load_parameters();
450+
451+
http_client_config config;
452+
config.set_credentials(credentials(m_username, m_password));
453+
454+
config.set_nativehandle_options([&](native_handle handle)->void{
455+
DWORD policy = WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW;
456+
if (!WinHttpSetOption(handle,
457+
WINHTTP_OPTION_AUTOLOGON_POLICY,
458+
&policy,
459+
sizeof(policy)))
460+
{
461+
throw std::runtime_error("The Test Error");
462+
}
463+
});
464+
465+
http_client client(m_uri, config);
466+
467+
const size_t rawDataSize = 8;
468+
469+
std::vector<unsigned char> data(rawDataSize);
470+
memcpy(&data[0], "raw data", rawDataSize);
471+
472+
http_request request;
473+
request.set_method(methods::POST);
474+
request.set_body(data);
475+
476+
VERIFY_ARE_EQUAL(200, client.request(request).get().status_code());
477+
}
478+
#endif
479+
480+
TEST_FIXTURE(uri_address, set_user_options_exceptions)
481+
{
482+
test_http_server::scoped_server scoped(m_uri);
483+
http_client_config config;
484+
class TestException;
485+
config.set_nativehandle_options([](native_handle handle)->void{
486+
(handle);
487+
throw std::runtime_error("The Test exception");
488+
});
489+
http_client client(m_uri, config);
490+
VERIFY_THROWS(client.request(methods::GET).get(), std::runtime_error);
491+
}
492+
#endif // _MS_WINDOWS
412493
#pragma endregion
413494

414495
// Fix for 522831 AV after failed authentication attempt

0 commit comments

Comments
 (0)