Comments (10)
Except for the domain name portion URLs are case-sensitive as defined in the RFC.
But this is interesting thought. It would be possible to add a parameter to globally (for all routes) make the routing case insensitive by just applying strings.ToLower
on the requested path.
Any other ideas?
from httprouter.
Sorry, I missed your last sentence. Just applying strings.ToLower
wouldn't work in that case.
from httprouter.
It could work if strings.ToLower
is used on the path substrings, when they are compared to the nodes path, so something like strings.ToLower(path[:len(n.path)]) == n.path
in https://github.com/julienschmidt/httprouter/blob/master/tree.go#L254 and also somehow handle https://github.com/julienschmidt/httprouter/blob/master/tree.go#L343
This should be it.
But this would still rely on a per-router setting, is that acceptable?
from httprouter.
But this would still rely on a per-router setting...
Just to clarify. Such a setting would be per-router, thus affecting all routes defined for a particular router instance? I would have no problem with that.
I understand your point about URL RFC compliance, but that doesn't help with end users that type what they want. :)
Thanks for the consideration.
from httprouter.
Just to clarify. Such a setting would be per-router, thus affecting all routes defined for a particular router instance?
Exactly.
Also using both /path
and /Path
is a really bad practice for usability reasons.
This would definitely be a good addition. Thanks for the request. I'll try to implement it very soon.
from httprouter.
Ok, thanks!
from httprouter.
In addition to this, a global option to force everything to lower, including named params as you mention above would be nice as well. Understanding of course that it will violate RFC compliance if turned on.
Something like:
httprouter.NormalizePathsToLower = true
And then here adding:
if NormalizePathsToLower {
path = strings.ToLower(path)
}
PS: I'd be happy to submit a PR.
from httprouter.
This took longer and was a lot harder to implement than I hoped...
Instead of case-insensitive routes the router now supports the automatic redirection of routes having wrong cases. I think this is better since it doesn't introduce duplicate URLs (\foo
, \Foo
and \FOO
are completely different URLs).
Another reason is, that normalizing unicode-strings to lowercase is quite expensive. Therefore the matching would be a lot more expensive compared to the case-sensitive lookups.
The router does now the following (if not configured otherwise):
- Make a case-sensitive lookup. If it was successful, the matching is done.
- Check for a TrailingSlashRecommendation, redirecting if the same URL exists with/without a trailing slash
- Make a case-insensitive lookup otherwise. If a handler can be found, redirect the respective path
- Handle the 404 otherwise
If you only have lowercase routes, this normalizes all request paths to lowercase as requested by @jmervine. But it uses a 301 permanent redirection instead of silently accepting the wrong URL 😃 (better for SEO etc.).
from httprouter.
tl;dr: The behavior described by @kpowick in the first post is now default, without any additional configuration.
from httprouter.
Nice! Excellent solution.
from httprouter.
Related Issues (20)
- How to use this custom middleware HOT 1
- Matching multiple named parameters HOT 1
- ServeFiles not able to serve static files HOT 2
- How can I receive multiple parameters in GET request? HOT 3
- Is it possible to bind one router to some path in another router? HOT 2
- is it possible to get the registered path? HOT 7
- panic: '/hello/:name' in new path '/hello/:name' conflicts with existing wildcar
- Why make catchAll form so special HOT 2
- httprouter.ParamsWithContext(r.Context()) is returning []
- Question: will re-registering a handler work properly?
- Fails with "embed" package HOT 1
- Dump all registered routes HOT 3
- Improve longestCommonPrefix and add unit tests HOT 1
- Question: How can I embed swagger UI? HOT 2
- Feature Request: Support multi-wildcard names for same tree branch HOT 1
- panic: path must begin with '/' in path 'GET'
- List all registered endpoint httprouter
- what is the empty path node used for? HOT 1
- Unable to load jsx files because "file.jsx was blocked because of a disallowed MIME type text/plain" HOT 2
- Plan to Consolidate with net/http @ 1.22?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from httprouter.