Separate headers into request and response headers

- Add response header construction using records
- Update tests and examples
- Update doc
This commit is contained in:
sigma-andex
2022-06-16 19:58:33 +01:00
parent 8733799cb0
commit 88169cd299
9 changed files with 69 additions and 44 deletions

View File

@@ -7,7 +7,7 @@ import Effect.Aff (Aff)
import Effect.Class (liftEffect)
import Effect.Ref (new) as Ref
import HTTPurple.Body (RequestBody, defaultHeaders, read, toBuffer, toStream, toString, write)
import HTTPurple.Headers (header)
import HTTPurple.Headers (mkRequestHeader)
import Node.Buffer (Buffer, fromString)
import Node.Buffer (toString) as Buffer
import Node.Encoding (Encoding(UTF8))
@@ -72,20 +72,20 @@ defaultHeadersSpec =
describe "with an ASCII string" do
it "has the correct Content-Length header" do
headers <- liftEffect $ defaultHeaders "ascii"
headers ?= header "Content-Length" "5"
headers ?= (mkRequestHeader "Content-Length" "5")
describe "with a UTF-8 string" do
it "has the correct Content-Length header" do
headers <- liftEffect $ defaultHeaders "\x2603"
headers ?= header "Content-Length" "3"
headers ?= (mkRequestHeader "Content-Length" "3")
describe "Buffer" do
it "has the correct Content-Length header" do
buf :: Buffer <- liftEffect $ fromString "foobar" UTF8
headers <- liftEffect $ defaultHeaders buf
headers ?= header "Content-Length" "6"
headers ?= (mkRequestHeader "Content-Length" "6")
describe "Readable" do
it "specifies the Transfer-Encoding header" do
headers <- liftEffect $ defaultHeaders $ stringToStream "test"
headers ?= header "Transfer-Encoding" "chunked"
headers ?= (mkRequestHeader "Transfer-Encoding" "chunked")
writeSpec :: Test
writeSpec =

View File

@@ -5,7 +5,7 @@ import Prelude
import Data.Maybe (Maybe(Nothing, Just))
import Data.Tuple (Tuple(Tuple))
import Effect.Class (liftEffect)
import HTTPurple.Headers (empty, header, headers, read, write)
import HTTPurple.Headers (empty, header, headers, mkRequestHeader, mkRequestHeaders, read, write)
import HTTPurple.Lookup ((!!))
import Test.HTTPurple.TestHelpers ((?=))
import Test.HTTPurple.TestHelpers as TestHelpers
@@ -17,20 +17,20 @@ lookupSpec =
describe "when the string is in the header set" do
describe "when searching with lowercase" do
it "is Just the string" do
header "x-test" "test" !! "x-test" ?= Just "test"
mkRequestHeader "x-test" "test" !! "x-test" ?= Just "test"
describe "when searching with uppercase" do
it "is Just the string" do
header "x-test" "test" !! "X-Test" ?= Just "test"
mkRequestHeader "x-test" "test" !! "X-Test" ?= Just "test"
describe "when the string is uppercase" do
describe "when searching with lowercase" do
it "is Just the string" do
header "X-Test" "test" !! "x-test" ?= Just "test"
mkRequestHeader "X-Test" "test" !! "x-test" ?= Just "test"
describe "when searching with uppercase" do
it "is Just the string" do
header "X-Test" "test" !! "X-Test" ?= Just "test"
mkRequestHeader "X-Test" "test" !! "X-Test" ?= Just "test"
describe "when the string is not in the header set" do
it "is Nothing" do
((empty !! "X-Test") :: Maybe String) ?= Nothing
((mkRequestHeaders [] !! "X-Test") :: Maybe String) ?= Nothing
showSpec :: TestHelpers.Test
showSpec =
@@ -83,12 +83,12 @@ readSpec =
describe "with no headers" do
it "is an empty Map" do
request <- TestHelpers.mockRequest "" "" "" "" []
read request ?= empty
read request ?= (mkRequestHeaders [])
describe "with headers" do
it "is a Map with the contents of the headers" do
let testHeader = [ Tuple "X-Test" "test" ]
request <- TestHelpers.mockRequest "" "" "" "" testHeader
read request ?= headers testHeader
read request ?= mkRequestHeaders testHeader
writeSpec :: TestHelpers.Test
writeSpec =
@@ -98,7 +98,7 @@ writeSpec =
mock <- TestHelpers.mockResponse
write mock $ header "X-Test" "test"
pure $ TestHelpers.getResponseHeader "X-Test" mock
header ?= "test"
header ?= [ "test" ]
emptySpec :: TestHelpers.Test
emptySpec =

View File

@@ -3,10 +3,12 @@ module Test.HTTPurple.ResponseSpec where
import Prelude
import Data.Either (Either(Right))
import Debug (spy)
import Effect.Aff (makeAff, nonCanceler)
import Effect.Class (liftEffect)
import HTTPurple.Body (defaultHeaders)
import HTTPurple.Headers (header, toResponseHeaders)
import HTTPurple.Headers (toResponseHeaders)
import HTTPurple.Headers as Headers
import HTTPurple.Response (emptyResponse, emptyResponse', response, response', send)
import Node.Encoding (Encoding(UTF8))
import Node.HTTP (responseAsStream)
@@ -20,7 +22,7 @@ sendSpec =
let
mockResponse' =
{ status: 123
, headers: header "Test" "test"
, headers: Headers.header "Test" "test"
, writeBody:
\response -> makeAff \done -> do
stream <- pure $ responseAsStream response
@@ -32,7 +34,7 @@ sendSpec =
httpResponse <- liftEffect mockResponse
send httpResponse mockResponse'
pure $ getResponseHeader "Test" httpResponse
header ?= "test"
header ?= [ "test" ]
it "writes the status" do
status <- do
httpResponse <- liftEffect mockResponse
@@ -68,7 +70,7 @@ response'Spec :: Test
response'Spec =
describe "response'" do
let
mockHeaders = header "Test" "test"
mockHeaders = Headers.header "Test" "test"
mockResponse' = response' 123 mockHeaders "test"
it "has the right status" do
resp <- mockResponse'
@@ -107,7 +109,7 @@ emptyResponse'Spec :: Test
emptyResponse'Spec =
describe "emptyResponse'" do
let
mockHeaders = header "Test" "test"
mockHeaders = Headers.header "Test" "test"
mockResponse' = emptyResponse' 123 mockHeaders
it "has the right status" do
resp <- mockResponse'

View File

@@ -230,12 +230,12 @@ getResponseStatus :: HTTP.Response -> Int
getResponseStatus = _.statusCode <<< unsafeCoerce
-- | Get all current headers on the HTTP Response object.
getResponseHeaders :: HTTP.Response -> Object String
getResponseHeaders :: HTTP.Response -> Object (Array String)
getResponseHeaders = unsafeCoerce <<< _.headers <<< unsafeCoerce
-- | Get the current value for the header on the HTTP Response object.
getResponseHeader :: String -> HTTP.Response -> String
getResponseHeader header = fromMaybe "" <<< lookup header <<< getResponseHeaders
getResponseHeader :: String -> HTTP.Response -> Array String
getResponseHeader header = fromMaybe [ "" ] <<< lookup header <<< getResponseHeaders
-- | Create a stream out of a string.
foreign import stringToStream :: String -> Readable ()