如何使用 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).