Advertisement
Guest User

Untitled

a guest
Apr 11th, 2013
553
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.44 KB | None | 0 0
  1. C:>netsh http add sslcert ipport=0.0.0.0:9999 certhash=e515b6512e92f4663252eac72c28a784f2d78c6 appid={2C565242-B238-11D3-442D-0008C779D776} clientcertnegotiation=enable
  2.  
  3. DWORD answer = 0;
  4. HTTP_SSL_CLIENT_CERT_INFO sslClientCertInfo;
  5. ULONG bytesReceived;
  6. answer = HttpReceiveClientCertificate(hReqQueue, pRequest->ConnectionId, 0,
  7. &sslClientCertInfo, sizeof( HTTP_SSL_CLIENT_CERT_INFO ), &bytesReceived, NULL );
  8.  
  9. #include "precomp.h"
  10. #include <iostream>
  11.  
  12. //
  13. // Macros.
  14. //
  15. #define INITIALIZE_HTTP_RESPONSE( resp, status, reason )
  16. do
  17. {
  18. RtlZeroMemory( (resp), sizeof(*(resp)) );
  19. (resp)->StatusCode = (status);
  20. (resp)->pReason = (reason);
  21. (resp)->ReasonLength = (USHORT) strlen(reason);
  22. } while (FALSE)
  23.  
  24. #define ADD_KNOWN_HEADER(Response, HeaderId, RawValue)
  25. do
  26. {
  27. (Response).Headers.KnownHeaders[(HeaderId)].pRawValue =
  28. (RawValue);
  29. (Response).Headers.KnownHeaders[(HeaderId)].RawValueLength =
  30. (USHORT) strlen(RawValue);
  31. } while(FALSE)
  32.  
  33. #define ALLOC_MEM(cb) HeapAlloc(GetProcessHeap(), 0, (cb))
  34.  
  35. #define FREE_MEM(ptr) HeapFree(GetProcessHeap(), 0, (ptr))
  36.  
  37. //
  38. // Prototypes.
  39. //
  40. DWORD DoReceiveRequests(HANDLE hReqQueue);
  41.  
  42. DWORD SendHttpResponse(HANDLE hReqQueue, PHTTP_REQUEST pRequest, USHORT StatusCode, PSTR pReason, PSTR pEntity);
  43.  
  44. DWORD SendHttpPostResponse(HANDLE hReqQueue, PHTTP_REQUEST pRequest);
  45.  
  46. /*******************************************************************++
  47.  
  48. Routine Description:
  49. main routine
  50.  
  51. Arguments:
  52. argc - # of command line arguments.
  53. argv - Arguments.
  54.  
  55. Return Value:
  56. Success/Failure
  57.  
  58. --*******************************************************************/
  59. int __cdecl wmain(int argc, wchar_t * argv[])
  60. {
  61. ULONG retCode;
  62. HANDLE hReqQueue = NULL; //request queue handle
  63. int UrlAdded = 0;
  64. HTTPAPI_VERSION HttpApiVersion = HTTPAPI_VERSION_2;
  65.  
  66.  
  67. retCode = HttpInitialize(
  68. HttpApiVersion,
  69. HTTP_INITIALIZE_SERVER ,
  70. NULL
  71. );
  72.  
  73. if (retCode == NO_ERROR)
  74. {
  75. // If intialize succeeded, create server session
  76. HTTP_SERVER_SESSION_ID serverSessionId = NULL;
  77. retCode = HttpCreateServerSession(HttpApiVersion, &serverSessionId, 0);
  78. if (retCode == NO_ERROR)
  79. {
  80. // server session creation succeeded
  81.  
  82. //create request queue
  83. retCode = HttpCreateRequestQueue(HttpApiVersion, NULL, NULL, 0, &hReqQueue);
  84. if (retCode == NO_ERROR)
  85. {
  86. //create the URL group
  87. HTTP_URL_GROUP_ID urlGroupId = NULL;
  88. retCode = HttpCreateUrlGroup(serverSessionId, &urlGroupId, 0);
  89. if (retCode == NO_ERROR)
  90. {
  91. retCode = HttpAddUrlToUrlGroup(urlGroupId, L"https://127.0.0.1:9999/hello", 0, 0);
  92. if (retCode == NO_ERROR)
  93. {
  94. //Set url group properties
  95.  
  96. //First let's set the binding property:
  97. HTTP_BINDING_INFO bindingInfo;
  98. bindingInfo.RequestQueueHandle = hReqQueue;
  99. HTTP_PROPERTY_FLAGS propertyFlags;
  100. propertyFlags.Present = 1;
  101. bindingInfo.Flags = propertyFlags;
  102. retCode = HttpSetUrlGroupProperty(
  103. urlGroupId,
  104. HttpServerBindingProperty,
  105. &bindingInfo,
  106. sizeof( HTTP_BINDING_INFO ));
  107.  
  108.  
  109. DoReceiveRequests(hReqQueue);
  110. }
  111.  
  112. HttpCloseUrlGroup(urlGroupId);
  113. }//if HttpCreateUrlGroup succeeded
  114.  
  115. HttpCloseRequestQueue(hReqQueue);
  116. }//if HttpCreateRequestQueue succeeded
  117.  
  118.  
  119. HttpCloseServerSession(serverSessionId);
  120. } // if HttpCreateServerSession succeeded
  121.  
  122. HttpTerminate(HTTP_INITIALIZE_SERVER, NULL);
  123. }// if httpInialize succeeded
  124.  
  125. return retCode;
  126.  
  127. }//main
  128.  
  129.  
  130. /*******************************************************************++
  131.  
  132. Routine Description:
  133. The function to receive a request. This function calls the
  134. corresponding function to handle the response.
  135.  
  136. Arguments:
  137. hReqQueue - Handle to the request queue
  138.  
  139. Return Value:
  140. Success/Failure.
  141.  
  142. --*******************************************************************/
  143. DWORD DoReceiveRequests(IN HANDLE hReqQueue)
  144. {
  145. ULONG result;
  146. HTTP_REQUEST_ID requestId;
  147. DWORD bytesRead;
  148. PHTTP_REQUEST pRequest;
  149. PCHAR pRequestBuffer;
  150. ULONG RequestBufferLength;
  151.  
  152. //
  153. // Allocate a 2 KB buffer. This size should work for most
  154. // requests. The buffer size can be increased if required. Space
  155. // is also required for an HTTP_REQUEST structure.
  156. //
  157. RequestBufferLength = sizeof(HTTP_REQUEST) + 2048;
  158. pRequestBuffer = (PCHAR) ALLOC_MEM( RequestBufferLength );
  159.  
  160. if (pRequestBuffer == NULL)
  161. {
  162. return ERROR_NOT_ENOUGH_MEMORY;
  163. }
  164.  
  165. pRequest = (PHTTP_REQUEST)pRequestBuffer;
  166.  
  167. //
  168. // Wait for a new request. This is indicated by a NULL
  169. // request ID.
  170. //
  171.  
  172. HTTP_SET_NULL_ID( &requestId );
  173.  
  174. for(;;)
  175. {
  176. RtlZeroMemory(pRequest, RequestBufferLength);
  177.  
  178. result = HttpReceiveHttpRequest(
  179. hReqQueue, // Req Queue
  180. requestId, // Req ID
  181. 0, // Flags
  182. pRequest, // HTTP request buffer
  183. RequestBufferLength,// req buffer length
  184. &bytesRead, // bytes received
  185. NULL // LPOVERLAPPED
  186. );
  187. if(NO_ERROR == result)
  188. {
  189.  
  190. DWORD answer = 0;
  191. HTTP_SSL_CLIENT_CERT_INFO sslClientCertInfo;
  192. ULONG bytesReceived;
  193. answer = HttpReceiveClientCertificate(hReqQueue, pRequest->ConnectionId, 0,
  194. &sslClientCertInfo, sizeof( HTTP_SSL_CLIENT_CERT_INFO ), &bytesReceived, NULL );
  195.  
  196.  
  197. if (answer != NO_ERROR)
  198. {
  199. result = SendHttpResponse(hReqQueue, pRequest, 401, "Unauthorized request", "Unauthorized request");
  200. }
  201. else
  202. {
  203. result = SendHttpResponse(hReqQueue, pRequest, 200, "OK", "OK");
  204. }
  205.  
  206. if (result != NO_ERROR)
  207. {
  208. break; //if failed to send response, stop listening for further incoming requests
  209. }
  210. //
  211. // Reset the Request ID to handle the next request.
  212. //
  213. HTTP_SET_NULL_ID( &requestId );
  214. }
  215. else
  216. {
  217. break;
  218. }
  219.  
  220. }
  221. if(pRequestBuffer)
  222. {
  223. FREE_MEM( pRequestBuffer );
  224. }
  225.  
  226. return result;
  227. }
  228.  
  229.  
  230.  
  231. /*******************************************************************++
  232.  
  233. Routine Description:
  234. The routine sends a HTTP response
  235.  
  236. Arguments:
  237. hReqQueue - Handle to the request queue
  238. pRequest - The parsed HTTP request
  239. StatusCode - Response Status Code
  240. pReason - Response reason phrase
  241. pEntityString - Response entity body
  242.  
  243. Return Value:
  244. Success/Failure.
  245. --*******************************************************************/
  246.  
  247. DWORD SendHttpResponse(
  248. IN HANDLE hReqQueue,
  249. IN PHTTP_REQUEST pRequest,
  250. IN USHORT StatusCode,
  251. IN PSTR pReason,
  252. IN PSTR pEntityString
  253. )
  254. {
  255. HTTP_RESPONSE response;
  256. HTTP_DATA_CHUNK dataChunk;
  257. DWORD result;
  258. DWORD bytesSent;
  259.  
  260.  
  261. INITIALIZE_HTTP_RESPONSE(&response, StatusCode, pReason);
  262. ADD_KNOWN_HEADER(response, HttpHeaderContentType, "text/html");
  263.  
  264.  
  265. if(pEntityString)
  266. {
  267. //
  268. // Add an entity chunk.
  269. //
  270. dataChunk.DataChunkType = HttpDataChunkFromMemory;
  271. dataChunk.FromMemory.pBuffer = pEntityString;
  272. dataChunk.FromMemory.BufferLength =
  273. (ULONG) strlen(pEntityString);
  274.  
  275. response.EntityChunkCount = 1;
  276. response.pEntityChunks = &dataChunk;
  277. }
  278.  
  279. result = HttpSendHttpResponse(
  280. hReqQueue, // ReqQueueHandle
  281. pRequest->RequestId, // Request ID
  282. 0, // Flags
  283. &response, // HTTP response
  284. NULL, // pReserved1
  285. &bytesSent, // bytes sent (OPTIONAL)
  286. NULL, // pReserved2 (must be NULL)
  287. 0, // Reserved3 (must be 0)
  288. NULL, // LPOVERLAPPED(OPTIONAL)
  289. NULL // pReserved4 (must be NULL)
  290. );
  291.  
  292. if(result != NO_ERROR)
  293. {
  294. wprintf(L"HttpSendHttpResponse failed with %lu n", result);
  295. }
  296.  
  297. return result;
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement