fix: correctly match uri to location
This commit is contained in:
parent
0ae18e534f
commit
b0ce1fb3c8
@ -27,31 +27,50 @@ URI::URI(const HttpRequest &request, const ServerConfig &serverConfig)
|
|||||||
const AConfig *URI::matchConfig(const std::string &uri, const ServerConfig &serverConfig)
|
const AConfig *URI::matchConfig(const std::string &uri, const ServerConfig &serverConfig)
|
||||||
{
|
{
|
||||||
const auto &locations = serverConfig.getLocationPaths();
|
const auto &locations = serverConfig.getLocationPaths();
|
||||||
const AConfig *bestMatch = &serverConfig;
|
const AConfig *matchedConfig = &serverConfig;
|
||||||
|
|
||||||
size_t maxMatchLength = 0;
|
size_t maxMatchLength = 0;
|
||||||
for (const auto &locationPath : locations)
|
for (const auto &location : locations)
|
||||||
{
|
{
|
||||||
if (uri.empty() && locationPath == "/")
|
if (location == "/")
|
||||||
{
|
{
|
||||||
return serverConfig.getLocation(locationPath);
|
if (uri.empty())
|
||||||
|
{
|
||||||
|
return serverConfig.getLocation(location);
|
||||||
|
}
|
||||||
|
// Root location matches everything, but with lowest priority
|
||||||
|
if (maxMatchLength == 0)
|
||||||
|
{
|
||||||
|
matchedConfig = serverConfig.getLocation(location);
|
||||||
|
maxMatchLength = 1;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (!uri.starts_with(utils::trim(locationPath, "/")))
|
|
||||||
|
// Trim leading/trailing slashes for consistent matching
|
||||||
|
std::string trimmedLocation = utils::trim(location, "/");
|
||||||
|
|
||||||
|
// Check if URI starts with the location path
|
||||||
|
if (!uri.starts_with(trimmedLocation))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (uri.substr(utils::trim(locationPath, "/").length())[0] != '/'
|
|
||||||
|| !uri.substr(utils::trim(locationPath, "/").length()).empty())
|
// Ensure we have an exact path boundary match
|
||||||
|
// Either the URI is exactly the location, or the next character is '/'
|
||||||
|
if (uri.length() > trimmedLocation.length() && uri[trimmedLocation.length()] != '/')
|
||||||
{
|
{
|
||||||
continue;
|
continue; // Not a path boundary match
|
||||||
}
|
}
|
||||||
if (locationPath.length() > maxMatchLength)
|
|
||||||
|
// This is a valid match - check if it's the longest so far
|
||||||
|
if (trimmedLocation.length() > maxMatchLength)
|
||||||
{
|
{
|
||||||
maxMatchLength = locationPath.length();
|
maxMatchLength = trimmedLocation.length();
|
||||||
bestMatch = serverConfig.getLocation(locationPath);
|
matchedConfig = serverConfig.getLocation(location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bestMatch;
|
return matchedConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
void URI::parseUri()
|
void URI::parseUri()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user