Skip to content

Instantly share code, notes, and snippets.

@alpmestan
Created October 17, 2017 12:10
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save alpmestan/757094ecf9401f85c5ba367ca20b8900 to your computer and use it in GitHub Desktop.
Save alpmestan/757094ecf9401f85c5ba367ca20b8900 to your computer and use it in GitHub Desktop.
servant redirects, new generation
{-
$ curl -X POST localhost:9876/dog -v
* Connected to localhost (127.0.0.1) port 9876 (#0)
> POST /dog HTTP/1.1
> Host: localhost:9876
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Transfer-Encoding: chunked
< Date: Tue, 17 Oct 2017 12:08:01 GMT
< Server: Warp/3.2.13
< Content-Type: application/json;charset=utf-8
< Location: https://google.com/?q=dog
<
* Connection #0 to host localhost left intact
-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
import Network.Wai.Handler.Warp
import Servant
type PostRedirect (code :: Nat) loc
= Verb 'POST code '[JSON] (Headers '[Header "Location" loc] NoContent)
redirect
:: ToHttpApiData loc
=> loc -- ^ what to put in the 'Location' header
-> Handler (Headers '[Header "Location" loc] NoContent)
redirect a = return (addHeader a NoContent)
type API = Capture "q" String :> PostRedirect 301 String
api :: Proxy API
api = Proxy
server :: Server API
server query = redirect ("https://google.com/?q=" ++ query)
main :: IO ()
main = run 9876 (serve api server)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment