ios - HTTP Status Code 411 - Length Required -
i try data server. use nsurlconnectiondelegate, nsurlconnectiondatadelegate. there code (objective - c).
-(void)sendrequest { nsurl* url = [[nsurl alloc] initwithstring:@"http://someserver"]; nsmutableurlrequest* request = [[nsmutableurlrequest alloc] init]; nsstring* reqbody = [nsstring stringwithformat:@"<tag>content</tag>"]; nsdata* reqdata = [reqbody datausingencoding:nsutf8stringencoding]; nsinputstream* stream = [nsinputstream inputstreamwithdata:reqdata]; [request seturl:url]; [request sethttpbodystream:stream]; [request sethttpmethod:@"post"]; self.wpdata = [[nsmutabledata alloc] init]; nsurlconnection* conection = [[nsurlconnection alloc] initwithrequest:request delegate:self]; [conection start]; } - (void)connection:(nsurlconnection *)connection didreceiveresponse:(nsurlresponse *)response { [self.wpdata setlength:0]; } - (void)connection:(nsurlconnection *)connection didreceivedata:(nsdata *)d { nsstring* str = [[nsstring alloc] initwithdata:d encoding:nsutf8stringencoding]; nslog(@"response data: %@",str); [self.wpdata appenddata:d]; } but "411 - length required" when use
[request sethttpbodystream:stream]; and "hash (someaddress)" when use
[request sethttpbody:reqdata]; i tried
[request sethttpbodystream:stream]; nsstring *postlength = [nsstring stringwithformat:@"%d", [reqdata length]]; [request setvalue:postlength forhttpheaderfield:@"content-length"]; but again "hash (someadddress)"
what have done wrong? sorry english. :)
what have done wrong?
nothing.
http status code 411 (length required) sent server response when refuses accept message without content-length header, whatever reason.
a server may or may not accept content without content-length header.
when set nsinputstream object request body via property httpbodystream request, nsurlconnection cannot evaluate length of body anymore. (there no property length stream). hence, nsurlconnection uses "transfer mode", namely "chunked transfer encoding". transfer mode should succeed transmit body , not require content-legth header (actually must not contain one). alas, server not accept type of transfer.
see also: chunked transfer encoding (wiki).
to solve issue on client side:
determine length of body (if possible) , set "content-length" header field request. if input stream has been created file or
nsdataobject, length can determined. sure set exact same length actual stream content in bytes.don't use
nsinputstream, usensdataobject body , set via propertyhttpbody. when set bodynsdataobject,nsurlconnectioncan determine content length itself, , automatically add content-length header correct length, unless set in request.
Comments
Post a Comment