brookhttputils.pas 17 KB

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