Skip to content
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

Why don't toQueryParam or toUrlPiece actually url-encode the data? #79

Open
saurabhnanda opened this issue Sep 9, 2018 · 3 comments
Open
Labels

Comments

@saurabhnanda
Copy link

I was trying to write my own ToHttpApiData instance for a newtype wrapper over text, and ended up looking at the existing instance for Text and was surprised to find that it isn't really url-encoding the data. Why is this the case? Isn't the idea of this type-class to convert a value to be safe for usage in URLs (either as path fragments or query-params)?

If ToHttpApiData is not supposed to emit url-encoded stuff, what is the type-class/function/mechanism that does it?

@fizruk
Copy link
Owner

fizruk commented Sep 11, 2018

@saurabhnanda that is a great question! I think we have only covered it in some discussions on GitHub, but have not moved any of it into Haddock documentation.

First, if you're looking for a function that does URL-encoding, see toEncodedUrlPiece.

http-api-data basically tries to parse Text/ByteString that is received via HTTP APIs.
In the spirit of "let a function do one job well" we don't try to perform the decoding/encoding (whether it be URL-encoding or UTF8 or something else). At least not in the class methods.

This can be beneficial for when your web framework already does encoding/decoding for you.
Or when you encode/decode the whole query string or request body.

Hope this answers your question :)

@ocharles
Copy link

This can be beneficial for when your web framework already does encoding/decoding for you.

I just ran into this from servant(-client) and was pretty surprised. A route that Captures Text doesn't encode it at all!

@saurabhnanda
Copy link
Author

I'm running into this issue again. Till the time there is a better solution available for #143 , I'm converting my Haskell record to a JSON and using that for toQueryParam & parseQueryParam

Should I be url-encoding this JSON, or not?

If I don't urlencode it, the JSON shows up as-is when using safeLinks from servant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants