31 std::string full_prefix =
"/" + prefix +
"/";
32 grklog.debug(
"Processing VSI path with prefix '%s': %s", prefix.c_str(), url.c_str());
33 if(!url.starts_with(full_prefix))
35 grklog.error(
"Invalid VSI path, does not start with %s: %s", full_prefix.c_str(),
37 throw std::runtime_error(
"Invalid VSI path: does not start with " + full_prefix);
39 url = url.substr(full_prefix.length());
40 grklog.debug(
"Stripped %s prefix, remaining: %s", full_prefix.c_str(), url.c_str());
48 grklog.debug(
"Processing HTTPS path: %s", url.c_str());
49 if(!url.starts_with(
"https://"))
51 grklog.error(
"Invalid HTTPS URL, does not start with https://: %s", url.c_str());
52 throw std::runtime_error(
"Invalid HTTPS URL: does not start with https://");
55 grklog.debug(
"Stripped https:// prefix, remaining: %s", url.c_str());
61 std::string path = url.substr(url.find(
'/') + 1);
62 grklog.debug(
"Extracted path: %s", path.c_str());
70 size_t host_end = url.find(
':');
72 if(host_end == std::string::npos)
74 host_end = url.find(
'/');
75 if(host_end == std::string::npos)
77 grklog.error(
"Invalid HTTPS URL: no bucket/key separator in: %s", url.c_str());
78 throw std::runtime_error(
"Invalid HTTPS URL: no bucket/key separator");
80 parsed.
host = url.substr(0, host_end);
81 parsed.
port = default_port;
82 grklog.debug(
"No port specified, using host=%s, port=%d", parsed.
host.c_str(), parsed.
port);
86 parsed.
host = url.substr(0, host_end);
87 port_str = url.substr(host_end + 1, url.find(
'/') - host_end - 1);
88 grklog.debug(
"Port specified: host=%s, port_str=%s", parsed.
host.c_str(), port_str.c_str());
91 parsed.
port = port_str.empty() ? default_port : std::stoi(port_str);
94 catch(
const std::exception& e)
96 grklog.error(
"Invalid port in HTTPS URL: %s, using default %d", port_str.c_str(),
98 parsed.
port = default_port;
105 const char* log_context)
107 size_t bucket_end = path.find(
'/');
108 if(bucket_end == std::string::npos)
110 grklog.error(
"Invalid %s URL: no key after bucket in path: %s", log_context, path.c_str());
111 throw std::runtime_error(std::string(
"Invalid ") + log_context +
" URL: no key after bucket");
113 parsed.
bucket = path.substr(0, bucket_end);
114 parsed.
key = path.substr(bucket_end + 1);
115 grklog.debug(
"%s parsed: bucket=%s, key=%s", log_context, parsed.
bucket.c_str(),
Definition FetchPathParser.h:27
static void parseHostPort(const std::string &url, ParsedFetchPath &parsed, int default_port)
Definition FetchPathParser.h:68
static void parseBucketKey(const std::string &path, ParsedFetchPath &parsed, const char *log_context)
Definition FetchPathParser.h:104
static void parseVsiPath(std::string &url, ParsedFetchPath &parsed, const std::string &prefix)
Definition FetchPathParser.h:29
static void parseHttpsPath(std::string &url, ParsedFetchPath &parsed, int default_port=443)
Definition FetchPathParser.h:46
ResWindow.
Definition CompressedChunkCache.h:36
ILogger & grklog
Definition Logger.cpp:24
Definition FetchCommon.h:34
int port
Definition FetchCommon.h:38
std::string bucket
Definition FetchCommon.h:36
std::string key
Definition FetchCommon.h:37
std::string host
Definition FetchCommon.h:35