Как обработать частичный ответ от сервера?
Я на последнем серьезном препятствии написания основного прокси-сервера на C.
Мой сервер успешно получает запросы от браузера, а затем успешно отправляет их на хост, где бы они ни находились. И я успешно получаю ответы от хозяина! Кроме того, вот что я получаю, когда пытаюсь подключиться к Google через сервер:
Rcvd message from server:
----
HTTP/1.1 200 OK
Date: Thu, 15 Mar 2012 20:35:11 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=83a7c2e6675a9a9f:FF=0:TM=1331843711:LM=1331843711:S=7I7RIVV1B-HxhWJR; expires=Sat, 15-Mar-2014 20:35:11 GMT; path=/; domain=.google.com
Set-Cookie: NID=57=KvqnXtYNkJZBryXL5zzhG5eH8Or2_PDWDqT_kU35PvOro_mAFiLiTSjPHOnWWxxm3R0vKYnzEeVkAPFKK366lZiNZGpjhO2-II5OeZQnWe09H-jZdePsrN-SnBdQ2ENT; expires=Fri, 14-Sep-2012 20:35:11 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
1000
<!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta name="description" content="Search the world's information, including webpages, images, videos and more. Goo
Вы видите, как это отсекается? Из-за "Transfer-Encoding: chunked". Теперь, как мне заставить сервер продолжать посылать мне остальные куски? Потому что после этого первого он останавливается. Нужно ли поместить read() в цикл while и сказать, чтобы продолжить чтение и пересылку клиенту, пока есть что прочитать?
РЕДАКТИРОВАТЬ:
Хорошо, вот мой настоящий код. Это делает одно начальное чтение ответа сервера (в сокете с именем "sock"), записывает его клиенту ("newsock"), затем вводит цикл while для продолжения чтения большего количества ответов сервера и отправки их клиенту. я еще не проверял эту форму кода. Вы видите какие-либо вопиющие проблемы, кроме пробелов в проверке ошибок?
/*WRITING SERVER RESPONSE TO CLIENT*/
char buffer2[1024];
n = read(sock, buffer2, 1024 );
if ( n < 1 )
{
perror( "read() failed" );
return EXIT_FAILURE;
}
else
{
buffer2[n] = '\0';
printf( "Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2 );
}
n = write( newsock, buffer2, strlen( buffer2 ) );
while((n = read(sock, buffer2, 1024 )) >= 1)
{
buffer2[n] = '\0';
printf( "Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2 );
n = write( newsock, buffer2, strlen( buffer2 ) );
}
1 ответ
Вы не можете использовать strlen для получения размера вашего буфера, strlen предназначен только для получения размера строки, вы, вероятно, читаете некоторые двоичные данные, потому что через прокси проходит не только текст (изображения...), Попробуйте вместо этого использовать значение, возвращаемое read, которое является количеством фактически прочитанных байтов.
И окончание вашей строки с помощью '\n' становится бесполезным.