@@ -17,28 +17,34 @@ module Network.HTTP.Affjax
1717 ) where
1818
1919import Prelude
20- import Control.Alt ((<|>))
21- import Control.Bind ((<=<))
20+
2221import Control.Monad.Aff (Aff (), makeAff , makeAff' , Canceler (..), attempt , later' , forkAff , cancel )
23- import Control.Monad.Aff.Par (Par (..), runPar )
2422import Control.Monad.Aff.AVar (AVAR (), makeVar , takeVar , putVar )
2523import Control.Monad.Eff (Eff ())
2624import Control.Monad.Eff.Class (liftEff )
2725import Control.Monad.Eff.Exception (Error (), error )
2826import Control.Monad.Eff.Ref (REF (), newRef , readRef , writeRef )
2927import Control.Monad.Error.Class (throwError )
28+
29+ import Data.Array as Arr
3030import Data.Either (Either (..), either )
31- import Data.Foreign (Foreign (), F (), parseJSON , readString )
32- import Data.Function (Fn5 (), runFn5 , Fn4 (), runFn4 )
31+ import Data.Foreign (Foreign ())
32+ import Data.Foldable (any )
33+ import Data.Function (Fn5 (), runFn5 , Fn4 (), runFn4 , on )
3334import Data.Int (toNumber , round )
34- import Data.Maybe (Maybe (..), maybe )
35+ import Data.Maybe (Maybe (..))
3536import Data.Nullable (Nullable (), toNullable )
36- import DOM.XHR.Types (XMLHttpRequest ())
37+ import Data.Tuple (Tuple (..), fst , snd )
38+
3739import Math (max , pow )
40+
41+ import DOM.XHR.Types (XMLHttpRequest ())
42+
3843import Network.HTTP.Affjax.Request
3944import Network.HTTP.Affjax.Response
45+ import Network.HTTP.MimeType (MimeType ())
4046import Network.HTTP.Method (Method (..), methodToString )
41- import Network.HTTP.RequestHeader (RequestHeader (), requestHeaderName , requestHeaderValue )
47+ import Network.HTTP.RequestHeader (RequestHeader (.. ), requestHeaderName , requestHeaderValue )
4248import Network.HTTP.ResponseHeader (ResponseHeader (), responseHeader )
4349import Network.HTTP.StatusCode (StatusCode (..))
4450
@@ -202,23 +208,40 @@ affjax' :: forall e a b. (Requestable a, Respondable b) =>
202208affjax' req eb cb =
203209 runFn5 _ajax responseHeader req' cancelAjax eb cb'
204210 where
211+
205212 req' :: AjaxRequest
206213 req' = { method: methodToString req.method
207214 , url: req.url
208- , headers: (\h -> { field: requestHeaderName h, value: requestHeaderValue h }) <$> req. headers
209- , content: toNullable (toRequest <$> req.content )
210- , responseType: responseTypeToString (responseType :: ResponseType b )
215+ , headers: (\h -> { field: requestHeaderName h, value: requestHeaderValue h }) <$> headers
216+ , content: toNullable (snd requestSettings )
217+ , responseType: responseTypeToString (snd responseSettings )
211218 , username: toNullable req.username
212219 , password: toNullable req.password
213220 }
221+
222+ requestSettings :: Tuple (Maybe MimeType ) (Maybe RequestContent )
223+ requestSettings = case toRequest <$> req.content of
224+ Nothing -> Tuple Nothing Nothing
225+ Just (Tuple mime rt) -> Tuple mime (Just rt)
226+
227+ responseSettings :: Tuple (Maybe MimeType ) (ResponseType b )
228+ responseSettings = responseType
229+
230+ headers :: Array RequestHeader
231+ headers =
232+ addHeader (ContentType <$> fst requestSettings) $
233+ addHeader (Accept <$> fst responseSettings)
234+ req.headers
235+
236+ addHeader :: Maybe RequestHeader -> Array RequestHeader -> Array RequestHeader
237+ addHeader h hs = case h of
238+ Just h | not $ any (on eq requestHeaderName h) hs -> hs `Arr.snoc` h
239+ _ -> hs
240+
214241 cb' :: AffjaxResponse ResponseContent -> Eff (ajax :: AJAX | e ) Unit
215- cb' res = case res { response = _ } <$> fromResponse' res .response of
242+ cb' res = case res { response = _ } <$> fromResponse res .response of
216243 Left err -> eb $ error (show err )
217244 Right res' -> cb res'
218- fromResponse' :: ResponseContent -> F b
219- fromResponse' = case (responseType :: ResponseType b ) of
220- JSONResponse -> fromResponse <= < parseJSON <= < readString
221- _ -> fromResponse
222245
223246type AjaxRequest =
224247 { method :: String
0 commit comments