curl.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #pragma once
  2. #include <sstream>
  3. #include <string_view>
  4. #include <curl/curl.h>
  5. #include <jvalidate/adapter.h>
  6. #include <jvalidate/forward.h>
  7. #include <jvalidate/uri.h>
  8. namespace jvalidate {
  9. inline size_t transfer_to_buffer(char * data, size_t size, size_t nmemb, void * userdata) {
  10. std::stringstream & ss = *reinterpret_cast<std::stringstream *>(userdata);
  11. size_t actual_size = size * nmemb;
  12. ss << std::string_view(data, actual_size);
  13. return actual_size;
  14. }
  15. template <typename JSON>
  16. bool curl_get(jvalidate::URI const & uri, JSON & out, std::string & error) noexcept {
  17. using jvalidate::adapter::load_file;
  18. using jvalidate::adapter::load_stream;
  19. if (uri.scheme().starts_with("http")) {
  20. std::stringstream ss;
  21. if (CURL * curl = curl_easy_init(); curl) {
  22. curl_easy_setopt(curl, CURLOPT_URL, uri.c_str());
  23. curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
  24. curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ss);
  25. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &transfer_to_buffer);
  26. CURLcode res = curl_easy_perform(curl);
  27. curl_easy_cleanup(curl);
  28. if (res == CURLE_OK) {
  29. return load_stream(ss, out, error);
  30. }
  31. }
  32. return false;
  33. } else if (uri.scheme() == "file") {
  34. return load_file(uri.resource(), out, error);
  35. } else {
  36. error = "unknown scheme";
  37. return false;
  38. }
  39. }
  40. }