Test_HTTPRequest.dpr 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. (* _ _
  2. * | |__ _ __ ___ ___ | | __
  3. * | '_ \| '__/ _ \ / _ \| |/ /
  4. * | |_) | | | (_) | (_) | <
  5. * |_.__/|_| \___/ \___/|_|\_\
  6. *
  7. * Microframework which helps to develop web Pascal applications.
  8. *
  9. * Copyright (c) 2012-2025 Silvio Clecio <[email protected]>
  10. *
  11. * Brook framework is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU Lesser General Public
  13. * License as published by the Free Software Foundation; either
  14. * version 2.1 of the License, or (at your option) any later version.
  15. *
  16. * Brook framework is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. * Lesser General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Lesser General Public
  22. * License along with Brook framework; if not, write to the Free Software
  23. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  24. *)
  25. program Test_HTTPRequest;
  26. {$I Tests.inc}
  27. uses
  28. RTLConsts,
  29. SysUtils,
  30. StrUtils,
  31. Marshalling,
  32. libsagui,
  33. BrookLibraryLoader,
  34. BrookUtility,
  35. BrookString,
  36. BrookStringMap,
  37. BrookHTTPRequest,
  38. Test;
  39. type
  40. TFakeRequest = class
  41. end;
  42. var
  43. FakeRequest: TFakeRequest;
  44. FakeRequestHandle: Pointer;
  45. FakeHandle: Pointer;
  46. FakeUserData: Pointer;
  47. function fake_ip(const socket: Pcvoid; buf: Pcchar; size: csize_t): cint; cdecl;
  48. begin
  49. Move(socket^, buf^, size);
  50. Result := 0;
  51. end;
  52. function fake_httpreq_headers(req: Psg_httpreq): PPsg_strmap; cdecl;
  53. begin
  54. Assert(req = FakeRequestHandle);
  55. FakeHandle := nil;
  56. Result := @FakeHandle;
  57. end;
  58. function fake_httpreq_version(req: Psg_httpreq): Pcchar; cdecl;
  59. var
  60. M: TMarshaller;
  61. begin
  62. Assert(req = FakeRequestHandle);
  63. Result := M.ToCString('fake_version');
  64. end;
  65. function fake_httpreq_method(req: Psg_httpreq): Pcchar; cdecl;
  66. var
  67. M: TMarshaller;
  68. begin
  69. Assert(req = FakeRequestHandle);
  70. Result := M.ToCString('fake_method');
  71. end;
  72. function fake_httpreq_path(req: Psg_httpreq): Pcchar; cdecl;
  73. var
  74. M: TMarshaller;
  75. begin
  76. Assert(req = FakeRequestHandle);
  77. Result := M.ToCString('fake_path');
  78. end;
  79. function fake_httpreq_is_uploading(req: Psg_httpreq): cbool; cdecl;
  80. begin
  81. Assert(req = FakeRequestHandle);
  82. Result := True;
  83. end;
  84. function fakeg_httpreq_tls_session(req: Psg_httpreq): Pcvoid; cdecl;
  85. begin
  86. Assert(req = FakeRequestHandle);
  87. Result := Pointer(1);
  88. end;
  89. function fake_httpreq_client(req: Psg_httpreq): Pcvoid; cdecl;
  90. var
  91. M: TMarshaller;
  92. begin
  93. Assert(req = FakeRequestHandle);
  94. Result := M.ToCString('123.123.123.123');
  95. end;
  96. procedure AssignFakeAPI; {$IFNDEF DEBUG}inline;{$ENDIF}
  97. begin
  98. sg_ip := fake_ip;
  99. sg_httpreq_version := fake_httpreq_version;
  100. sg_httpreq_method := fake_httpreq_method;
  101. sg_httpreq_path := fake_httpreq_path;
  102. sg_httpreq_is_uploading := fake_httpreq_is_uploading;
  103. sg_httpreq_tls_session := fakeg_httpreq_tls_session;
  104. sg_httpreq_client := fake_httpreq_client;
  105. end;
  106. procedure AssignFakeHeadersAPI; {$IFNDEF DEBUG}inline;{$ENDIF}
  107. begin
  108. sg_httpreq_headers := fake_httpreq_headers;
  109. sg_httpreq_cookies := fake_httpreq_headers;
  110. sg_httpreq_params := fake_httpreq_headers;
  111. end;
  112. procedure Test_HTTPRequestCreate;
  113. var
  114. R: TBrookHTTPRequest;
  115. begin
  116. AssignFakeAPI;
  117. AssignFakeHeadersAPI;
  118. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  119. try
  120. Assert(R.Handle = FakeRequestHandle);
  121. Assert(Assigned(R.Uploads));
  122. Assert(Assigned(R.Headers));
  123. Assert(Assigned(R.Cookies));
  124. Assert(Assigned(R.Params));
  125. Assert(Assigned(R.Fields));
  126. Assert(Assigned(R.Payload));
  127. finally
  128. R.Free;
  129. end;
  130. AssignFakeAPI;
  131. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  132. try
  133. Assert(R.Version = 'fake_version');
  134. Assert(R.Method = 'fake_method');
  135. Assert(R.Path = 'fake_path');
  136. Assert(R.IsUploading);
  137. Assert(Assigned(R.TLSSession));
  138. finally
  139. R.Free;
  140. end;
  141. TBrookLibraryLoader.Unload;
  142. TBrookLibraryLoader.Load;
  143. end;
  144. function fake_httpreq_method_get(req: Psg_httpreq): Pcchar; cdecl;
  145. var
  146. M: TMarshaller;
  147. begin
  148. Assert(req = FakeRequestHandle);
  149. Result := M.ToCString('GET');
  150. end;
  151. function fake_httpreq_method_post(req: Psg_httpreq): Pcchar; cdecl;
  152. var
  153. M: TMarshaller;
  154. begin
  155. Assert(req = FakeRequestHandle);
  156. Result := M.ToCString('POST');
  157. end;
  158. procedure Test_HTTPRequestIsPost;
  159. var
  160. R: TBrookHTTPRequest;
  161. begin
  162. AssignFakeAPI;
  163. AssignFakeHeadersAPI;
  164. sg_httpreq_method := fake_httpreq_method_get;
  165. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  166. try
  167. Assert(not R.IsPost);
  168. finally
  169. R.Free;
  170. end;
  171. sg_httpreq_method := fake_httpreq_method_post;
  172. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  173. try
  174. Assert(R.IsPost);
  175. finally
  176. R.Free;
  177. end;
  178. end;
  179. function fake_httpreq_path_nofavicon(req: Psg_httpreq): Pcchar; cdecl;
  180. var
  181. M: TMarshaller;
  182. begin
  183. Assert(req = FakeRequestHandle);
  184. Result := M.ToCString('/foo');
  185. end;
  186. function fake_httpreq_path_favicon(req: Psg_httpreq): Pcchar; cdecl;
  187. var
  188. M: TMarshaller;
  189. begin
  190. Assert(req = FakeRequestHandle);
  191. Result := M.ToCString('/favicon.ico');
  192. end;
  193. procedure Test_HTTPRequestIsFavicon;
  194. var
  195. R: TBrookHTTPRequest;
  196. begin
  197. AssignFakeHeadersAPI;
  198. sg_httpreq_path := fake_httpreq_path_nofavicon;
  199. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  200. try
  201. Assert(not R.IsFavicon);
  202. finally
  203. R.Free;
  204. end;
  205. sg_httpreq_path := fake_httpreq_path_favicon;
  206. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  207. try
  208. Assert(R.IsFavicon);
  209. finally
  210. R.Free;
  211. end;
  212. end;
  213. function fake_httpreq_tls_session_nil(req: Psg_httpreq): Pcvoid; cdecl;
  214. begin
  215. Assert(req = FakeRequestHandle);
  216. Result := nil;
  217. end;
  218. function fake_httpreq_tls_session_ok(req: Psg_httpreq): Pcvoid; cdecl;
  219. begin
  220. Assert(req = FakeRequestHandle);
  221. Result := Pointer(1);
  222. end;
  223. procedure Test_HTTPRequestIsSecure;
  224. var
  225. R: TBrookHTTPRequest;
  226. begin
  227. AssignFakeHeadersAPI;
  228. sg_httpreq_tls_session := fake_httpreq_tls_session_nil;
  229. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  230. try
  231. Assert(not R.IsSecure);
  232. finally
  233. R.Free;
  234. end;
  235. sg_httpreq_tls_session := fake_httpreq_tls_session_ok;
  236. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  237. try
  238. Assert(R.IsSecure);
  239. finally
  240. R.Free;
  241. end;
  242. end;
  243. function fake_httpreq_method_head(req: Psg_httpreq): Pcchar; cdecl;
  244. var
  245. M: TMarshaller;
  246. begin
  247. Assert(req = FakeRequestHandle);
  248. Result := M.ToCString('HEAD');
  249. end;
  250. procedure Test_HTTPRequestIsCachable;
  251. var
  252. R: TBrookHTTPRequest;
  253. begin
  254. AssignFakeHeadersAPI;
  255. sg_httpreq_method := fake_httpreq_method_head;
  256. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  257. try
  258. Assert(R.IsCachable);
  259. finally
  260. R.Free;
  261. end;
  262. sg_httpreq_method := fake_httpreq_method_get;
  263. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  264. try
  265. Assert(R.IsCachable);
  266. finally
  267. R.Free;
  268. end;
  269. end;
  270. procedure Test_HTTPRequestIsXhr;
  271. var
  272. R: TBrookHTTPRequest;
  273. begin
  274. AssignFakeHeadersAPI;
  275. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  276. try
  277. R.Headers.Clear;
  278. Assert(not R.IsXhr);
  279. finally
  280. R.Free;
  281. end;
  282. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  283. try
  284. R.Headers.Add('X-Requested-With', 'xmlhttprequest');
  285. Assert(R.IsXhr);
  286. finally
  287. R.Free;
  288. end;
  289. end;
  290. procedure Test_HTTPRequestHeaders;
  291. var
  292. R: TBrookHTTPRequest;
  293. begin
  294. AssignFakeHeadersAPI;
  295. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  296. try
  297. Assert(Assigned(R.Headers));
  298. R.Headers.Add('foo', 'bar');
  299. Assert(R.Headers['foo'] = 'bar');
  300. finally
  301. R.Free;
  302. end;
  303. end;
  304. procedure Test_HTTPRequestCookies;
  305. var
  306. R: TBrookHTTPRequest;
  307. begin
  308. AssignFakeHeadersAPI;
  309. sg_httpreq_cookies := fake_httpreq_headers;
  310. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  311. try
  312. Assert(Assigned(R.Cookies));
  313. R.Cookies.Add('foo', 'bar');
  314. Assert(R.Cookies['foo'] = 'bar');
  315. finally
  316. R.Free;
  317. end;
  318. end;
  319. procedure Test_HTTPRequestParams;
  320. var
  321. R: TBrookHTTPRequest;
  322. begin
  323. AssignFakeHeadersAPI;
  324. sg_httpreq_params := fake_httpreq_headers;
  325. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  326. try
  327. Assert(Assigned(R.Params));
  328. R.Params.Add('foo', 'bar');
  329. Assert(R.Params['foo'] = 'bar');
  330. finally
  331. R.Free;
  332. end;
  333. end;
  334. procedure Test_HTTPRequestFields;
  335. var
  336. R: TBrookHTTPRequest;
  337. begin
  338. AssignFakeHeadersAPI;
  339. sg_httpreq_fields := fake_httpreq_headers;
  340. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  341. try
  342. Assert(Assigned(R.Fields));
  343. R.Fields.Add('foo', 'bar');
  344. Assert(R.Fields['foo'] = 'bar');
  345. finally
  346. R.Free;
  347. end;
  348. end;
  349. function fake_httpreq_payload(req: Psg_httpreq): Psg_str; cdecl;
  350. begin
  351. Assert(req = FakeRequestHandle);
  352. FakeHandle := nil;
  353. Result := FakeHandle;
  354. end;
  355. procedure Test_HTTPRequestPayload;
  356. var
  357. R: TBrookHTTPRequest;
  358. begin
  359. AssignFakeHeadersAPI;
  360. sg_httpreq_payload := fake_httpreq_payload;
  361. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  362. try
  363. Assert(Assigned(R.Payload));
  364. R.Payload.Write('foo');
  365. Assert(R.Payload.Text = 'foo');
  366. finally
  367. R.Free;
  368. end;
  369. end;
  370. procedure Test_HTTPRequestVersion;
  371. var
  372. R: TBrookHTTPRequest;
  373. begin
  374. AssignFakeAPI;
  375. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  376. try
  377. Assert(R.Version = 'fake_version');
  378. finally
  379. R.Free;
  380. end;
  381. end;
  382. procedure Test_HTTPRequestMethod;
  383. var
  384. R: TBrookHTTPRequest;
  385. begin
  386. AssignFakeHeadersAPI;
  387. AssignFakeAPI;
  388. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  389. try
  390. Assert(R.Method = 'fake_method');
  391. finally
  392. R.Free;
  393. end;
  394. end;
  395. procedure Test_HTTPRequestPath;
  396. var
  397. R: TBrookHTTPRequest;
  398. begin
  399. AssignFakeHeadersAPI;
  400. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  401. try
  402. Assert(R.Path = 'fake_path');
  403. finally
  404. R.Free;
  405. end;
  406. end;
  407. function fake_httpreq_client_nil(req: Psg_httpreq): Pcvoid; cdecl;
  408. begin
  409. Assert(req = FakeRequestHandle);
  410. Result := nil;
  411. end;
  412. procedure DoHTTPRequestIPLibNotLoaded(const AArgs: array of const);
  413. begin
  414. Assert(TBrookHTTPRequest(AArgs[0].VObject).IP = '123.123.123.123');
  415. end;
  416. procedure Test_HTTPRequestIP;
  417. var
  418. R: TBrookHTTPRequest;
  419. begin
  420. AssignFakeHeadersAPI;
  421. sg_httpreq_client := fake_httpreq_client_nil;
  422. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  423. try
  424. Assert(R.IP.IsEmpty);
  425. finally
  426. R.Free;
  427. end;
  428. AssignFakeAPI;
  429. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  430. try
  431. Assert(R.IP = '123.123.123.123');
  432. finally
  433. R.Free;
  434. end;
  435. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  436. try
  437. TBrookLibraryLoader.Unload;
  438. AssertExcept(DoHTTPRequestIPLibNotLoaded, ESgLibNotLoaded,
  439. Format(SSgLibNotLoaded, [IfThen(SgLib.GetLastName = '',
  440. SG_LIB_NAME, SgLib.GetLastName)]), [R]);
  441. TBrookLibraryLoader.Load;
  442. finally
  443. R.Free;
  444. end;
  445. end;
  446. procedure Test_HTTPRequestContentType;
  447. var
  448. R: TBrookHTTPRequest;
  449. begin
  450. AssignFakeAPI;
  451. AssignFakeHeadersAPI;
  452. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  453. try
  454. Assert(R.ContentType.IsEmpty);
  455. R.Headers.Add('Content-Type', 'html/text');
  456. Assert(R.ContentType = 'html/text');
  457. finally
  458. R.Free;
  459. end;
  460. end;
  461. procedure Test_HTTPRequestUserAgent;
  462. var
  463. R: TBrookHTTPRequest;
  464. begin
  465. AssignFakeHeadersAPI;
  466. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  467. try
  468. Assert(R.UserAgent.IsEmpty);
  469. R.Headers.Add('User-Agent', 'Brook');
  470. Assert(R.UserAgent = 'Brook');
  471. finally
  472. R.Free;
  473. end;
  474. end;
  475. procedure Test_HTTPRequestReferer;
  476. var
  477. R: TBrookHTTPRequest;
  478. begin
  479. AssignFakeHeadersAPI;
  480. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  481. try
  482. Assert(R.Referer.IsEmpty);
  483. R.Headers.Add('Referer', '/foo');
  484. Assert(R.Referer = '/foo');
  485. R.Headers.Clear;
  486. R.Headers.Add('Referrer', '/bar');
  487. Assert(R.Referer = '/bar');
  488. finally
  489. R.Free;
  490. end;
  491. end;
  492. function fake_httpreq_paths(req: Psg_httpreq): Pcchar; cdecl;
  493. begin
  494. Assert(req = FakeRequestHandle);
  495. Result := '/foo/bar';
  496. end;
  497. procedure Test_HTTPRequestPaths;
  498. var
  499. R: TBrookHTTPRequest;
  500. begin
  501. TBrookLibraryLoader.Unload;
  502. TBrookLibraryLoader.Load;
  503. AssignFakeAPI;
  504. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  505. try
  506. Assert(Length(R.Paths) = 1);
  507. finally
  508. R.Free;
  509. end;
  510. sg_httpreq_path := fake_httpreq_paths;
  511. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  512. try
  513. Assert(Length(R.Paths) = 2);
  514. finally
  515. R.Free;
  516. end;
  517. end;
  518. procedure Test_HTTPRequestIsUploading;
  519. var
  520. R: TBrookHTTPRequest;
  521. begin
  522. TBrookLibraryLoader.Unload;
  523. TBrookLibraryLoader.Load;
  524. AssignFakeAPI;
  525. AssignFakeHeadersAPI;
  526. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  527. try
  528. Assert(R.IsUploading);
  529. finally
  530. R.Free;
  531. end;
  532. end;
  533. function fake_httpreq_uploads(req: Psg_httpreq): Psg_httpupld; cdecl;
  534. begin
  535. Assert(req = FakeRequestHandle);
  536. Result := FakeHandle;
  537. end;
  538. procedure Test_HTTPRequestUploads;
  539. var
  540. R: TBrookHTTPRequest;
  541. begin
  542. TBrookLibraryLoader.Unload;
  543. TBrookLibraryLoader.Load;
  544. AssignFakeAPI;
  545. sg_httpreq_uploads := fake_httpreq_uploads;
  546. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  547. try
  548. Assert(R.Uploads.Handle = FakeHandle);
  549. finally
  550. R.Free;
  551. end;
  552. end;
  553. function fake_httpreq_tls_session(req: Psg_httpreq): Pcvoid; cdecl;
  554. begin
  555. Assert(req = FakeRequestHandle);
  556. Result := FakeHandle;
  557. end;
  558. procedure Test_HTTPRequestTLSSession;
  559. var
  560. R: TBrookHTTPRequest;
  561. begin
  562. TBrookLibraryLoader.Unload;
  563. TBrookLibraryLoader.Load;
  564. AssignFakeAPI;
  565. sg_httpreq_tls_session := fake_httpreq_tls_session;
  566. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  567. try
  568. Assert(R.TLSSession = FakeHandle);
  569. finally
  570. R.Free;
  571. end;
  572. end;
  573. function fake_httpreq_set_user_data(req: Psg_httpreq; data: Pcvoid): cint;
  574. cdecl;
  575. begin
  576. Assert(req = FakeRequestHandle);
  577. FakeUserData := data;
  578. Result := 0;
  579. end;
  580. function fake_httpreq_user_data(req: Psg_httpreq): Pcvoid; cdecl;
  581. begin
  582. Assert(req = FakeRequestHandle);
  583. Result := FakeUserData;
  584. end;
  585. procedure Test_HTTPRequestUserData;
  586. var
  587. R: TBrookHTTPRequest;
  588. X: Integer;
  589. begin
  590. TBrookLibraryLoader.Unload;
  591. TBrookLibraryLoader.Load;
  592. AssignFakeAPI;
  593. sg_httpreq_set_user_data := fake_httpreq_set_user_data;
  594. sg_httpreq_user_data := fake_httpreq_user_data;
  595. R := TBrookHTTPRequest.Create(FakeRequestHandle);
  596. try
  597. R.UserData := nil;
  598. Assert(not Assigned(R.UserData));
  599. X := 123;
  600. R.UserData := @X;
  601. Assert(PInteger(R.UserData)^ = 123);
  602. finally
  603. R.Free;
  604. end;
  605. end;
  606. begin
  607. {$IF (NOT DEFINED(FPC)) AND DEFINED(DEBUG)}
  608. ReportMemoryLeaksOnShutdown := True;
  609. {$ENDIF}
  610. TBrookLibraryLoader.Load;
  611. FakeRequest := TFakeRequest.Create;
  612. try
  613. FakeRequestHandle := FakeRequest;
  614. Test_HTTPRequestCreate;
  615. // Test_HTTPRequestDestroy - not required
  616. Test_HTTPRequestIsPost;
  617. Test_HTTPRequestIsFavicon;
  618. Test_HTTPRequestIsSecure;
  619. Test_HTTPRequestIsCachable;
  620. Test_HTTPRequestIsXhr;
  621. Test_HTTPRequestHeaders;
  622. Test_HTTPRequestCookies;
  623. Test_HTTPRequestParams;
  624. Test_HTTPRequestFields;
  625. Test_HTTPRequestPayload;
  626. Test_HTTPRequestVersion;
  627. Test_HTTPRequestMethod;
  628. Test_HTTPRequestPath;
  629. Test_HTTPRequestIP;
  630. Test_HTTPRequestContentType;
  631. Test_HTTPRequestUserAgent;
  632. Test_HTTPRequestReferer;
  633. Test_HTTPRequestPaths;
  634. Test_HTTPRequestIsUploading;
  635. Test_HTTPRequestUploads;
  636. Test_HTTPRequestTLSSession;
  637. Test_HTTPRequestUserData;
  638. finally
  639. TBrookLibraryLoader.Unload;
  640. FakeRequest.Free;
  641. end;
  642. end.