Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用特定/不存在的http版本协议发送http请求_Python_Urllib_Httplib - Fatal编程技术网

在Python中使用特定/不存在的http版本协议发送http请求

在Python中使用特定/不存在的http版本协议发送http请求,python,urllib,httplib,Python,Urllib,Httplib,在python中,有一些方法可以使用特定的http版本协议发送http请求。我认为,使用httplib或urllib是不可能的 例如:GET/HTTP/6.9 提前感谢。通过对class属性进行子类化和重新定义,您可以很容易地做到这一点: 当然,对于大多数服务器,这将导致400错误请求: Status: 400 Bad Request Headers: [('date', 'Tue, 11 Nov 2014 21:21:12 GMT'), ('connection', 'close'), ('c

在python中,有一些方法可以使用特定的http版本协议发送http请求。我认为,使用httplib或urllib是不可能的

例如:GET/HTTP/6.9


提前感谢。

通过对class属性进行子类化和重新定义,您可以很容易地做到这一点:

当然,对于大多数服务器,这将导致
400错误请求

Status: 400 Bad Request
Headers: [('date', 'Tue, 11 Nov 2014 21:21:12 GMT'), ('connection', 'close'), ('content-type', 'text/html; charset=us-ascii'), ('content-length', '311')]
Body: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request</h2>
<hr><p>HTTP Error 400. The request is badly formed.</p>
</BODY></HTML>
状态:400错误请求
标题:[('date','Tue,2014年11月11日21:21:12 GMT'),('connection','close'),('content-type','text/html;charset=us-ascii'),('content-length','311')]
正文:
错误的请求
错误的请求
HTTP错误400。请求的格式不正确


您的问题的简单答案是:您是对的,既没有也没有公共的内置功能来执行此操作。(另外,您确实不应该在大多数情况下使用
urllib
,尤其是
urlopen

当然,您可以始终依赖于这些模块的实现细节,如中所示

或者,您也可以分叉其中一个模块并对其进行修改,这保证了您的代码可以在其他Python 2.x实现上工作。*。请注意,
httplib
是那些在顶部链接到up的模块之一,这意味着它意味着作为示例代码而不仅仅是黑匣子库来提供服务器

或者,您可以重新实现需要挂接但已公开记录的最低级别的函数。对于
httplib
,我认为这是
httplib.HTTPConnection.putrequest
,它有几百行长

或者你可以选择一个不同的库,其中有更多的钩子,这样你就没有那么多钩子了

但实际上,如果您正试图手工创建一个自定义请求来手动对结果进行指纹识别,那么为什么要使用HTTP库呢?为什么不这样做呢

msg = 'GET / HTTP/6.9\r\n\r\n'
s = socket.create_connection((host, 80))
with closing(s):
    s.send(msg)
    buf = ''.join(iter(partial(s.recv, 4096), ''))

*这并不是什么好处,因为永远不会有2.8版本,所有现有的主要2.7版本的实现都共享这个模块的相同源代码,而且任何新的2.x版本的实现都不可能有任何不同。如果您转到3.x,
httplib
已被重新组织和重命名,而
urllib
已被完全删除,因此您将需要担心更大的更改。

为什么要这样做?通过发送非法版本号,您希望实现什么目的?HTTP指纹识别,以获取运行toe的web服务器的版本和型号。是否有理由必须使用“httplib或urllib”?(特别是因为后者已被弃用了?)不,我本想用插座来做这件事,但有人说我“不要重新发明轮子”,我不喜欢这样。该属性的存在和目的没有合同保证。这可能会破坏Python的未来版本。@Kevin well-您正在将HTTP版本标识符更改为
6.9
,同时仍在谈论
HTTP 1.1
。没有一个公共API会支持这样的东西。。。我想我真的很担心OP可能不应该一开始就这么做。也许他们应该使用一种完全不同的技术。@凯文:那么答案是,“不,你不能用Python 2.7中的
httplib
来实现这一点。”。但是,您可以创建自己的
httplib
副本,并对其进行修改或子类化,在这种情况下,这是可以保证的。是的,如果使用HTTP指纹识别,这可能只需要在TCP套接字级别上完成。
msg = 'GET / HTTP/6.9\r\n\r\n'
s = socket.create_connection((host, 80))
with closing(s):
    s.send(msg)
    buf = ''.join(iter(partial(s.recv, 4096), ''))