Обработчики GCDWebServer для передачи фонового файла (Not GCDWebUploader)

Кто-нибудь уже пытался реализовать обработчик для запросов GET (тот же вопрос для метода POST) без использования включенного (и прохладного) GCDWebUploader?

Мне нужно, чтобы сервер отвечал на запрос GET http://local/download/filename.ext загружая файл клиенту.

Я согласен с запросом на код "BackgroundSessionManager" (доступен здесь: AFNetworking 2.0 и передачи фона), и он отправляется и не вызывает никаких проблем.

Журнал, который я получаю на стороне сервера, читает так:

[DEBUG] Did start background task
[DEBUG] Connection received 248 bytes on socket 14
[DEBUG] Connection on socket 14 preflighting request "GET /download/file.ext with 248 bytes body
[DEBUG] Connection on socket 14 processing request "GET /download/file.ext" with 248 bytes body
[EXCEPTION] *** +[NSJSONSerialization dataWithJSONObject:options:error:]: value parameter is nil
[DEBUG] Did close connection on socket 14

Я не могу решить, как настроить обработчик, чтобы не заботиться о несуществующем запросе для анализа из JSON.

[webServer addHandlerForMethod:@"GET" path:@"/download" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 __strong AppDelegate* strongSelf = weakSelf;
 NSLog(@"request for download is %@", request);

 return [strongSelf downloadFile:request];
 }];
1 ответ

Я удалил этот код, чтобы он работал:

/*
 // Add a handler to respond to GET requests
[webServer addDefaultHandlerForMethod:@"GET"
 requestClass:[GCDWebServerRequest class]
 asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {

 __strong AppDelegate* strongSelf = weakSelf;
.....
*/

[webServer addHandlerForMethod:@"GET" path:@"/download" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 __strong AppDelegate* strongSelf = weakSelf;
 NSLog(@"request for download is %@", request);

 return [strongSelf downloadFile:request];
}];

Прокомментировал обработчик по умолчанию, который принимал во внимание и ожидал пакет JSON.

ОБНОВИТЬ

Для обеспечения передачи фонового файла с GCDWebServer и NSURLSessions (даже с AFNetworking) лучшим способом для меня было создание экземпляра GET-обработчика с MatchBlock следующим образом:

[webServer addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) {

 if (![requestMethod isEqualToString:@"GET"]) {
 return nil;
 }
 if (![urlPath hasPrefix:@"/download"]) {
 return nil;
 }
 return [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];

 } processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {

 GCDWebServerResponse* response = nil;

 NSString* filePath = [[weakSelf applicationDocumentsDirectory] stringByAppendingPathComponent:[[request.path stringByRemovingPercentEncoding]];
 NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType];
 if (fileType) {
 if ([fileType isEqualToString:NSFileTypeRegular]) {
 // always allow ranges in our requests
 response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange];
 [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"];
 }
 }
 if (response) {
 response.cacheControlMaxAge = 360;
 } else {
 response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound];
 }
 return response;

 }];

licensed under cc by-sa 3.0 with attribution.