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.

123 lines
4.5 KiB

4 months ago
  1. /*
  2. * IXHttpClient.h
  3. * Author: Benjamin Sergeant
  4. * Copyright (c) 2019 Machine Zone, Inc. All rights reserved.
  5. */
  6. #pragma once
  7. #include "IXHttp.h"
  8. #include "IXSocket.h"
  9. #include "IXSocketTLSOptions.h"
  10. #include "IXWebSocketHttpHeaders.h"
  11. #include <algorithm>
  12. #include <atomic>
  13. #include <condition_variable>
  14. #include <functional>
  15. #include <map>
  16. #include <memory>
  17. #include <mutex>
  18. #include <queue>
  19. #include <thread>
  20. namespace ix
  21. {
  22. class HttpClient
  23. {
  24. public:
  25. HttpClient(bool async = false);
  26. ~HttpClient();
  27. HttpResponsePtr get(const std::string& url, HttpRequestArgsPtr args);
  28. HttpResponsePtr head(const std::string& url, HttpRequestArgsPtr args);
  29. HttpResponsePtr Delete(const std::string& url, HttpRequestArgsPtr args);
  30. HttpResponsePtr post(const std::string& url,
  31. const HttpParameters& httpParameters,
  32. const HttpFormDataParameters& httpFormDataParameters,
  33. HttpRequestArgsPtr args);
  34. HttpResponsePtr post(const std::string& url,
  35. const std::string& body,
  36. HttpRequestArgsPtr args);
  37. HttpResponsePtr put(const std::string& url,
  38. const HttpParameters& httpParameters,
  39. const HttpFormDataParameters& httpFormDataParameters,
  40. HttpRequestArgsPtr args);
  41. HttpResponsePtr put(const std::string& url,
  42. const std::string& body,
  43. HttpRequestArgsPtr args);
  44. HttpResponsePtr patch(const std::string& url,
  45. const HttpParameters& httpParameters,
  46. const HttpFormDataParameters& httpFormDataParameters,
  47. HttpRequestArgsPtr args);
  48. HttpResponsePtr patch(const std::string& url,
  49. const std::string& body,
  50. HttpRequestArgsPtr args);
  51. HttpResponsePtr request(const std::string& url,
  52. const std::string& verb,
  53. const std::string& body,
  54. HttpRequestArgsPtr args,
  55. int redirects = 0);
  56. HttpResponsePtr request(const std::string& url,
  57. const std::string& verb,
  58. const HttpParameters& httpParameters,
  59. const HttpFormDataParameters& httpFormDataParameters,
  60. HttpRequestArgsPtr args);
  61. void setForceBody(bool value);
  62. // Async API
  63. HttpRequestArgsPtr createRequest(const std::string& url = std::string(),
  64. const std::string& verb = HttpClient::kGet);
  65. bool performRequest(HttpRequestArgsPtr request,
  66. const OnResponseCallback& onResponseCallback);
  67. // TLS
  68. void setTLSOptions(const SocketTLSOptions& tlsOptions);
  69. std::string serializeHttpParameters(const HttpParameters& httpParameters);
  70. std::string serializeHttpFormDataParameters(
  71. const std::string& multipartBoundary,
  72. const HttpFormDataParameters& httpFormDataParameters,
  73. const HttpParameters& httpParameters = HttpParameters());
  74. std::string generateMultipartBoundary();
  75. std::string urlEncode(const std::string& value);
  76. const static std::string kPost;
  77. const static std::string kGet;
  78. const static std::string kHead;
  79. const static std::string kDelete;
  80. const static std::string kPut;
  81. const static std::string kPatch;
  82. private:
  83. void log(const std::string& msg, HttpRequestArgsPtr args);
  84. // Async API background thread runner
  85. void run();
  86. // Async API
  87. bool _async;
  88. std::queue<std::pair<HttpRequestArgsPtr, OnResponseCallback>> _queue;
  89. mutable std::mutex _queueMutex;
  90. std::condition_variable _condition;
  91. std::atomic<bool> _stop;
  92. std::thread _thread;
  93. std::unique_ptr<Socket> _socket;
  94. std::recursive_mutex _mutex; // to protect accessing the _socket (only one socket per
  95. // client) the mutex needs to be recursive as this function
  96. // might be called recursively to follow HTTP redirections
  97. SocketTLSOptions _tlsOptions;
  98. bool _forceBody;
  99. };
  100. } // namespace ix