fizruk / http-api-data

Converting to/from HTTP API data like URL pieces, headers and query parameters.
http://hackage.haskell.org/package/http-api-data
Other
52 stars 42 forks source link

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

Open saurabhnanda opened 6 years ago

saurabhnanda commented 6 years ago

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 commented 6 years ago

@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 commented 5 years ago

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 commented 5 months ago

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.