Skip to content

Commit 6addce2

Browse files
author
Serhii Khoma
authored
Split XHRError into TimeoutError, RequestFailedError and XHROtherError (#156)
1 parent d0413f0 commit 6addce2

File tree

4 files changed

+33
-14
lines changed

4 files changed

+33
-14
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Notable changes to this project are documented in this file. The format is based
66

77
Breaking changes (😱!!!):
88

9+
- `XHRError Exn.Error` was removed and split to `TimeoutError`, `RequestFailedError`, `XHROtherError Exn.Error` (#155, @srghma)
10+
911
New features:
1012

1113
Bugfixes:

src/Affjax.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ exports._ajax = function () {
4141
};
4242
}
4343

44-
return function (mkHeader, options) {
44+
return function (timeoutErrorMessageIdent, requestFailedMessageIdent, mkHeader, options) {
4545
return function (errback, callback) {
4646
var xhr = platformSpecific.newXHR();
4747
var fixedUrl = platformSpecific.fixupUrl(options.url, xhr);
@@ -56,13 +56,13 @@ exports._ajax = function () {
5656
errback(e);
5757
}
5858
}
59-
var onerror = function (msg) {
59+
var onerror = function (msgIdent) {
6060
return function () {
61-
errback(new Error(msg + ": " + options.method + " " + options.url));
61+
errback(new Error(msgIdent));
6262
};
6363
};
64-
xhr.onerror = onerror("AJAX request failed");
65-
xhr.ontimeout = onerror("AJAX request timed out");
64+
xhr.onerror = onerror(requestFailedMessageIdent);
65+
xhr.ontimeout = onerror(timeoutErrorMessageIdent);
6666
xhr.onload = function () {
6767
callback({
6868
status: xhr.status,

src/Affjax.purs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import Data.Either (Either(..), either, note)
3030
import Data.Foldable (any)
3131
import Data.FormURLEncoded as FormURLEncoded
3232
import Data.Function (on)
33-
import Data.Function.Uncurried (Fn2, runFn2)
33+
import Data.Function.Uncurried (Fn4, runFn4)
3434
import Data.HTTP.Method (Method(..), CustomMethod)
3535
import Data.HTTP.Method as Method
3636
import Data.List.NonEmpty as NEL
@@ -88,15 +88,21 @@ defaultRequest =
8888
data Error
8989
= RequestContentError String
9090
| ResponseBodyError ForeignError (Response Foreign)
91-
| XHRError Exn.Error
91+
| TimeoutError
92+
| RequestFailedError
93+
| XHROtherError Exn.Error
9294

9395
printError :: Error -> String
9496
printError = case _ of
9597
RequestContentError err ->
9698
"There was a problem with the request content: " <> err
9799
ResponseBodyError err _ ->
98100
"There was a problem with the response body: " <> renderForeignError err
99-
XHRError err ->
101+
TimeoutError ->
102+
"There was a problem making the request: timeout"
103+
RequestFailedError ->
104+
"There was a problem making the request: request failed"
105+
XHROtherError err ->
100106
"There was a problem making the request: " <> Exn.message err
101107

102108
-- | The type of records that represents a received HTTP response.
@@ -179,16 +185,19 @@ request req =
179185
Left err ->
180186
pure $ Left (RequestContentError err)
181187
where
182-
183188
send :: Nullable Foreign -> Aff (Either Error (Response a))
184189
send content =
185-
try (AC.fromEffectFnAff (runFn2 _ajax ResponseHeader (ajaxRequest content))) <#> case _ of
190+
try (AC.fromEffectFnAff (runFn4 _ajax timeoutErrorMessageIdent requestFailedMessageIdent ResponseHeader (ajaxRequest content))) <#> case _ of
186191
Right res ->
187192
case runExcept (fromResponse res.body) of
188193
Left err -> Left (ResponseBodyError (NEL.head err) res)
189194
Right body -> Right (res { body = body })
190195
Left err ->
191-
Left (XHRError err)
196+
let message = Exn.message err
197+
in Left $
198+
if message == timeoutErrorMessageIdent then TimeoutError
199+
else if message == requestFailedMessageIdent then RequestFailedError
200+
else XHROtherError err
192201

193202
ajaxRequest :: Nullable Foreign -> AjaxRequest a
194203
ajaxRequest =
@@ -227,6 +236,12 @@ request req =
227236
addHeader (Accept <$> ResponseFormat.toMediaType req.responseFormat)
228237
req.headers
229238

239+
timeoutErrorMessageIdent :: String
240+
timeoutErrorMessageIdent = "AffjaxTimeoutErrorMessageIdent"
241+
242+
requestFailedMessageIdent :: String
243+
requestFailedMessageIdent = "AffjaxRequestFailedMessageIdent"
244+
230245
addHeader :: Maybe RequestHeader -> Array RequestHeader -> Array RequestHeader
231246
addHeader mh hs = case mh of
232247
Just h | not $ any (on eq RequestHeader.name h) hs -> hs `Arr.snoc` h
@@ -261,7 +276,9 @@ type AjaxRequest a =
261276

262277
foreign import _ajax
263278
:: forall a
264-
. Fn2
279+
. Fn4
280+
String
281+
String
265282
(String -> String -> ResponseHeader)
266283
(AjaxRequest a)
267284
(AC.EffectFnAff (Response Foreign))

test/Main.purs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ main = void $ runAff (either (\e -> logShow e *> throwException e) (const $ log
8484

8585
A.log "GET /slow with timeout: should return an error"
8686
(AX.request $ AX.defaultRequest { url = slow, timeout = Just (Milliseconds 100.0) }) >>= assertLeft >>= case _ of
87-
AX.XHRError _ → pure unit
88-
other → logAny' other *> assertFail "Expected a XHRError"
87+
AX.TimeoutError → pure unit
88+
other → logAny' other *> assertFail "Expected a TimeoutError"
8989

9090
A.log "POST /mirror: should use the POST method"
9191
AX.post ResponseFormat.json mirror (Just (RequestBody.string "test")) >>= assertRight >>= \res -> do

0 commit comments

Comments
 (0)