ASIHTTPRequest POST разделяет заголовок + данные?

Я использую ASIHTTPRequest для отправки данных POST на удаленный сервер на iPhone 4.2.1. Когда я делаю следующий почтовый запрос на наш сервер, я получаю ответ 400 (я удалил IP-адрес):

   NSString dataString = @"data1=00&data2=00&data3=00";

   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:<ipremoved>]]];
   [request appendPostData:[dataString dataUsingEncoding:NSUTF8StringEncoding]];
   [request setRequestMethod:@"POST"];
   [request addRequestHeader:@"User-Agent" value:@"iphone app"];
   [request addRequestHeader:@"Content-Type" value:@"application/octet-stream"];
   request.delegate = self;
   [request startAsynchronous];

Когда я отправляю те же данные с помощью curl, я получаю ответ 200:

    curl -H "User-Agent: iphone app" -H "Accept:" -H "Content-Type:application/octet-stream" --data-ascii "data1=00&data2=00&data3=00" --location <ipremoved> -v

Мой коллега утверждает, что в случае сбоя ASIHTTPRequest требует чтения двух сокетов: одного для заголовка и одного для данных. По-видимому, сервер в настоящее время не оборудован для правильного анализа, поэтому я пытаюсь обойти это.

Если я настрою прокси между iPhone и моим Mac и запущу Paros (чтобы увидеть пакеты), проблема исчезнет. Paros объединяет заголовок и данные, так что все они могут быть получены сервером за одно чтение сокета.

Я пробовал несколько вещей, предложенных в других сообщениях, включая отключение постоянных подключений, но мне не повезло. Я также пытался выполнить ASIHTTPFormRequest, но серверу не нравится сгенерированный формат данных.

Мы ценим любые предложения.

Спасибо.


person chris.o.    schedule 14.02.2011    source источник


Ответы (1)


«Мой коллега утверждает, что в случае сбоя ASIHTTPRequest требует чтения двух сокетов: одного для заголовка и одного для данных. Очевидно, сервер в настоящее время не оборудован для правильного анализа, поэтому я пытаюсь обойти это. "

Вы это точно знаете или это догадки? Такой HTTP-сервер будет очень неработоспособным и вызовет всевозможные случайные проблемы.

Вы смотрели, что Парос получает и что отправляет? Возможно, он исправляет ошибку в запросе случайно, и если это так, вы можете исправить запрос таким же образом.

person JosephH    schedule 15.02.2011
comment
Со своей стороны я смог подтвердить, что полный HTTP-запрос отправляется в двух сегментах TCP: один содержит только заголовок, а другой содержит данные. Paros просто объединяет эти два TCP-сегмента в один TCP-сегмент перед отправкой. Я согласен, что сервер кажется сломанным или, по крайней мере, неправильно настроенным. - person chris.o.; 15.02.2011
comment
Это действительно выглядит немного странно — что, если запрос превышает 1500 байт? Его /придется/ разбить на 2 пакета. Я понимаю, что самое очевидное, что делает Paros, — это объединение двух пакетов (извините за трудность в этом вопросе, но HTTP-прокси очень часто переписывают запросы): вы проверили пакеты побайтно и убедились, что это единственное отличие? - person JosephH; 16.02.2011
comment
Я действительно могу убедиться, что это то, что делает ASIHttpRequest, я настроил Wireshark на своем Mac и наблюдал, как это происходит. Я имею дело с той же проблемой из-за той же проблемы на стороне сервера - проблема, с которой я столкнулся, заключается в том, что это сторонняя система, которую я не могу контролировать - на их стороне они, по сути, сделали ту же комбинацию, и она проходит, не знаю, где идти отсюда - person Josh; 20.01.2012