2012-05-28 3 views
0

Я нахожусь в iOS, и я пытаюсь отправить запрос HTTP POST для создания задания на печать с помощью Mac, который действует как IPP-сервер. Я могу правильно печатать с помощью аэродрома, теперь я пытаюсь перейти на низкоуровневый уровень, потому что мне нужно отправить необработанные данные на принтер.IPP через HTTP: получение 400 плохих запросов в ответе

Кое-что о моем коде:

Все жёстко. Я все еще пытаюсь выяснить, где я ошибаюсь, поэтому я просто на стадии разработки/тестирования. Первая часть посвящена определению бинарной структуры запроса печати на печать IPP (и оно должно быть правильным, в соответствии с спецификацией RFC 2910).

char data[239] = {0x01, 0x01, // IPP version 
    0x00, 0x04, // Print-job request 
    0x00, 0x00, 0x00, 0x50, // Arbitrary request ID 
    0x01, // Attribute group 
    // ATT 1 
    0x47, // charset value-tag 
    0x00, 0x12, // name-length 
    'a','t','t','r','i','b','u','t','e','s','-','c','h','a','r','s','e','t', // name 
    0x00, 0x05, // value-length 
    'u','t','f','-','8', // value 
    // ATT 2 
    0x48, // natural-language value-tag 
    0x00, 0x1B, // name-length 
    'a','t','t','r','i','b','u','t','e','s','-','n','a','t','u','r','a','l','-','l','a','n','g','u','a','g','e', // name      
    0x00, 0x05, // value-length 
    'e','n','-','u','s', // value 
    // ATT 3 
    0x45, // uri type value-tag 
    0x00, 0x0B, // name-length 
    'p','r','i','n','t','e','r','-','u','r','i', // name 
    0x00, 0x47, // value-length 
    'i','p','p',':','/','/','A','n','d','r','e','a','s','-','M','a','c','B','o','o','k','-','P','r','o','-','2','.','l','o','c','a','l','.',':','6','3','1','/','p','r','i','n','t','e','r','s','/','H','P','_','D','e','s','k','j','e','t','_','F','4','5','0','0','_','s','e','r','i','e','s', // value 
    // ATT 4 
    0x42, // requesting user id value-tag 
    0x00, 0x14, // name-length 
    'r','e','q','u','e','s','t','i','n','g','-','u','s','e','r','-','n','a','m','e', // name 
    0x00, 0x05, // value-length 
    'g','u','e','s','t', // value 
    // ATT 5 
    0x49, // document format value-tag 
    0x00, 0x0f, // document format 
    'd','o','c','u','m','e','n','t','-','f','o','r','m','a','t', 
    0x18, // TODO 
    'a','p','p','l','i','c','a','t','i','o','n','/','o','c','t','e','t','-','s','t','r','e','a','m', 
    0x03, // end of attributes 
    't','e','s','t'}; // data 

NSMutableData *printJob = [NSMutableData data]; 
[printJob appendBytes:data length:sizeof(data)]; 
NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [printJob length]]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://192.168.1.23:631/printers/HP_Deskjet_F4500_series"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/ipp" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:@"Andreas-MacBook-Pro-2.local" forHTTPHeaderField:@"Host"]; 
[request setValue:@"CUPS/1.5.0" forHTTPHeaderField:@"User-Agent"]; 
[request setValue:@"100-continue" forHTTPHeaderField:@"Expect"]; 
[request setHTTPBody:printJob]; 

[[NSURLConnection connectionWithRequest:request delegate:self] start]; 

Всякий раз, когда я запускаю этот код, через 10 секунд я получаю сообщение об ошибке с отрицательным запросом HTTP 400.

Странно, что HTTP-запрос кажется таким же, как тот, который я могу захватить с помощью анализатора пакетов всякий раз, когда печать печатных изданий отправляет задание на печать на сервер ipp (и это работает).

+0

Вы используете этот прокси-сервер каким-либо образом? У меня есть аналогичная проблема, работающая над прокси-сервером. – MikeIsrael

+0

Нет, у меня просто есть маршрутизатор, но трафик не выходит из локальной сети. –

+0

Вы поняли, что willSendRequestForAuthenticationChallenge ни при каких обстоятельствах? Я нахожу свою проблему в том, что когда этот метод вызывается по какой-то причине, мое тело стирается впоследствии. – MikeIsrael

ответ

1

Вы должны использовать правильный код операции IPP для печати Иова:

  • некорректного: 0x00, 0x04, // =Validate-job request
  • правильного: 0x00, 0x02, // Print-job request

Вы должны использовать документ-формат text/plain вместо octet-stream. Также убедитесь, что принтер поддерживает формат данных или, по крайней мере, убедитесь, что CUPS настроен с соответствующими преобразователями (похоже, вы говорите с HP-принтером через CUPS).

Не беспокойтесь о user-agent, это не имеет значения. Вместо этого позаботьтесь о своей обработке http-протокола! Отправляя Expect: 100-continue, вы делаете CUPS ожидаемым chunked http. Не отправляйте Expect-Header, и все должно быть хорошо.

Убедитесь, что длина ipp-запроса плюс длина данных правильно вычислена и помещена в заголовок длины содержимого.

+0

У вас есть образец кода? –

+0

наш код примера java доступен только по запросу: контакт ipp-software.com - внедрение кодера и декодера ipp-message для объектного C/iOS не будет слишком сложным для нас. –