2012-01-17 9 views
1

sendSynchronousRequest:returningResponse:NSURLConnectionクラスのerrorメソッドを使用して、ネットワークからNSDataを取得します。NSURLConnection sendSynchronousRequestを使用しているときにデータの整合性をチェックする方法は?

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

私は何をしたい返された値が有効であるかどうかを確認することです。 だから、私は以下のように、データの長さと応答ヘッダーの期待される長さを比較しました。

NSData *urlData; 
do { 
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
    if ([urlData length] != [response expectedContentLength]) { 
     NSLog(@"WTF!!!!!!!!! NSURLConnection response[%@] length[%lld] [%d]", [[response URL] absoluteString], [response expectedContentLength], [urlData length]); 
     NSHTTPURLResponse *httpresponse = (NSHTTPURLResponse *) response; 
     NSDictionary *dic = [httpresponse allHeaderFields]; 
     NSLog(@"[%@]", [dic description]); 
    } 
} while ([urlData length] != [response expectedContentLength]); 

ただし、返されたデータの整合性を保証するのに十分であるかどうかはわかりません。 リモートサーバー上のファイルのチェックサムをチェックできません。

あなたの経験や他のヒントを教えてもらえますか?

ありがとうございました。

+0

完全性ではなく、データの長さをチェックしています。整合性の重要性に応じて、ハッシュベースのアルゴリズム、より複雑なメッセージ署名、またはHTTPSを実装できます。しかしいずれにしても、サーバ側の作業が必要になります。クライアントはメッセージをハッシュまたは署名し、サーバーがチェックします。あなたはサーバー側でそうすることはできないと述べたので、完全性を保証することはできません。 –

答えて

2

あなたがそれを取得する必要が予想されるデータのな長さを知るために(あなたがよりエレガント行うことができます)現在、ダウンロードしたデータの長さと予想されるデータの長さを格納するために

int downloadedLength; 
int expectedLength; 

のクラスの2つの変数を作成します。 downloadedLenghtを更新するdidReceiveResponseデリゲート

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 

// NSLog(@"expected: %lld",response.expectedContentLength); 
    expectedLength = response.expectedContentLength; 
    downloadedLength = 0; 
} 

から、あなたはdidReceiveDataでそれを増加する必要があります。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
downloadedLength = downloadedLength + [data length]; 
//...some code 
} 

ダウンロードしたデータは

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    if (downloadedLength == expectedLength) { 
     NSLog(@"correctly downloaded"); 
    } 
    else{ 
     NSLog(@"sizes don't match"); 
     return; 
    } 
} 

をconnectionDidFinishLoadingにあなたの要件に適合している場合、私が(HJMOHandlerに)不完全なダウンロード大きな写真とHJCacheライブラリの問題を修正するためにこれをしなければならなかった比較するために、任意のロジックを行うことが可能です。

+0

この正確な問題は、この正確なライブラリで問題になりました。明示的に記入していただきありがとうございます。 – mousebird

関連する問題