-
-
Notifications
You must be signed in to change notification settings - Fork 926
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Streamline route/request path handling and split params + body in requests #2361
Streamline route/request path handling and split params + body in requests #2361
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Added one additional test for conflicting #
/?
keys. Don't know what the expected behaviour would be in this case. Maybe we should add a similar test to the parser. Just so it behaves the same, when someone refactors those some time.
Besides that, nice work!
Updated the title to clarify this isn't ready yet. Please don't merge this yet. I'll request new reviews once I'm ready. I also requested reviews from both of you since it's a pretty significant overhaul, and it's really a part 2 of simplifying the v2 internals outside My other planned changes, all non-breaking and slated for future PRs, are:
Everything else I'd like to do that's breaking I'm punting to v3. |
75bd78e
to
84464cc
Compare
What's the motivation for this? Interpolating query parameters is surely still a common enough requirement... |
@barneycarroll Let me clarify: |
Gotcha 👍 |
|
84464cc
to
ef78a8f
Compare
ef78a8f
to
c895bb2
Compare
Okay, this is ready for review and should be close to merge quality. I know it's a relatively large PR, but most of the diff is just adding tests and docs where there was nothing previously.
In case you're curious, the path names were briefly documented in I know the jump of 400 bytes is a little unsettling, but I feel I could probably regain most, if not all, of that by simply combining |
899041a
to
26c890e
Compare
c5c5698
to
a593a3e
Compare
67acc62
to
18a2e7a
Compare
Fixes MithrilJS#2360 Fixes MithrilJS#1138 Fixes MithrilJS#1788 a little less hackishly Probably fixes a few other issues I'm not aware of. This more or less goes with @lhorie's comment here, just with a minor name change from `query` to `params`: MithrilJS#1138 (comment) Specifically, here's what this patch entails: - I changed `data` and `useBody` to `params` and `body` in `m.request`. Migration is trivial: just use `params` or `body` depending on which you intend to send. Most servers do actually care where the data goes, so you can generally pretty easily translate this accordingly. If you *really* need the old behavior, pass the old value in `params` and if `method === "GET"` or `method === "TRACE"`, also in `body`. - I opened up all methods to have request bodies. - I fixed `m.parseQueryString` to prefer later values over earlier values and to ensure that objects and arrays are persisted across both hash and query param parsing. That method also accepts an existing key/value map to append to, to simplify deduplication. - I normalized path interpolation to be identical between routes and requests. - I no longer include interpolated values in query strings. If you need to duplicate values again, rename the interpolation to be a distinct property and pass the value you want to duplicate as it. - I converted `m.route` to use pre-compiled routes instead of its existing system of dynamic runtime checking. This shouldn't have a major effect on performance short-term, but it'll ease the migration to built-in userland components and make it a little easier to reconcile. It'll also come handy for large numbers of routes. - I added support for matching routes like `"/:file.:ext"` or `"/:lang-:region"`, giving each defined semantics. - I added support for matching against routes with static query strings, such as `"/edit?type=image": { ... }`. - I'm throwing a few new informative errors. - And I've updated the docs accordingly. I also made a few drive-by edits: - I fixed a bug in the `Stream.HALT` warning where it warned all but the first usage when the intent was to warn only on first use. - Some of the tests were erroneously using `Stream.HALT` when they should've been using `Stream.SKIP`. I've fixed the tests to only test that `Stream.HALT === Stream.SKIP` and that it only warns on first use. - The `m.request` and `m.jsonp` docs signatures were improved to more clearly explain how `m.request(url, options?)` and `m.jsonp(url, options?)` translate to `m.request(options)` and `m.jsonp(options)` respectively. ----- There is some justification to these changes: - In general, it matters surprisingly more than you would expect how things translate to HTTP requests. So the comment there suggesting a thing that papers over the difference has led to plenty of confusion in both Gitter and in GitHub issues. - A lot of servers expect a GET with a body and no parameters, and leaving `m.request` open to working with that makes it much more flexible. - Sometimes, servers expect a POST with query parameters *instead* of a JSON object. I've seen this quite a bit, even with more popular REST APIs like Stack Overflow's. - I've encountered a few servers that expect both parameters and a body, each with distinct semantic meaning, so the separation makes it much easier to translate into a request. - Most of the time, path segments are treated individually, and URL-escaping the contents is much less error-prone. It also avoids being potentially lossy, and when the variable in question isn't trusted, escaping the path segment enables you to pass it through the URL and not risk being redirected to unexpected locations, avoiding some risks of vulnerabilities and client side crashes. If you really don't care how the template and parameters translate to an eventual URL, just pass the same object for the `params` and `body` and use `:param...` for each segment. Either way, the more explicit nature should help a lot in making the intent clearer, whether you care or not.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
read through the code/docs (nice work btw)
LGTM 👍
Merging as per private discussion with @StephanHoyer. |
Description
See the commit message for what all this entails. Here's a quick summary:
data
/useBody
into separateparams
+body
for a much easier time using it:x...
for unsafe interpolationm.request
andm.route.set
parsing and syntax, break direct dependency onm.buildQueryString
/m.parseQueryString
.m.buildPathname
andm.parsePathname
, what each use internally.:file.:ext
and:lang-:region
in path names.Edit: update to include latest stuff.
Motivation and Context
See the commit message after the horizontal line for the context and reasoning behind it.
How Has This Been Tested?
Ran all the existing tests, added new tests where necessary, and changed a few existing tests. The changed tests are almost exclusively around
m.request
/m.jsonp
, but I did have to make a minor alteration in them.route
test due to new auto-escaping.Types of changes
Checklist:
docs/change-log.md