在代理中,在将浏览器请求发送给主机之前格式化它

时间:2012-03-15 01:28:34

标签: c proxy network-programming

对于课程,我在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后应该怎么做?

℃。为什么需要以这种方式格式化请求,而不是按原样发送?

1 个答案:

答案 0 :(得分:1)

A)您确定修改后的clientrequest字符串末尾有2个换行符吗?如果没有,那么服务器仍在等待您发送剩余的请求。

此外,如果第一次write()调用未发送所有数据,则不希望声明失败。你应该坐在一个循环中继续写,直到你耗尽你的缓冲区。如果有实际错误,将返回-1,然后您可以宣布紧急情况。

B)只需要'/',如“GET / HTTP / 1.1”。服务器将知道该怎么做。

C)以这种方式格式化,例如,只有GET和Host:行的请求?有时,代理服务器的功能是隐私:浏览器泄露了很多关于自身的信息。这个代理示例正在剥离很多这些行。