brookhttputils.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. (*
  2. Brook for Free Pascal
  3. Copyright (C) 2014-2019 Silvio Clecio
  4. See the file LICENSE.txt, included in this distribution,
  5. for details about the copyright.
  6. This library is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. *)
  10. { HTTP utilities unit. }
  11. unit BrookHttpUtils;
  12. {$i brook.inc}
  13. interface
  14. uses
  15. BrookHttpClient, BrookMessages, BrookHttpConsts, BrookConsts, BrookUtils,
  16. HttpDefs, SysUtils;
  17. type
  18. { Defines a set to represent the AcceptEncoding HTTP header. }
  19. TBrookAcceptEncodingSet = set of (aeDeflate, aeGzip, aeSdch, aeXGzip);
  20. { Converts TDateTime to a GMT format. }
  21. function BrookDateTimeToGMT(const ADateTime: TDateTime): string;
  22. { Compare two URLs ignoring a possible final slash. }
  23. function BrookSameUrl(AUrl1, AUrl2: string): Boolean;
  24. { Returns the reason phrase corresponding to a status code. }
  25. function BrookStatusCodeToReasonPhrase(const AStatusCode: Word): string;
  26. { Returns the status code corresponding to a reason phrase. }
  27. function BrookReasonPhraseToStatusCode(const AReasonPhrase: string): Word;
  28. { Returns a set of HTTP AceptEnconding header. }
  29. function BrookGetAcceptEncodingSet(
  30. const AAcceptEncoding: ShortString): TBrookAcceptEncodingSet;
  31. { Returns a string of HTTP AcceptEnconding. }
  32. function BrookGetAcceptEncoding(
  33. const AAcceptEncoding: TBrookAcceptEncodingSet): string;
  34. { Returns a MIME type by file extension. }
  35. function BrookMimeTypeFromFileExt(const AValue: string): string;
  36. { Returns a MIME type by file name. }
  37. function BrookMimeTypeFromFileName(const AValue: string): string;
  38. { Returns a file extension by MIME type. }
  39. function BrookFileExtFromMimeType(const AValue: string): string;
  40. { Extracts the file name of an URL. }
  41. function BrookExtractUrlFileName(const AUrl: string): string;
  42. { Extracts the file name of an URL and escapes it. }
  43. function BrookExtractUrlFileName(const AUrl: string;
  44. const AEscapeQueryString: Boolean): string;
  45. { Returns the string corresponding to a @code(TBrookRequestMethod). }
  46. function BrookRequestMethodToStr(const AMethod: TBrookRequestMethod): string;
  47. { Returns the @code(TBrookRequestMethod) corresponding to a string. }
  48. function BrookStrToRequestMethod(const AMethod: string): TBrookRequestMethod;
  49. { Perform HTTP requests. (allows all request methods) }
  50. function BrookHttpRequest(const AUrl: string;
  51. const AMethod: TBrookRequestMethod = rmGet;
  52. const AHttpClientLibrary: string = ES): TBrookHTTPResult;
  53. implementation
  54. function BrookDateTimeToGMT(const ADateTime: TDateTime): string;
  55. var
  56. VYear, VMonth, VDay, VHour, VMinute, VSecond, M: Word;
  57. begin
  58. DecodeDate(ADateTime, VYear, VMonth, VDay);
  59. DecodeTime(ADateTime, VHour, VMinute, VSecond, M);
  60. Result := Format(BROOK_GMT_FRMT, [HTTPDays[DayOfWeek(ADateTime)], VDay,
  61. HTTPMonths[VMonth], VYear, VHour, VMinute, VSecond]);
  62. end;
  63. function BrookSameUrl(AUrl1, AUrl2: string): Boolean;
  64. begin
  65. AUrl1 := IncludeHTTPPathDelimiter(AUrl1);
  66. AUrl2 := IncludeHTTPPathDelimiter(AUrl2);
  67. Result := CompareText(AUrl1, AUrl2) = 0;
  68. end;
  69. function BrookStatusCodeToReasonPhrase(const AStatusCode: Word): string;
  70. begin
  71. case AStatusCode of
  72. BROOK_HTTP_STATUS_CODE_CONTINUE:
  73. Result := BROOK_HTTP_REASON_PHRASE_CONTINUE;
  74. BROOK_HTTP_STATUS_CODE_SWITCHING_PROTOCOLS:
  75. Result := BROOK_HTTP_REASON_PHRASE_SWITCHING_PROTOCOLS;
  76. BROOK_HTTP_STATUS_CODE_OK:
  77. Result := BROOK_HTTP_REASON_PHRASE_OK;
  78. BROOK_HTTP_STATUS_CODE_CREATED:
  79. Result := BROOK_HTTP_REASON_PHRASE_CREATED;
  80. BROOK_HTTP_STATUS_CODE_ACCEPTED:
  81. Result := BROOK_HTTP_REASON_PHRASE_CREATED;
  82. BROOK_HTTP_STATUS_CODE_NON_AUTHORITATIVE_INFORMATION:
  83. Result := BROOK_HTTP_REASON_PHRASE_NON_AUTHORITATIVE_INFORMATION;
  84. BROOK_HTTP_STATUS_CODE_NO_CONTENT:
  85. Result := BROOK_HTTP_REASON_PHRASE_NO_CONTENT;
  86. BROOK_HTTP_STATUS_CODE_RESET_CONTENT:
  87. Result := BROOK_HTTP_REASON_PHRASE_RESET_CONTENT;
  88. BROOK_HTTP_STATUS_CODE_PARTIAL_CONTENT:
  89. Result := BROOK_HTTP_REASON_PHRASE_PARTIAL_CONTENT;
  90. BROOK_HTTP_STATUS_CODE_MULTIPLE_CHOICES:
  91. Result := BROOK_HTTP_REASON_PHRASE_MULTIPLE_CHOICES;
  92. BROOK_HTTP_STATUS_CODE_MOVED_PERMANENTLY:
  93. Result := BROOK_HTTP_REASON_PHRASE_MOVED_PERMANENTLY;
  94. BROOK_HTTP_STATUS_CODE_FOUND:
  95. Result := BROOK_HTTP_REASON_PHRASE_FOUND;
  96. BROOK_HTTP_STATUS_CODE_SEE_OTHER:
  97. Result := BROOK_HTTP_REASON_PHRASE_SEE_OTHER;
  98. BROOK_HTTP_STATUS_CODE_NOT_MODIFIED:
  99. Result := BROOK_HTTP_REASON_PHRASE_NOT_MODIFIED;
  100. BROOK_HTTP_STATUS_CODE_USE_PROXY:
  101. Result := BROOK_HTTP_REASON_PHRASE_USE_PROXY;
  102. BROOK_HTTP_STATUS_CODE_TEMPORARY_REDIRECT:
  103. Result := BROOK_HTTP_REASON_PHRASE_TEMPORARY_REDIRECT;
  104. BROOK_HTTP_STATUS_CODE_BAD_REQUEST:
  105. Result := BROOK_HTTP_REASON_PHRASE_BAD_REQUEST;
  106. BROOK_HTTP_STATUS_CODE_UNAUTHORIZED:
  107. Result := BROOK_HTTP_REASON_PHRASE_UNAUTHORIZED;
  108. BROOK_HTTP_STATUS_CODE_PAYMENT_REQUIRED:
  109. Result := BROOK_HTTP_REASON_PHRASE_PAYMENT_REQUIRED;
  110. BROOK_HTTP_STATUS_CODE_FORBIDDEN:
  111. Result := BROOK_HTTP_REASON_PHRASE_FORBIDDEN;
  112. BROOK_HTTP_STATUS_CODE_NOT_FOUND:
  113. Result := BROOK_HTTP_REASON_PHRASE_NOT_FOUND;
  114. BROOK_HTTP_STATUS_CODE_METHOD_NOT_ALLOWED:
  115. Result := BROOK_HTTP_REASON_PHRASE_METHOD_NOT_ALLOWED;
  116. BROOK_HTTP_STATUS_CODE_NOT_ACCEPTABLE:
  117. Result := BROOK_HTTP_REASON_PHRASE_NOT_ACCEPTABLE;
  118. BROOK_HTTP_STATUS_CODE_PROXY_AUTHENTICATION_REQUIRED:
  119. Result := BROOK_HTTP_REASON_PHRASE_PROXY_AUTHENTICATION_REQUIRED;
  120. BROOK_HTTP_STATUS_CODE_REQUEST_TIMEOUT:
  121. Result := BROOK_HTTP_REASON_PHRASE_REQUEST_TIMEOUT;
  122. BROOK_HTTP_STATUS_CODE_CONFLICT:
  123. Result := BROOK_HTTP_REASON_PHRASE_CONFLICT;
  124. BROOK_HTTP_STATUS_CODE_GONE:
  125. Result := BROOK_HTTP_REASON_PHRASE_GONE;
  126. BROOK_HTTP_STATUS_CODE_LENGTH_REQUIRED:
  127. Result := BROOK_HTTP_REASON_PHRASE_LENGTH_REQUIRED;
  128. BROOK_HTTP_STATUS_CODE_PRECONDITION_FAILED:
  129. Result := BROOK_HTTP_REASON_PHRASE_PRECONDITION_FAILED;
  130. BROOK_HTTP_STATUS_CODE_REQUEST_ENTITY_TOO_LARGE:
  131. Result := BROOK_HTTP_REASON_PHRASE_REQUEST_ENTITY_TOO_LARGE;
  132. BROOK_HTTP_STATUS_CODE_REQUEST_URI_TOO_LONG:
  133. Result := BROOK_HTTP_REASON_PHRASE_REQUEST_URI_TOO_LONG;
  134. BROOK_HTTP_STATUS_CODE_UNSUPPORTED_MEDIA_TYPE:
  135. Result := BROOK_HTTP_REASON_PHRASE_UNSUPPORTED_MEDIA_TYPE;
  136. BROOK_HTTP_STATUS_CODE_REQUESTED_RANGE_NOT_SATISFIABLE:
  137. Result := BROOK_HTTP_REASON_PHRASE_REQUESTED_RANGE_NOT_SATISFIABLE;
  138. BROOK_HTTP_STATUS_CODE_EXPECTATION_FAILED:
  139. Result := BROOK_HTTP_REASON_PHRASE_EXPECTATION_FAILED;
  140. BROOK_HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR:
  141. Result := BROOK_HTTP_REASON_PHRASE_INTERNAL_SERVER_ERROR;
  142. BROOK_HTTP_STATUS_CODE_NOT_IMPLEMENTED:
  143. Result := BROOK_HTTP_REASON_PHRASE_NOT_IMPLEMENTED;
  144. BROOK_HTTP_STATUS_CODE_BAD_GATEWAY:
  145. Result := BROOK_HTTP_REASON_PHRASE_BAD_GATEWAY;
  146. BROOK_HTTP_STATUS_CODE_SERVICE_UNAVAILABLE:
  147. Result := BROOK_HTTP_REASON_PHRASE_SERVICE_UNAVAILABLE;
  148. BROOK_HTTP_STATUS_CODE_GATEWAY_TIMEOUT:
  149. Result := BROOK_HTTP_REASON_PHRASE_GATEWAY_TIMEOUT;
  150. BROOK_HTTP_STATUS_CODE_HTTP_VERSION_NOT_SUPPORTED:
  151. Result := BROOK_HTTP_REASON_PHRASE_HTTP_VERSION_NOT_SUPPORTED;
  152. end;
  153. end;
  154. function BrookReasonPhraseToStatusCode(const AReasonPhrase: string): Word;
  155. begin
  156. case AReasonPhrase of
  157. BROOK_HTTP_REASON_PHRASE_CONTINUE:
  158. Result := BROOK_HTTP_STATUS_CODE_CONTINUE;
  159. BROOK_HTTP_REASON_PHRASE_SWITCHING_PROTOCOLS:
  160. Result := BROOK_HTTP_STATUS_CODE_SWITCHING_PROTOCOLS;
  161. BROOK_HTTP_REASON_PHRASE_OK:
  162. Result := BROOK_HTTP_STATUS_CODE_OK;
  163. BROOK_HTTP_REASON_PHRASE_CREATED:
  164. Result := BROOK_HTTP_STATUS_CODE_CREATED;
  165. BROOK_HTTP_REASON_PHRASE_ACCEPTED:
  166. Result := BROOK_HTTP_STATUS_CODE_CREATED;
  167. BROOK_HTTP_REASON_PHRASE_NON_AUTHORITATIVE_INFORMATION:
  168. Result := BROOK_HTTP_STATUS_CODE_NON_AUTHORITATIVE_INFORMATION;
  169. BROOK_HTTP_REASON_PHRASE_NO_CONTENT:
  170. Result := BROOK_HTTP_STATUS_CODE_NO_CONTENT;
  171. BROOK_HTTP_REASON_PHRASE_RESET_CONTENT:
  172. Result := BROOK_HTTP_STATUS_CODE_RESET_CONTENT;
  173. BROOK_HTTP_REASON_PHRASE_PARTIAL_CONTENT:
  174. Result := BROOK_HTTP_STATUS_CODE_PARTIAL_CONTENT;
  175. BROOK_HTTP_REASON_PHRASE_MULTIPLE_CHOICES:
  176. Result := BROOK_HTTP_STATUS_CODE_MULTIPLE_CHOICES;
  177. BROOK_HTTP_REASON_PHRASE_MOVED_PERMANENTLY:
  178. Result := BROOK_HTTP_STATUS_CODE_MOVED_PERMANENTLY;
  179. BROOK_HTTP_REASON_PHRASE_FOUND:
  180. Result := BROOK_HTTP_STATUS_CODE_FOUND;
  181. BROOK_HTTP_REASON_PHRASE_SEE_OTHER:
  182. Result := BROOK_HTTP_STATUS_CODE_SEE_OTHER;
  183. BROOK_HTTP_REASON_PHRASE_NOT_MODIFIED:
  184. Result := BROOK_HTTP_STATUS_CODE_NOT_MODIFIED;
  185. BROOK_HTTP_REASON_PHRASE_USE_PROXY:
  186. Result := BROOK_HTTP_STATUS_CODE_USE_PROXY;
  187. BROOK_HTTP_REASON_PHRASE_TEMPORARY_REDIRECT:
  188. Result := BROOK_HTTP_STATUS_CODE_TEMPORARY_REDIRECT;
  189. BROOK_HTTP_REASON_PHRASE_BAD_REQUEST:
  190. Result := BROOK_HTTP_STATUS_CODE_BAD_REQUEST;
  191. BROOK_HTTP_REASON_PHRASE_UNAUTHORIZED:
  192. Result := BROOK_HTTP_STATUS_CODE_UNAUTHORIZED;
  193. BROOK_HTTP_REASON_PHRASE_PAYMENT_REQUIRED:
  194. Result := BROOK_HTTP_STATUS_CODE_PAYMENT_REQUIRED;
  195. BROOK_HTTP_REASON_PHRASE_FORBIDDEN:
  196. Result := BROOK_HTTP_STATUS_CODE_FORBIDDEN;
  197. BROOK_HTTP_REASON_PHRASE_NOT_FOUND:
  198. Result := BROOK_HTTP_STATUS_CODE_NOT_FOUND;
  199. BROOK_HTTP_REASON_PHRASE_METHOD_NOT_ALLOWED:
  200. Result := BROOK_HTTP_STATUS_CODE_METHOD_NOT_ALLOWED;
  201. BROOK_HTTP_REASON_PHRASE_NOT_ACCEPTABLE:
  202. Result := BROOK_HTTP_STATUS_CODE_NOT_ACCEPTABLE;
  203. BROOK_HTTP_REASON_PHRASE_PROXY_AUTHENTICATION_REQUIRED:
  204. Result := BROOK_HTTP_STATUS_CODE_PROXY_AUTHENTICATION_REQUIRED;
  205. BROOK_HTTP_REASON_PHRASE_REQUEST_TIMEOUT:
  206. Result := BROOK_HTTP_STATUS_CODE_REQUEST_TIMEOUT;
  207. BROOK_HTTP_REASON_PHRASE_CONFLICT:
  208. Result := BROOK_HTTP_STATUS_CODE_CONFLICT;
  209. BROOK_HTTP_REASON_PHRASE_GONE:
  210. Result := BROOK_HTTP_STATUS_CODE_GONE;
  211. BROOK_HTTP_REASON_PHRASE_LENGTH_REQUIRED:
  212. Result := BROOK_HTTP_STATUS_CODE_LENGTH_REQUIRED;
  213. BROOK_HTTP_REASON_PHRASE_PRECONDITION_FAILED:
  214. Result := BROOK_HTTP_STATUS_CODE_PRECONDITION_FAILED;
  215. BROOK_HTTP_REASON_PHRASE_REQUEST_ENTITY_TOO_LARGE:
  216. Result := BROOK_HTTP_STATUS_CODE_REQUEST_ENTITY_TOO_LARGE;
  217. BROOK_HTTP_REASON_PHRASE_REQUEST_URI_TOO_LONG:
  218. Result := BROOK_HTTP_STATUS_CODE_REQUEST_URI_TOO_LONG;
  219. BROOK_HTTP_REASON_PHRASE_UNSUPPORTED_MEDIA_TYPE:
  220. Result := BROOK_HTTP_STATUS_CODE_UNSUPPORTED_MEDIA_TYPE;
  221. BROOK_HTTP_REASON_PHRASE_REQUESTED_RANGE_NOT_SATISFIABLE:
  222. Result := BROOK_HTTP_STATUS_CODE_REQUESTED_RANGE_NOT_SATISFIABLE;
  223. BROOK_HTTP_REASON_PHRASE_EXPECTATION_FAILED:
  224. Result := BROOK_HTTP_STATUS_CODE_EXPECTATION_FAILED;
  225. BROOK_HTTP_REASON_PHRASE_INTERNAL_SERVER_ERROR:
  226. Result := BROOK_HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR;
  227. BROOK_HTTP_REASON_PHRASE_NOT_IMPLEMENTED:
  228. Result := BROOK_HTTP_STATUS_CODE_NOT_IMPLEMENTED;
  229. BROOK_HTTP_REASON_PHRASE_BAD_GATEWAY:
  230. Result := BROOK_HTTP_STATUS_CODE_BAD_GATEWAY;
  231. BROOK_HTTP_REASON_PHRASE_SERVICE_UNAVAILABLE:
  232. Result := BROOK_HTTP_STATUS_CODE_SERVICE_UNAVAILABLE;
  233. BROOK_HTTP_REASON_PHRASE_GATEWAY_TIMEOUT:
  234. Result := BROOK_HTTP_STATUS_CODE_GATEWAY_TIMEOUT;
  235. BROOK_HTTP_REASON_PHRASE_HTTP_VERSION_NOT_SUPPORTED:
  236. Result := BROOK_HTTP_STATUS_CODE_HTTP_VERSION_NOT_SUPPORTED;
  237. end;
  238. end;
  239. function BrookGetAcceptEncodingSet(
  240. const AAcceptEncoding: ShortString): TBrookAcceptEncodingSet;
  241. var
  242. S: ShortString;
  243. begin
  244. Result := [];
  245. S := LowerCase(AAcceptEncoding);
  246. if Pos(BROOK_HTTP_CONTENT_ENCODING_GZIP, S) <> 0 then
  247. Include(Result, aeGzip);
  248. if Pos(BROOK_HTTP_CONTENT_ENCODING_DEFLATE, S) <> 0 then
  249. Include(Result, aeDeflate);
  250. if Pos(BROOK_HTTP_CONTENT_ENCODING_X_GZIP, S) <> 0 then
  251. Include(Result, aeXGzip);
  252. if Pos(BROOK_HTTP_CONTENT_ENCODING_SDCH, S) <> 0 then
  253. Include(Result, aeSdch);
  254. end;
  255. function BrookGetAcceptEncoding(
  256. const AAcceptEncoding: TBrookAcceptEncodingSet): string;
  257. begin
  258. Result := ES;
  259. if aeDeflate in AAcceptEncoding then
  260. Result += 'deflate,';
  261. if aeGzip in AAcceptEncoding then
  262. Result += 'gzip,';
  263. if aeSdch in AAcceptEncoding then
  264. Result += 'sdch,';
  265. if aeXGzip in AAcceptEncoding then
  266. Result += 'xgzip,';
  267. SetLength(Result, Length(Result) - 1);
  268. end;
  269. function BrookMimeTypeFromFileExt(const AValue: string): string;
  270. var
  271. I: Integer;
  272. begin
  273. for I := 0 to BROOK_MAX_MIME_TYPE do
  274. if SameText(BROOK_MIME_TYPE[I, 2], AValue) then
  275. begin
  276. Result := BROOK_MIME_TYPE[I, 1];
  277. Exit;
  278. end;
  279. Result := BROOK_HTTP_CONTENT_TYPE_APP_OCTET_STREAM;
  280. end;
  281. function BrookMimeTypeFromFileName(const AValue: string): string;
  282. begin
  283. Result := BrookMimeTypeFromFileExt(ExtractFileExt(AValue));
  284. end;
  285. function BrookFileExtFromMimeType(const AValue: string): string;
  286. var
  287. I: Integer;
  288. begin
  289. for I := 0 to BROOK_MAX_MIME_TYPE do
  290. if SameText(BROOK_MIME_TYPE[I, 1], AValue) then
  291. begin
  292. Result := BROOK_MIME_TYPE[I, 2];
  293. Exit;
  294. end;
  295. Result := BROOK_HTTP_CONTENT_TYPE_APP_OCTET_STREAM;
  296. end;
  297. function BrookExtractUrlFileName(const AUrl: string): string;
  298. var
  299. I: Integer;
  300. begin
  301. Result := ES;
  302. I := Length(AUrl);
  303. repeat
  304. Result := AUrl[I] + Result;
  305. Dec(I);
  306. until (AUrl[I] = US) or (I = 0);
  307. end;
  308. function BrookExtractUrlFileName(const AUrl: string;
  309. const AEscapeQueryString: Boolean): string;
  310. var
  311. I: Integer = -1;
  312. begin
  313. Result := ES;
  314. if AEscapeQueryString then
  315. I := Pred(Pos(QU, AUrl));
  316. if I < 0 then
  317. I := Length(AUrl);
  318. repeat
  319. Result := AUrl[I] + Result;
  320. Dec(I);
  321. until (AUrl[I] = US) or (I = 0);
  322. end;
  323. function BrookRequestMethodToStr(const AMethod: TBrookRequestMethod): string;
  324. begin
  325. case AMethod of
  326. rmGet: Result := BROOK_HTTP_REQUEST_METHOD_GET;
  327. rmPost: Result := BROOK_HTTP_REQUEST_METHOD_POST;
  328. rmPut: Result := BROOK_HTTP_REQUEST_METHOD_PUT;
  329. rmDelete: Result := BROOK_HTTP_REQUEST_METHOD_DELETE;
  330. rmHead: Result := BROOK_HTTP_REQUEST_METHOD_HEAD;
  331. rmOptions: Result := BROOK_HTTP_REQUEST_METHOD_OPTIONS;
  332. rmTrace: Result := BROOK_HTTP_REQUEST_METHOD_TRACE;
  333. else
  334. Result := 'Unknown';
  335. end;
  336. end;
  337. function BrookStrToRequestMethod(const AMethod: string): TBrookRequestMethod;
  338. begin
  339. case AMethod of
  340. BROOK_HTTP_REQUEST_METHOD_GET: Result := rmGet;
  341. BROOK_HTTP_REQUEST_METHOD_POST: Result := rmPost;
  342. BROOK_HTTP_REQUEST_METHOD_PUT: Result := rmPut;
  343. BROOK_HTTP_REQUEST_METHOD_DELETE: Result := rmDelete;
  344. BROOK_HTTP_REQUEST_METHOD_HEAD: Result := rmHead;
  345. BROOK_HTTP_REQUEST_METHOD_OPTIONS: Result := rmOptions;
  346. BROOK_HTTP_REQUEST_METHOD_TRACE: Result := rmTrace;
  347. else
  348. Result := rmUnknown;
  349. end;
  350. end;
  351. function BrookHttpRequest(const AUrl: string; const AMethod: TBrookRequestMethod;
  352. const AHttpClientLibrary: string): TBrookHTTPResult;
  353. var
  354. VLibrary: string;
  355. VClient: TBrookHttpClient;
  356. VHttp: TBrookHttpDef = nil;
  357. begin
  358. if AHttpClientLibrary <> ES then
  359. VLibrary := AHttpClientLibrary
  360. else
  361. VLibrary := BROOK_HTTP_CLIENT_DEFAULT_LIBRARY;
  362. VClient := TBrookHttpClient.Create(VLibrary);
  363. try
  364. VClient.Prepare(VHttp);
  365. try
  366. case AMethod of
  367. rmPost:
  368. begin
  369. VHttp.Document.WriteByte(13);
  370. VHttp.Document.WriteByte(10);
  371. VHttp.ContentType := 'application/x-www-form-urlencoded';
  372. VHttp.Method := 'POST';
  373. end;
  374. rmPut:
  375. begin
  376. VHttp.Document.WriteByte(13);
  377. VHttp.Document.WriteByte(10);
  378. VHttp.ContentType := 'application/x-www-form-urlencoded';
  379. VHttp.Method := 'PUT';
  380. end;
  381. rmDelete:
  382. begin
  383. VHttp.Document.WriteByte(13);
  384. VHttp.Document.WriteByte(10);
  385. VHttp.ContentType := 'application/x-www-form-urlencoded';
  386. VHttp.Method := 'DELETE';
  387. end;
  388. rmGet:
  389. begin
  390. VHttp.ContentType := 'text/plain';
  391. VHttp.Method := 'GET';
  392. end;
  393. rmHead:
  394. begin
  395. VHttp.ContentType := 'text/plain';
  396. VHttp.Method := 'HEAD';
  397. end;
  398. rmOptions:
  399. begin
  400. VHttp.ContentType := 'text/plain';
  401. VHttp.Method := 'OPTIONS';
  402. end;
  403. rmTrace:
  404. begin
  405. VHttp.ContentType := 'text/plain';
  406. VHttp.Method := 'TRACE';
  407. end;
  408. else
  409. raise EBrookHTTPClient.CreateFmt(SBrookInvalidRequestMethodError,
  410. [BrookRequestMethodToStr(AMethod)]);
  411. end;
  412. VHttp.Url := AUrl;
  413. VHttp.Request;
  414. Result.StatusCode := VHttp.StatusCode;
  415. Result.ReasonPhrase := VHttp.ReasonPhrase;
  416. Result.Header := VHttp.Headers.Text;
  417. Result.Content := VHttp.Contents.Text;
  418. finally
  419. FreeAndNil(VHttp);
  420. end;
  421. finally
  422. VClient.Free;
  423. end;
  424. end;
  425. end.