в прокси, форматирование запроса браузера перед отправкой на хост - PullRequest
0 голосов
/ 15 марта 2012

Для класса я пишу основной прокси-сервер в c.

В примере профессора (это java) он принимает запрос браузера, который выглядит так:

GET http://www.cs.rpi.edu/index.html HTTP/1.1
Host: www.cs.rpi.edu
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Proxy-Connection: keep-alive
Cookie: __utma=138860844.163543584.1329315062.1329315062.1329315062.1;__utmz=138860844.1329315062.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)
Cache-Control: max-age=0

И форматирует его так, как он выглядит, плюс заголовки Accept и User-Agent перед отправкой на хост-сервер:

GET /index.html HTTP/1.1
Host: www.cs.rpi.edu

Я тоже это сделал, но теперь я столкнулся с 2 проблемами и 1 вопросом:

а. Сообщение отправляется на сервер в порядке, потому что connect () и write () не дают мне никакой ошибки, но когда я иду читать read () ответ сервера (возможно, ошибочно ожидая HTML?), Программа зависает и просто сидит навсегда пока я не нажму Ctrl + C. Я не могу ради жизни найти причину:

  /* write a message out on the socket connection */
  int n = write( sock, clientrequest, strlen( clientrequest ) );

  if ( n < strlen( clientrequest ) )
  {
    perror( "write() failed" );
    return EXIT_FAILURE;
  }

  printf("Made it here.\n\n");

  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 );
  }

  printf("But not here.\n\n");

B. Скажем, я подключаюсь к чему-то вроде www.google.com. Нет /index.html, так что же должно идти после GET в отформатированном запросе?

C. Почему запрос должен быть отформатирован таким образом, а не просто отправлен как есть?

1 Ответ

1 голос
/ 15 марта 2012

A) Вы уверены, что в конце вашей измененной строки запроса клиента есть 2 новых строки? Если нет, то сервер все еще ждет, пока вы отправите остальную часть запроса.

Кроме того, вы не хотите объявлять ошибку, если первый вызов write () не отправил все данные. Вы должны сидеть в цикле и продолжать писать, пока не истощите свой буфер. если произошла фактическая ошибка, будет возвращено -1, и затем вы можете объявить аварийную ситуацию.

B) Просто спросите «/», как в «GET / HTTP / 1.1». Сервер будет знать, что делать.

C) Отформатирован таким образом, как, например, запрос только со строками GET и Host:? Иногда функцией прокси-сервера является конфиденциальность: браузер разглашает много информации о себе. Этот пример прокси лишает многих из этих строк.

...