En-têtes de requête HTTP

D'accord. J'ai travaillé avec la requête HTTP brute et j'ai découvert que je peux publier la réponse HTTP brute dans NSLog et j'ai presque craqué la requête HTTP brute dans NSLog. Je suis juste coincé maintenant.

Exemple de code

NSSsortingng *CurrentWebURL = webView.request.URL.absoluteSsortingng; NSURLSession *session= [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; [[session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithSsortingng:CurrentWebURL]] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *requestdictionary = [request allHTTPHeaderFields]; NSLog(@"----shouldStartLoadWithRequest Raw HTTPRequest Start ----"); for (NSSsortingng *Object in [requestdictionary allKeys]) { NSLog(@"%@: %@",Object, [requestdictionary objectForKey:Object]); } NSLog(@"----shouldStartLoadWithRequest Raw HTTPRequest Finish ----"] withlevel:SPECIAL_LOG); }]resume]; 

Demande brute:

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0_6 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11B651 

Il devrait me montrer "Get: URL", "HOST", "login: Keep-alive", "Accept-Encoding", "Accepter", "Cookie", "login", "Accept-Language" et "User- Agent".

Ma question est pourquoi est-ce seulement montrant le "Accepter" et "Utilisateur-Agent"?

Faire une request:

  NSURL *url = [NSURL URLWithSsortingng:PortalURL]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; [request setHTTPShouldHandleCookies:YES]; [request setHTTPMethod: @"GET"]; 

Trace de request de Fiddler (sans en-tête personnalisé):

  GET http://URL/ HTTP/1.1 Host: Host.co.uk Connection: keep-alive Accept-Encoding: gzip, deflate Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Cookie: IsosecCookie=Chris%20Beckett Connection: keep-alive Accept-Language: en-gb User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0_6 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11B651 

Journalisation des en-têtes de request dans NSLog:

  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0_6 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11B651 

Je suis arrivé à la conclusion qu'il n'est pas possible d'get la requête HTTP brute dans iOS avec NSURLRequest, vous êtes seulement en mesure d'get "Accept" et "User-Agent".

Cependant, j'ai fait un travail, pour get la requête HTTP brute j'ai utilisé php pour get les en-têtes. Je sais que ce n'est pas la meilleure solution, mais cela fonctionne et c'est génial de pouvoir save cette information sans avoir à passer par un proxy comme Fiddler ou Charles proxy.

code iOS

 NSURL *PHPURL = ([NSURL URLWithSsortingng:[NSSsortingng ssortingngWithFormat:@"http://office.isosec.co.uk/Audit/testRequest.php?"]]); request = [[NSMutableURLRequest alloc] initWithURL:PHPURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; [request setHTTPMethod: @"GET"]; [request setHTTPShouldHandleCookies:YES]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; PHPResponse = [NSMutableData data]; if( connection == nil ) { [ViewController remoteLog:[NSSsortingng ssortingngWithFormat:@"PHPRequest Connection Failed"] withlevel:SPECIAL_LOG]; } else { [ViewController remoteLog:[NSSsortingng ssortingngWithFormat:@"PHPRequest Connection Started"] withlevel:SPECIAL_LOG]; [connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [connection start]; } 

Code PHP

 foreach (getallheaders() as $name => $value) { echo "$name: $value,"; } 

Il est possible d'get les en-têtes de request d'URL qui ont réellement été envoyés au server en demandant le currentRequest la tâche, ce qui vous donnera plus que simplement Accept et User-Agent , au less dans mes tests limités:

 __block NSURLSessionDataTask *task = nil; // Use __block because we need to reference this particular pointer, not its current address task = [session dataTaskWithRequest:originalRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSURLRequest *request = task.currentRequest; NSLog(@"Request HTTP Headers: %@", request.allHTTPHeaderFields); }]; [task resume]; 

Edit: Malheureusement, il semble que cela ne vous donne pas tous les en-têtes, juste un peu plus comme Accept-Encoding et Accept-Language .