2014-11-11 4 views
0

특정 HTTP 버전 프로토콜을 사용하여 파이썬에서 HTTP 요청을 보내는 방법이 있습니다. httplib 또는 urllib를 사용하면 HTTP 요청을 전송할 수 없습니다.특정/존재하지 않는 http 버전 프로토콜을 사용하여 HTTP 요청을 Python에서 보내십시오.

예 : GET/HTTP/6.9

감사합니다.

+0

왜이 작업을 수행 하시겠습니까? 불법적 인 버전 번호를 보내서 무엇을 달성하기를 희망합니까? – Kevin

+0

HTTP 핑거 프린팅, 발가락을 실행중인 웹 서버의 버전 및 모델을 확인합니다. – jomag

+1

"httplib 또는 urllib"와 함께 사용해야하는 이유가 있습니까? (특히 후자가 사용되지 않으므로 특히 그렇습니까?) – abarnert

답변

1

간단한 대답 :이 대부분의 서버에 대한 400 Bad Request가 발생합니다 물론

from httplib import HTTPConnection 


class MyHTTPConnection(HTTPConnection): 

    _http_vsn_str = '6.9' 


conn = MyHTTPConnection("www.stackoverflow.com") 
conn.request("GET", "/") 
response = conn.getresponse() 

print "Status: {} {}".format(response.status, response.reason) 
print "Headers: {}".format(response.getheaders()) 
print "Body: {}".format(response.read()) 

귀하의 질문입니다 : 당신 말이 맞아요, httpliburllib도 공개 기능이 내장되어 있습니다. 또한 urlopen의 경우 대부분 urllib을 사용하면 안됩니다.

물론 모듈의 구현 세부 정보는 Lukas Graf's answer처럼 항상 신뢰할 수 있습니다.

다른 방법으로,이 모듈 중 하나를 fork하고 수정할 수 있습니다. 그러면 다른 Python 2.x 구현에서 코드가 작동합니다. *. httplib은 상단에 the source에 대한 링크가있는 모듈 중 하나입니다. 즉, 블랙 박스 라이브러리가 아닌 예제 코드로 서버를 의미합니다.

아니면 그냥 연결해야하지만 공개적으로 문서화 된 최저 수준 기능을 다시 구현할 수 있습니다. 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.7 구현의 모든이 모듈에 대한 동일한 소스를 공유 2.8, 존재하지 않겠다고하지, 이익의 많은 주어진이고, 그것은 가능성이 새로운 2.x에서 구현 아니다 다른 것입니다. 그리고 3.x로 간다면 httplib이 재구성되고 이름이 변경되는 반면 urllib은 완전히 제거되었으므로 더 큰 변화가있을 것입니다.

1

당신은 클래스 속성 _http_vsn_strhttplib.HTTPConnection를 서브 클래스 및 재정 쉽게 충분히 수행 할 수 있습니다

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> 
+0

나는 이것을 좋아하지 않습니다. 그 속성의 존재와 목적은 계약 상 보장되지 않습니다. 이것은 파이썬의 차후 버전에서 깨질 수 있습니다. – Kevin

+0

@Kevin 잘 - HTTP 버전 식별자를'6.9'로 변경하면서 'HTTP 1.1'을 계속 말하고 있습니다. 어떤 공개 API도 이것을 지원하지 않습니다. –

+0

사실 ... 나는 OP가 아마도 처음부터 정확히 이것을하려고 노력해서는 안된다는 것을 정말로 염려하고 있다고 생각한다.아마 그들은 완전히 다른 기술을 사용해야 할 것입니다. – Kevin