curl.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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> bool curl_get(jvalidate::URI const & uri, JSON & out) {
  16. using jvalidate::adapter::load_file;
  17. using jvalidate::adapter::load_stream;
  18. if (uri.scheme().starts_with("http")) {
  19. std::stringstream ss;
  20. if (CURL * curl = curl_easy_init(); curl) {
  21. curl_easy_setopt(curl, CURLOPT_URL, uri.c_str());
  22. curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
  23. curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ss);
  24. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &transfer_to_buffer);
  25. CURLcode res = curl_easy_perform(curl);
  26. curl_easy_cleanup(curl);
  27. if (res == CURLE_OK) {
  28. return load_stream(ss, out);
  29. }
  30. }
  31. return false;
  32. } else if (uri.scheme() == "file") {
  33. return load_file(uri.resource(), out);
  34. } else {
  35. return false;
  36. }
  37. }
  38. }