如何在Python中操作GET请求的内容主体

时间:2014-05-23 17:30:10

标签: python http request urllib2

我知道有很多方法可以添加类似这样的标题或Cookie。但我想要做的是在请求的顶部添加“\ r \ n”,以便看起来像下面的主体。

请求正文>>

\r\n <-- technically invisible.. 
GET /path/ HTTP/1.1
Host: www.website.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22
Referer: https://www.google.com/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,ko;q=0.6
Accept-Charset: windows-949,utf-8;q=0.7,*;q=0.3
正如您所见,

\ r \ n已添加到GET请求的第一行。

这就像添加一个空行。

我怎样才能在Python中执行此操作?

我花了好几个小时讨论这个话题,却找不到任何有用的资源。

===================== ADD ========================= ===================

这是关于黑客行为。

在韩国,政府限制某些网站,但只需在请求正文的顶部添加“\ r \ n”即可轻松避免阻止用户连接到网站的过滤器。

httplib2,httplib,urllib,urllib2等..等等。

无论使用哪种库,我只需要在请求正文中添加“\ r \ n”。

1 个答案:

答案 0 :(得分:1)

你可以通过monkeypatching httplib.HTTPConnection类来做到这一点; urlliburllib2requests等都使用该类来处理低级HTTP会话。

最简单的方法是修补HTTPConnection._output()方法,在HTTP版本消息之前插入额外的字符:

from httplib import HTTPConnection, _CS_REQ_STARTED

orig_output = HTTPConnection._output

def add_initial_newline_output(self, s):
    if (self._HTTPConnection__state == _CS_REQ_STARTED and
        s.endswith(self._http_vsn_str) and not self._buffer):
        self._buffer.append('')  # will insert extra \r\n
    orig_output(self, s)

HTTPConnection._output = add_initial_newline_output

这只会在连接处于正确状态(请求已启动)时插入额外的起始空行,该行以当前HTTP版本字符串结束,缓冲区仍为空。