2016-04-11 11 views
1

NSURLProtocol MyGreatProtocol kullanıyorum. BenNSURLProtocol Alt Sınıfı içindeki bir isteğin HTTPBody'si neden her zaman sıfırdır?

NSURLProtocol.registerClass(MyGreatProtocol) 

Sonra ağ oturumları sırasında MyGreatProtocol içindeki olayları almaya başlamak URL Yükleme sisteme ekleyin.

varsayalım ben

let session = NSURLSession.sharedSession() 
    let request = NSMutableURLRequest(URL: NSURL(string:"http://example.com")!, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 2.0) //arbitrary 404 
    request.HTTPBody = ([1, 3, 3, 7] as [UInt8]).toNSData 
    print("body data: \(request.HTTPBody)") //prints `Optional(<01030307>)` 
    request.HTTPMethod = "POST" 
    session.dataTaskWithRequest(request) { (data, response, err) in 
     print("data: \(data)\nresponse: \(response)\nerror\(err)") 
    }.resume() 

Ben olmadığı isteğin HTTP gövde 1/3/3/7, MyGreatProtocol içindeki mevcut olmasını bekliyoruz, benim protokolü kaydettikten sonra oturumu oluşturun.

MyGreatProtocol İçinde, aşağıdaki yöntemleri geçersiz kılıyorum.

override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest { 
    print(request.HTTPBody) //prints nil 
    return request 
} 

override class func canInitWithRequest(request: NSURLRequest) -> Bool { 
    print(request.HTTPBody) //prints nil 
    return true 
} 

override func startLoading() { 
    print(self.request.HTTPBody) //prints nil 
} 

NSURLRequest'in diğer özellikleri korunmuş gibi görünüyor. URL, HTTP fiili, başlıklar vb. Hepsi burada. Vücudun doğasıyla ilgili belirli bir şey zor kalmaktadır.

HTTP Gövde Nil neden özel bir NSURLProtocol? size ulaşmadan önce

önce dosyalanmış radarlarında bazı benzer tartışmalar var gibi görünüyor (yani https://bugs.webkit.org/show_bug.cgi?id=137299)

cevap

3

IIRC, vücut veri nesneleri şeffaf URL yükleme sistem tarafından akış tarzı organları dönüştürülür olsun. Eğer veri okumak gerekirse:

  • Açık HTTPBodyStream nesne
  • vücut verilerini Oku

bir uyarı yok: akışı yeniden sarılabilir olmayabilir, bu nedenle geçemiyor Bu, daha sonra vücuda erişmek için ihtiyaç duyacağı herhangi başka bir kod için istekte bulunur. Ne yazık ki, yeni bir vücut akışı talep etmek için herhangi bir mekanizma yoktur (diğer sınırlamalar için Apple'ın web sitesindeki CustomHTTPProtocol örnek kod projesinden README dosyasına bakın).

+0

HTTPBodyStream ayrıca içinde veri bulunmamaktadır – calql8edkos

+0

Sonra bir hata buldunuz. Bu mümkün olmamalı. – dgatwood

+0

Bu sorudaki kodu 'canInitWithRequest:' içine kopyaladım ve 'inputStream.read' için bir dönüş değeri aldım http://stackoverflow.com/questions/25476770/swift-create-byte-buffer-holder-for- nsstream/25482541 – calql8edkos

İlgili konular