Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

754 lines
20 KiB

  1. /*++
  2. Copyright (c) 2000 Microsoft Corporation
  3. Module Name:
  4. InetSess.cpp
  5. Abstract:
  6. Implements the Passport Session that uses WinInet as the underlying transport.
  7. Author:
  8. Biao Wang (biaow) 01-Oct-2000
  9. --*/
  10. #include "PPdefs.h"
  11. #include "session.h"
  12. // #include "inetsess.tmh"
  13. //
  14. // func pointer decl for WinHttp
  15. //
  16. typedef
  17. VOID
  18. (CALLBACK * WINHTTP_STATUS_CALLBACK)(
  19. IN HINTERNET hInternet,
  20. IN DWORD_PTR dwContext,
  21. IN DWORD dwInternetStatus,
  22. IN LPVOID lpvStatusInformation OPTIONAL,
  23. IN DWORD dwStatusInformationLength
  24. );
  25. typedef HINTERNET
  26. (WINAPI * PFN_INTERNET_OPEN)(
  27. IN LPCWSTR lpwszAgent,
  28. IN DWORD dwAccessType,
  29. IN LPCWSTR lpwszProxy OPTIONAL,
  30. IN LPCWSTR lpwszProxyBypass OPTIONAL,
  31. IN DWORD dwFlags
  32. );
  33. typedef HINTERNET
  34. (WINAPI * PFN_INTERNET_CONNECT)(
  35. IN HINTERNET hInternet,
  36. IN LPCWSTR lpwszServerName,
  37. IN INTERNET_PORT nServerPort,
  38. IN DWORD dwFlags
  39. );
  40. typedef HINTERNET
  41. (WINAPI * PFN_OPEN_REQUEST)(
  42. IN HINTERNET hConnect,
  43. IN LPCWSTR lpwszVerb,
  44. IN LPCWSTR lpwszObjectName,
  45. IN LPCWSTR lpwszVersion,
  46. IN LPCWSTR lpwszReferrer OPTIONAL,
  47. IN LPCWSTR FAR * lplpwszAcceptTypes OPTIONAL,
  48. IN DWORD dwFlags
  49. );
  50. typedef BOOL
  51. (WINAPI * PFN_SEND_REQUEST)(
  52. IN HINTERNET hRequest,
  53. IN LPCWSTR lpwszHeaders OPTIONAL,
  54. IN DWORD dwHeadersLength,
  55. IN LPVOID lpOptional OPTIONAL,
  56. IN DWORD dwOptionalLength,
  57. IN DWORD dwTotalLength,
  58. IN DWORD_PTR dwContext
  59. );
  60. typedef BOOL
  61. (WINAPI * PFN_RECEIVE_RESPONSE)(
  62. IN HINTERNET hRequest,
  63. IN LPVOID lpReserved
  64. );
  65. typedef BOOL
  66. (WINAPI * PFN_QUERY_INFO)(
  67. IN HINTERNET hRequest,
  68. IN DWORD dwInfoLevel,
  69. IN LPCWSTR lpszName OPTIONAL,
  70. IN LPVOID lpvBuffer,
  71. IN LPDWORD lpdwBufferLength,
  72. IN OUT LPDWORD lpdwIndex
  73. );
  74. typedef BOOL
  75. (WINAPI* PFN_CLOSE_HANDLE)(
  76. IN HINTERNET hInternet
  77. );
  78. typedef BOOL
  79. (WINAPI* PFN_SET_OPTION)(
  80. IN HINTERNET hInternet,
  81. IN DWORD dwOption,
  82. IN LPVOID lpBuffer,
  83. IN DWORD dwBufferLength
  84. );
  85. typedef BOOL
  86. (WINAPI* PFN_QUERY_OPTION)(
  87. IN HINTERNET hInternet,
  88. IN DWORD dwOption,
  89. OUT LPVOID lpBuffer,
  90. IN OUT LPDWORD lpdwBufferLength
  91. );
  92. typedef HINTERNET
  93. (WINAPI* PFN_OPEN_URL)(
  94. IN HINTERNET hInternet,
  95. IN LPCWSTR lpwszUrl,
  96. IN LPCWSTR lpwszHeaders,
  97. IN DWORD dwHeadersLength,
  98. IN DWORD dwFlags,
  99. IN DWORD_PTR dwContext
  100. );
  101. typedef BOOL
  102. (WINAPI* PFN_CRACK_URL)(
  103. IN LPCWSTR lpszUrl,
  104. IN DWORD dwUrlLength,
  105. IN DWORD dwFlags,
  106. IN OUT LPURL_COMPONENTSW lpUrlComponents
  107. );
  108. typedef BOOL
  109. (WINAPI* PFN_READ_FILE)(
  110. IN HINTERNET hFile,
  111. IN LPVOID lpBuffer,
  112. IN DWORD dwNumberOfBytesToRead,
  113. OUT LPDWORD lpdwNumberOfBytesRead
  114. );
  115. typedef WINHTTP_STATUS_CALLBACK
  116. (WINAPI* PFN_STATUS_CALLBACK)(
  117. IN HINTERNET hInternet,
  118. IN WINHTTP_STATUS_CALLBACK lpfnInternetCallback,
  119. IN DWORD dwNotificationFlags,
  120. IN DWORD_PTR dwReserved
  121. );
  122. typedef BOOL
  123. (WINAPI* PFN_ADD_HEADERS)(
  124. IN HINTERNET hConnect,
  125. IN LPCWSTR lpszHeaders,
  126. IN DWORD dwHeadersLength,
  127. IN DWORD dwModifiers
  128. );
  129. class WINHTTP_SESSION : public SESSION
  130. {
  131. protected:
  132. WINHTTP_SESSION(void);
  133. virtual ~WINHTTP_SESSION(void);
  134. virtual BOOL Open(PCWSTR pwszHttpStack, HINTERNET);
  135. virtual void Close(void);
  136. protected:
  137. virtual HINTERNET Connect(
  138. LPCWSTR lpwszServerName,
  139. INTERNET_PORT);
  140. virtual HINTERNET OpenRequest(
  141. HINTERNET hConnect,
  142. LPCWSTR lpwszVerb,
  143. LPCWSTR lpwszObjectName,
  144. DWORD dwFlags,
  145. DWORD_PTR dwContext = 0);
  146. virtual BOOL SendRequest(
  147. HINTERNET hRequest,
  148. LPCWSTR lpwszHeaders,
  149. DWORD dwHeadersLength,
  150. DWORD_PTR dwContext = 0);
  151. virtual BOOL ReceiveResponse(
  152. HINTERNET hRequest);
  153. virtual BOOL QueryHeaders(
  154. HINTERNET hRequest,
  155. DWORD dwInfoLevel,
  156. LPVOID lpvBuffer,
  157. LPDWORD lpdwBufferLength,
  158. LPDWORD lpdwIndex = NULL);
  159. virtual BOOL CloseHandle(
  160. IN HINTERNET hInternet);
  161. virtual BOOL QueryOption(
  162. HINTERNET hInternet,
  163. DWORD dwOption,
  164. LPVOID lpBuffer,
  165. LPDWORD lpdwBufferLength);
  166. virtual BOOL SetOption(
  167. HINTERNET hInternet,
  168. DWORD dwOption,
  169. LPVOID lpBuffer,
  170. DWORD dwBufferLength);
  171. virtual HINTERNET OpenUrl(
  172. LPCWSTR lpwszUrl,
  173. LPCWSTR lpwszHeaders,
  174. DWORD dwHeadersLength,
  175. DWORD dwFlags);
  176. virtual BOOL ReadFile(
  177. HINTERNET hFile,
  178. LPVOID lpBuffer,
  179. DWORD dwNumberOfBytesToRead,
  180. LPDWORD lpdwNumberOfBytesRead);
  181. virtual BOOL CrackUrl(
  182. LPCWSTR lpszUrl,
  183. DWORD dwUrlLength,
  184. DWORD dwFlags,
  185. LPURL_COMPONENTSW lpUrlComponents);
  186. virtual PVOID SetStatusCallback(
  187. HINTERNET hInternet,
  188. PVOID lpfnCallback
  189. );
  190. virtual BOOL AddHeaders(
  191. HINTERNET hConnect,
  192. LPCWSTR lpszHeaders,
  193. DWORD dwHeadersLength,
  194. DWORD dwModifiers
  195. );
  196. BOOL InitHttpApi(PFN_INTERNET_OPEN*);
  197. protected:
  198. // HINTERNET m_hInternet;
  199. PFN_INTERNET_CONNECT m_pfnConnect;
  200. PFN_OPEN_REQUEST m_pfnOpenRequest;
  201. PFN_SEND_REQUEST m_pfnSendRequest;
  202. PFN_RECEIVE_RESPONSE m_pfnReceiveResponse;
  203. PFN_QUERY_INFO m_pfnQueryInfo;
  204. PFN_CLOSE_HANDLE m_pfnCloseHandle;
  205. PFN_SET_OPTION m_pfnSetOption;
  206. PFN_OPEN_URL m_pfnOpenUrl;
  207. PFN_QUERY_OPTION m_pfnQueryOption;
  208. PFN_CRACK_URL m_pfnCrack;
  209. PFN_READ_FILE m_pfnReadFile;
  210. PFN_STATUS_CALLBACK m_pfnStatusCallback;
  211. PFN_ADD_HEADERS m_pfnAddHeaders;
  212. friend class SESSION;
  213. friend SESSION* CreateWinHttpSession(void);
  214. };
  215. SESSION* CreateWinHttpSession(void)
  216. {
  217. return new WINHTTP_SESSION();
  218. }
  219. //
  220. // Implementation for WINHTTP_SESSION
  221. //
  222. // -----------------------------------------------------------------------------
  223. WINHTTP_SESSION::WINHTTP_SESSION(void)
  224. {
  225. m_hInternet = NULL;
  226. m_pfnConnect = NULL;
  227. m_pfnOpenRequest = NULL;
  228. m_pfnSendRequest = NULL;
  229. m_pfnReceiveResponse = NULL;
  230. m_pfnQueryInfo = NULL;
  231. m_pfnCloseHandle = NULL;
  232. m_pfnSetOption = NULL;
  233. m_pfnOpenUrl = NULL;
  234. m_pfnQueryOption = NULL;
  235. m_pfnCrack = NULL;
  236. m_pfnReadFile = NULL;
  237. }
  238. // -----------------------------------------------------------------------------
  239. WINHTTP_SESSION::~WINHTTP_SESSION(void)
  240. {
  241. }
  242. // -----------------------------------------------------------------------------
  243. HINTERNET WINHTTP_SESSION::Connect(
  244. LPCWSTR lpwszServerName,
  245. INTERNET_PORT nPort)
  246. {
  247. PP_ASSERT(m_pfnConnect != NULL);
  248. return (*m_pfnConnect)(m_hInternet,
  249. lpwszServerName,
  250. nPort,
  251. 0);
  252. }
  253. // -----------------------------------------------------------------------------
  254. HINTERNET WINHTTP_SESSION::OpenRequest(
  255. HINTERNET hConnect,
  256. LPCWSTR lpwszVerb,
  257. LPCWSTR lpwszObjectName,
  258. DWORD dwFlags,
  259. DWORD_PTR dwContext)
  260. {
  261. UNREFERENCED_PARAMETER(dwContext);
  262. PP_ASSERT(m_pfnOpenRequest != NULL);
  263. return (*m_pfnOpenRequest)(hConnect,
  264. lpwszVerb,
  265. lpwszObjectName,
  266. L"HTTP/1.1",
  267. NULL,
  268. NULL,
  269. dwFlags);
  270. }
  271. // -----------------------------------------------------------------------------
  272. BOOL WINHTTP_SESSION::SendRequest(
  273. HINTERNET hRequest,
  274. LPCWSTR lpwszHeaders,
  275. DWORD dwHeadersLength,
  276. DWORD_PTR dwContext)
  277. {
  278. PP_ASSERT(m_pfnSendRequest != NULL);
  279. return (*m_pfnSendRequest)(hRequest,
  280. lpwszHeaders,
  281. dwHeadersLength,
  282. NULL,
  283. 0,
  284. 0, // optional total length
  285. dwContext);
  286. }
  287. // -----------------------------------------------------------------------------
  288. BOOL WINHTTP_SESSION::ReceiveResponse(
  289. HINTERNET hRequest)
  290. {
  291. PP_ASSERT(m_pfnReceiveResponse != NULL);
  292. return (*m_pfnReceiveResponse)(hRequest,
  293. 0);
  294. }
  295. // -----------------------------------------------------------------------------
  296. BOOL WINHTTP_SESSION::QueryHeaders(
  297. HINTERNET hRequest,
  298. DWORD dwInfoLevel,
  299. LPVOID lpvBuffer,
  300. LPDWORD lpdwBufferLength,
  301. LPDWORD lpdwIndex)
  302. {
  303. PP_ASSERT(m_pfnQueryInfo != NULL);
  304. return (*m_pfnQueryInfo)(hRequest,
  305. dwInfoLevel,
  306. WINHTTP_HEADER_NAME_BY_INDEX,
  307. lpvBuffer,
  308. lpdwBufferLength,
  309. lpdwIndex);
  310. }
  311. // -----------------------------------------------------------------------------
  312. BOOL WINHTTP_SESSION::CloseHandle(
  313. IN HINTERNET hInternet)
  314. {
  315. PP_ASSERT(m_pfnCloseHandle != NULL);
  316. return (*m_pfnCloseHandle)(hInternet);
  317. }
  318. // -----------------------------------------------------------------------------
  319. BOOL WINHTTP_SESSION::QueryOption(
  320. HINTERNET hInternet,
  321. DWORD dwOption,
  322. LPVOID lpBuffer,
  323. LPDWORD lpdwBufferLength)
  324. {
  325. PP_ASSERT(m_pfnQueryOption != NULL);
  326. return (*m_pfnQueryOption)(hInternet,
  327. dwOption,
  328. lpBuffer,
  329. lpdwBufferLength
  330. );
  331. }
  332. // -----------------------------------------------------------------------------
  333. BOOL WINHTTP_SESSION::SetOption(
  334. HINTERNET hInternet,
  335. DWORD dwOption,
  336. LPVOID lpBuffer,
  337. DWORD dwBufferLength)
  338. {
  339. PP_ASSERT(m_pfnSetOption != NULL);
  340. return (*m_pfnSetOption)(hInternet,
  341. dwOption,
  342. lpBuffer,
  343. dwBufferLength);
  344. }
  345. // -----------------------------------------------------------------------------
  346. HINTERNET WINHTTP_SESSION::OpenUrl(
  347. LPCWSTR lpwszUrl,
  348. LPCWSTR lpwszHeaders,
  349. DWORD dwHeadersLength,
  350. DWORD dwFlags)
  351. {
  352. UNREFERENCED_PARAMETER(lpwszUrl);
  353. UNREFERENCED_PARAMETER(lpwszHeaders);
  354. UNREFERENCED_PARAMETER(dwHeadersLength);
  355. UNREFERENCED_PARAMETER(dwFlags);
  356. return NULL;
  357. /*
  358. PP_ASSERT(m_pfnOpenUrl != NULL);
  359. return (*m_pfnOpenUrl)(m_hInternet,
  360. lpwszUrl,
  361. lpwszHeaders,
  362. dwHeadersLength,
  363. dwFlags,
  364. 0);
  365. */
  366. }
  367. // -----------------------------------------------------------------------------
  368. BOOL WINHTTP_SESSION::ReadFile(
  369. HINTERNET hFile,
  370. LPVOID lpBuffer,
  371. DWORD dwNumberOfBytesToRead,
  372. LPDWORD lpdwNumberOfBytesRead)
  373. {
  374. PP_ASSERT(m_pfnReadFile != NULL);
  375. return (*m_pfnReadFile)(
  376. hFile,
  377. lpBuffer,
  378. dwNumberOfBytesToRead,
  379. lpdwNumberOfBytesRead);
  380. }
  381. BOOL WINHTTP_SESSION::CrackUrl(
  382. LPCWSTR lpszUrl,
  383. DWORD dwUrlLength,
  384. DWORD dwFlags,
  385. LPURL_COMPONENTSW lpUrlComponents)
  386. {
  387. PP_ASSERT (m_pfnCrack != NULL);
  388. return (*m_pfnCrack)(lpszUrl,
  389. dwUrlLength,
  390. dwFlags,
  391. lpUrlComponents);
  392. }
  393. PVOID WINHTTP_SESSION::SetStatusCallback(
  394. HINTERNET hInternet,
  395. PVOID lpfnCallback
  396. )
  397. {
  398. return (*m_pfnStatusCallback)(hInternet,
  399. (WINHTTP_STATUS_CALLBACK)lpfnCallback,
  400. WINHTTP_CALLBACK_FLAG_REDIRECT,
  401. 0);
  402. }
  403. BOOL WINHTTP_SESSION::AddHeaders(
  404. HINTERNET hConnect,
  405. LPCWSTR lpszHeaders,
  406. DWORD dwHeadersLength,
  407. DWORD dwModifiers
  408. )
  409. {
  410. PP_ASSERT(m_pfnAddHeaders != NULL);
  411. return (*m_pfnAddHeaders)(hConnect,
  412. lpszHeaders,
  413. dwHeadersLength,
  414. dwModifiers
  415. );
  416. }
  417. BOOL WINHTTP_SESSION::InitHttpApi(PFN_INTERNET_OPEN* ppfnInternetOpen)
  418. {
  419. BOOL fRet = FALSE;
  420. m_pfnCloseHandle =
  421. reinterpret_cast<PFN_CLOSE_HANDLE>(::GetProcAddress(m_hHttpStack, "WinHttpCloseHandle"));
  422. if (m_pfnCloseHandle == NULL)
  423. {
  424. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpCloseHandle not found");
  425. goto exit;
  426. }
  427. *ppfnInternetOpen =
  428. reinterpret_cast<PFN_INTERNET_OPEN>(::GetProcAddress(m_hHttpStack, "WinHttpOpen"));
  429. if (*ppfnInternetOpen == NULL)
  430. {
  431. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpOpen not found");
  432. goto exit;
  433. }
  434. m_pfnConnect =
  435. reinterpret_cast<PFN_INTERNET_CONNECT>(::GetProcAddress(m_hHttpStack, "WinHttpConnect"));
  436. if (m_pfnConnect == NULL)
  437. {
  438. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpConnect not found");
  439. goto exit;
  440. }
  441. m_pfnOpenRequest =
  442. reinterpret_cast<PFN_OPEN_REQUEST>(::GetProcAddress(m_hHttpStack, "WinHttpOpenRequest"));
  443. if (m_pfnOpenRequest == NULL)
  444. {
  445. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpOpenRequest not found");
  446. goto exit;
  447. }
  448. m_pfnSendRequest =
  449. reinterpret_cast<PFN_SEND_REQUEST>(::GetProcAddress(m_hHttpStack, "WinHttpSendRequest"));
  450. if (m_pfnSendRequest == NULL)
  451. {
  452. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpSendRequest not found");
  453. goto exit;
  454. }
  455. m_pfnReceiveResponse = reinterpret_cast<PFN_RECEIVE_RESPONSE>(::GetProcAddress(m_hHttpStack, "WinHttpReceiveResponse"));
  456. if (m_pfnReceiveResponse == NULL)
  457. {
  458. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpReceiveResponse not found");
  459. goto exit;
  460. }
  461. m_pfnQueryInfo =
  462. reinterpret_cast<PFN_QUERY_INFO>(::GetProcAddress(m_hHttpStack, "WinHttpQueryHeaders"));
  463. if (m_pfnQueryInfo == NULL)
  464. {
  465. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpQueryHeaders not found");
  466. goto exit;
  467. }
  468. m_pfnSetOption =
  469. reinterpret_cast<PFN_SET_OPTION>(::GetProcAddress(m_hHttpStack, "WinHttpSetOption"));
  470. if (m_pfnSetOption == NULL)
  471. {
  472. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpSetOption not found");
  473. goto exit;
  474. }
  475. /*
  476. m_pfnOpenUrl =
  477. reinterpret_cast<PFN_OPEN_URL>(::GetProcAddress(m_hHttpStack, "WinHttpOpenUrl"));
  478. if (m_pfnOpenUrl == NULL)
  479. {
  480. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpOpenUrl not found");
  481. goto exit;
  482. }
  483. */
  484. m_pfnQueryOption =
  485. reinterpret_cast<PFN_QUERY_OPTION>(::GetProcAddress(m_hHttpStack, "WinHttpQueryOption"));
  486. if (m_pfnQueryOption == NULL)
  487. {
  488. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpQueryOption not found");
  489. goto exit;
  490. }
  491. m_pfnCrack =
  492. reinterpret_cast<PFN_CRACK_URL>(::GetProcAddress(m_hHttpStack, "WinHttpCrackUrl"));
  493. if (m_pfnCrack == NULL)
  494. {
  495. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpCrackUrl not found");
  496. goto exit;
  497. }
  498. m_pfnReadFile =
  499. reinterpret_cast<PFN_READ_FILE>(::GetProcAddress(m_hHttpStack, "WinHttpReadData"));
  500. if (m_pfnReadFile == NULL)
  501. {
  502. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpReadData not found");
  503. goto exit;
  504. }
  505. m_pfnStatusCallback =
  506. reinterpret_cast<PFN_STATUS_CALLBACK>(::GetProcAddress(m_hHttpStack, "WinHttpSetStatusCallback"));
  507. if (m_pfnStatusCallback == NULL)
  508. {
  509. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpSetStatusCallback not found");
  510. goto exit;
  511. }
  512. m_pfnAddHeaders =
  513. reinterpret_cast<PFN_ADD_HEADERS>(::GetProcAddress(m_hHttpStack, "WinHttpAddRequestHeaders"));
  514. if (m_pfnAddHeaders == NULL)
  515. {
  516. DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpAddRequestHeaders not found");
  517. goto exit;
  518. }
  519. fRet = TRUE;
  520. exit:
  521. return fRet;
  522. }
  523. BOOL WINHTTP_SESSION::Open(
  524. PCWSTR pwszHttpStack,
  525. HINTERNET hInternet
  526. )
  527. {
  528. PP_ASSERT(pwszHttpStack != NULL);
  529. DWORD dwErrorCode;
  530. BOOL fRet = FALSE;
  531. PFN_INTERNET_OPEN pfnInternetOpen = NULL;
  532. PP_ASSERT(m_hHttpStack == 0);
  533. m_hHttpStack = ::LoadLibraryW(pwszHttpStack);
  534. if (m_hHttpStack == NULL)
  535. {
  536. dwErrorCode = ::GetLastError();
  537. DoTraceMessage(PP_LOG_ERROR, "failed to load library %ws; error = %d", pwszHttpStack, dwErrorCode);
  538. goto exit;
  539. }
  540. if (InitHttpApi(&pfnInternetOpen) == FALSE)
  541. {
  542. goto exit;
  543. }
  544. // if (hInternet)
  545. // {
  546. // m_hInternet = hInternet;
  547. // m_fOwnedSession = FALSE;
  548. // }
  549. // else
  550. // {
  551. WINHTTP_PROXY_INFOW ProxyInfo;
  552. ProxyInfo.dwAccessType = 0;
  553. ProxyInfo.lpszProxy = NULL;
  554. ProxyInfo.lpszProxyBypass = NULL;
  555. DWORD dwProxyInfoSize = sizeof(WINHTTP_PROXY_INFOW);
  556. BOOL dwResult;
  557. __try
  558. {
  559. dwResult = QueryOption(hInternet, WINHTTP_OPTION_PROXY, &ProxyInfo, &dwProxyInfoSize);
  560. }
  561. __except(EXCEPTION_EXECUTE_HANDLER)
  562. {
  563. dwResult = FALSE;
  564. }
  565. if (dwResult == FALSE)
  566. {
  567. m_hInternet = (*pfnInternetOpen)(
  568. L"Microsoft-WinHttp-Passport-Authentication-Service/1.4",
  569. WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, // ? name didn't get changed yet
  570. NULL,
  571. NULL,
  572. 0 /*WINHTTP_FLAG_ASYNC*/ // biaow-todo: use async
  573. );
  574. }
  575. else
  576. {
  577. m_hInternet = (*pfnInternetOpen)(
  578. L"Microsoft-WinHttp-Passport-Authentication-Service/1.4",
  579. ProxyInfo.dwAccessType, // ? name didn't get changed yet
  580. ProxyInfo.lpszProxy,
  581. NULL,
  582. 0 /*WINHTTP_FLAG_ASYNC*/ // biaow-todo: use async
  583. );
  584. }
  585. GlobalFree(ProxyInfo.lpszProxy);
  586. GlobalFree(ProxyInfo.lpszProxyBypass);
  587. m_fOwnedSession = TRUE;
  588. // }
  589. if (m_hInternet == NULL)
  590. {
  591. dwErrorCode = ::GetLastError();
  592. DoTraceMessage(PP_LOG_ERROR, "failed to open an HTTP session through %ws; error = %d",
  593. pwszHttpStack, dwErrorCode);
  594. goto exit;
  595. }
  596. if (SESSION::Open(pwszHttpStack, hInternet) == FALSE)
  597. {
  598. goto exit;
  599. }
  600. fRet = TRUE;
  601. DoTraceMessage(PP_LOG_INFO, "WinInet Http Session opened");
  602. exit:
  603. if (!fRet)
  604. {
  605. if (m_hInternet && m_fOwnedSession)
  606. {
  607. (*m_pfnCloseHandle)(m_hInternet);
  608. m_hInternet = NULL;
  609. }
  610. if (m_hHttpStack)
  611. {
  612. ::FreeLibrary(m_hHttpStack);
  613. m_hHttpStack = NULL;
  614. }
  615. DoTraceMessage(PP_LOG_ERROR, "WinInet Http Session failed");
  616. }
  617. return fRet;
  618. }
  619. void WINHTTP_SESSION::Close(void)
  620. {
  621. PP_ASSERT(m_pfnCloseHandle);
  622. if (m_hInternet && m_fOwnedSession)
  623. {
  624. (*m_pfnCloseHandle)(m_hInternet);
  625. m_pfnCloseHandle = NULL;
  626. }
  627. if (m_hHttpStack)
  628. {
  629. ::FreeLibrary(m_hHttpStack);
  630. m_hHttpStack = NULL;
  631. }
  632. SESSION::Close();
  633. DoTraceMessage(PP_LOG_INFO, "WinInet Http Session closed");
  634. }