如何使用 Python 从 HTTP 响应中获取端口号?
How to get port number from an HTTP response, using Python?
我正在尝试为一些测试代码模拟网络地址转换。我将虚拟用户映射到高端口号,然后,当我想测试来自用户 1 的请求时,我从端口 6000(用户 2,从 6001 等)发送它。
但是,我在响应中看不到端口号。
connection = httplib.HTTPConnection("the.company.lan", port=80, strict=False,
timeout=10, source_address=("10.129.38.51", 6000))
connection.request("GET", "/portal/index.html")
httpResponse = connection.getresponse()
connection.close()
httpResponse.status
是 200,但我在响应 headers.
的任何地方都看不到端口号
也许我应该使用一些较低级别的套接字功能?如果是这样,哪个最简单并且同时支持 HTTP 和 FTP?顺便说一句,我只想使用 built-in 个模块,不需要安装任何东西。
[更新]我应该说得更清楚;我确实需要获取响应中收到的实际端口号,而不仅仅是记住它。
HTTP 消息不包含有关端口的任何信息,因此 httpResponse 不会包含该信息。
但是,您无论如何都需要为每个请求使用不同的连接对象(它将映射到不同的底层套接字),以便您可以从 HTTP 连接对象获取该信息。
_, port = connection.source_address
有帮助吗?
要完成@TimSpence 的回答,您可以使用套接字对象作为连接接口,然后将一些API 数据作为 HTTP 对象处理。
host = 'xxx.xxx.xxx.xxx'
port = 80
address = (host, port)
## socket object interface for a TCP connection
listener_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
socket.IPPROTO_TCP)
listener_socket.bind(address)
listener_socker.listen(MAX_CONNECTIONS)
## new_connection is the connection object you use to handle the data echange
## source_address (source_host, source_port) is the address object
## source_port is what you're looking for
new_connection, source_address = listener_socket.accept()
data = new_connection.recv(65536)
## handle data as an HTTP object(for example as an HTTP request)
new_connection.close()
考虑到您的意见,我不得不提供一个新的答案。
虽然您也可以在 HTTPRespose
、
'Host: domain/IP:port'
中放置一个非标准的 header host
,以便您的客户可以阅读它当它收到响应时。
服务器响应:
HTTP/1.1 200 OK
Date: Day, DD Month YYYY HH:MM:SS GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: UTF-8
Content-Length: LENGTH
Last-Modified: Day, DD Month YYYY HH:MM:SS GMT
Server: Name/Version (Platform)
Accept-Ranges: bytes
Connection: close
Host: domain/IP:port #exapmple: the.company.lan:80
<html>
<head>
<title>Example Response</title>
</head>
<body>
Hello World!
</body>
</html>
客户:
connection = httplib.HTTPConnection("the.company.lan", port=80,
strict=False, timeout=10,
source_address=("10.129.38.51", 6000))
connection.request("GET", "/portal/index.html")
httpResponse = connection.getresponse()
## store a dict with the response headers
## extract your custom header 'host'
res_headers = dict(httpResponse.getheaders());
server_address = tuple(headers['host'].split(':'))
## read the response content
HTMLData = httpResponse.read(CONTENT_LENGTH_HEADER)
connection.close()
这样你就得到了 server_address
作为一个元组 (domain, port)
.
我正在尝试为一些测试代码模拟网络地址转换。我将虚拟用户映射到高端口号,然后,当我想测试来自用户 1 的请求时,我从端口 6000(用户 2,从 6001 等)发送它。
但是,我在响应中看不到端口号。
connection = httplib.HTTPConnection("the.company.lan", port=80, strict=False,
timeout=10, source_address=("10.129.38.51", 6000))
connection.request("GET", "/portal/index.html")
httpResponse = connection.getresponse()
connection.close()
httpResponse.status
是 200,但我在响应 headers.
也许我应该使用一些较低级别的套接字功能?如果是这样,哪个最简单并且同时支持 HTTP 和 FTP?顺便说一句,我只想使用 built-in 个模块,不需要安装任何东西。
[更新]我应该说得更清楚;我确实需要获取响应中收到的实际端口号,而不仅仅是记住它。
HTTP 消息不包含有关端口的任何信息,因此 httpResponse 不会包含该信息。
但是,您无论如何都需要为每个请求使用不同的连接对象(它将映射到不同的底层套接字),以便您可以从 HTTP 连接对象获取该信息。
_, port = connection.source_address
有帮助吗?
要完成@TimSpence 的回答,您可以使用套接字对象作为连接接口,然后将一些API 数据作为 HTTP 对象处理。
host = 'xxx.xxx.xxx.xxx'
port = 80
address = (host, port)
## socket object interface for a TCP connection
listener_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
socket.IPPROTO_TCP)
listener_socket.bind(address)
listener_socker.listen(MAX_CONNECTIONS)
## new_connection is the connection object you use to handle the data echange
## source_address (source_host, source_port) is the address object
## source_port is what you're looking for
new_connection, source_address = listener_socket.accept()
data = new_connection.recv(65536)
## handle data as an HTTP object(for example as an HTTP request)
new_connection.close()
考虑到您的意见,我不得不提供一个新的答案。
虽然您也可以在 HTTPRespose
、'Host: domain/IP:port'
中放置一个非标准的 header host
,以便您的客户可以阅读它当它收到响应时。
服务器响应:
HTTP/1.1 200 OK
Date: Day, DD Month YYYY HH:MM:SS GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: UTF-8
Content-Length: LENGTH
Last-Modified: Day, DD Month YYYY HH:MM:SS GMT
Server: Name/Version (Platform)
Accept-Ranges: bytes
Connection: close
Host: domain/IP:port #exapmple: the.company.lan:80
<html>
<head>
<title>Example Response</title>
</head>
<body>
Hello World!
</body>
</html>
客户:
connection = httplib.HTTPConnection("the.company.lan", port=80,
strict=False, timeout=10,
source_address=("10.129.38.51", 6000))
connection.request("GET", "/portal/index.html")
httpResponse = connection.getresponse()
## store a dict with the response headers
## extract your custom header 'host'
res_headers = dict(httpResponse.getheaders());
server_address = tuple(headers['host'].split(':'))
## read the response content
HTMLData = httpResponse.read(CONTENT_LENGTH_HEADER)
connection.close()
这样你就得到了 server_address
作为一个元组 (domain, port)
.