If an NSURLProtocol subclass is used with NSURLSession the request body is nil

Originator:luka.bernardi
Number:rdar://15993891 Date Originated:05/02/2012
Status:Open Resolved:
Product:iOS SDK Product Version:7.0.x
Classification:Other Bug Reproducible:Always
 
Summary:
If a custom NSURLProtocol is provided to NSURLSession, even if the NSURLRequest has an HTTPBody non-nil when the request is passed to the NRURLProtocol (such as canInitWithRequest: or canonicalRequestForRequest:) has an empty body

Steps to Reproduce:
1. Create a subclass NSURLProtocol
2. Create an NSURLSessionConfiguration and set as protocolClasses an array containing the previously created NSURLProtocol
3. Create an NSURLRequest with HTTPMethod = @"POST" and with non-nil HTTPBody 
4. Create a NSURLSession and an NSURLSessionDataTask with the given NSURLRequest
5. resume the NSURLSessionDataTask

Expected Results:
When the method of the NSURLProtocol subclass are called the provided request should contains the previously set body

Actual Results:
The NSURLProtocol subclass method are called with a request with a nil body

Version:
iOS 7.0.x

Notes:
An example project is provided. The project demonstrate that with NSURLConnection the behavior is as expected, with NSURLSession the request has nil body

Comments

Worth nothing that Apple have demonstrated this field should be available in their example project:

https://developer.apple.com/library/ios/samplecode/CustomHTTPProtocol/Listings/CustomHTTPProtocol_Core_Code_CanonicalRequest_m.html#//apple_ref/doc/uid/DTS40013653-CustomHTTPProtocol_Core_Code_CanonicalRequest_m-DontLinkElementID_8


Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!