Coder Social home page Coder Social logo

Comments (10)

julienschmidt avatar julienschmidt commented on April 20, 2024

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.

julienschmidt avatar julienschmidt commented on April 20, 2024

Sorry, I missed your last sentence. Just applying strings.ToLower wouldn't work in that case.

from httprouter.

julienschmidt avatar julienschmidt commented on April 20, 2024

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.

kpowick avatar kpowick commented on April 20, 2024

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.

julienschmidt avatar julienschmidt commented on April 20, 2024

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.

kpowick avatar kpowick commented on April 20, 2024

Ok, thanks!

from httprouter.

jmervine avatar jmervine commented on April 20, 2024

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.

julienschmidt avatar julienschmidt commented on April 20, 2024

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):

  1. Make a case-sensitive lookup. If it was successful, the matching is done.
  2. Check for a TrailingSlashRecommendation, redirecting if the same URL exists with/without a trailing slash
  3. Make a case-insensitive lookup otherwise. If a handler can be found, redirect the respective path
  4. 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.

julienschmidt avatar julienschmidt commented on April 20, 2024

tl;dr: The behavior described by @kpowick in the first post is now default, without any additional configuration.

from httprouter.

jmervine avatar jmervine commented on April 20, 2024

Nice! Excellent solution.

from httprouter.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.