1
votes

I'm using PromiseKit in an IOS app to communicate with a Rails RESTful backend, and there're some calls that return only header, say by executing head 200 on the backend.

What I've tried is:
I used [NSURLConnection POST:url formURLEncodedParameters:parameters] to post data to backend, the backend did receive the data and responded with a head 200 message, but PromiseKit is reporting the following exception:

2014-07-31 11:19:39.501 HelloPOS[13223:60b] Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (No value.) UserInfo=0xa4c5a90 {NSDebugDescription=No value., PMKURLErrorFailingDataKey={length = 1, capacity = 16, bytes = 0x20}, PMKURLErrorFailingURLResponseKey= { URL: http://SOME_APP.SOME_HOST.com/api/v1/sales.json } { status code: 200, headers { "Cache-Control" = "max-age=0, private, must-revalidate"; Connection = "keep-alive"; "Content-Length" = 1; "Content-Type" = "application/json"; Date = "Thu, 31 Jul 2014 03:19:25 GMT"; Etag = "\"7215ee9c7d9dc229d2921a40e899ec5f\""; Server = "WEBrick/1.3.1 (Ruby/2.0.0/2014-05-08)"; Via = "1.1 vegur"; "X-Content-Type-Options" = nosniff; "X-Frame-Options" = SAMEORIGIN; "X-Request-Id" = "5a1c1aa1-4b42-41ea-8397-a5df8fa956bc"; "X-Runtime" = "0.013359"; "X-Xss-Protection" = "1; mode=block"; } }}

It's probably because header-only response has no body, and the error is caused

PS: I've changed the URL in the exception message

1

1 Answers

3
votes

The problem is the server claims that the response has a JSON content of length 1 byte. But the response does not parse into JSON, so PromiseKit errors that promise.

PromiseKit doesn't provide a mechanism to ignore the response, but you could easily make your own promise here if you cannot fix the server to provide correct responses.

#import <OMGHTTPURLRQ.h>

- (PMKPromise *)myPromise:(id)args {
    id rq = [OMGHTTPURLRQ POST:url:args];
    id q = ;
    return [PMKPromise new:^(PMKPromiseFulfiller fulfill, PMKPromiseRejecter reject){
        [NSURLConnection sendAsynchronousRequest:rq queue:q completionHandler:^(id rsp, id data, NSError *urlError) {
            if (urlError) {
                reject(urlError)
            } else {
                fulfill(nil);
            }
        }];
    }];
}

EDIT: PromiseKit now works around this specific situation, so you should no longer get this specific error.