如何将“requests.get”的结果发送到另一个套接字?
Posted
技术标签:
【中文标题】如何将“requests.get”的结果发送到另一个套接字?【英文标题】:How to send result of "requests.get" to another socket? 【发布时间】:2020-02-15 10:12:40 【问题描述】:我正在尝试制作某种专门的代理服务器来满足我的需求。 应用程序监听某个端口,当我使用(例如)cURL 连接到那里时,它会打开一个套接字(我们称之为 "my_socket" )。我从那里得到一些数据,根据我的需要进行修改,并使用 HTTPS 向另一台服务器发出请求:
my_request = "https://whatever.com/params"
my_response = requests.get(my_request)
现在我想将带有所有标头和有效负载的 my_response 发送到打开的套接字。某种
my_socket.send(my_response)
但 socket 接受 byte-like 对象并且 my_response 是 HTTPResponse。这会导致错误。 谁能告诉我如何将 HTTPResponce 转换为字节,或者我可以使用任何其他方法来传输我的数据?我想我可以手动从 my_response 中提取所有数据并手动组装响应,但也许有更简单的方法? 谢谢。
更新 我试过了
my_socket.send(my_response.content)
但对方无法将其解码为任何文本。它看起来像这样:
curl -o /dev/null -v -s -k "http://127.0.0.1:8080/my_cool_request"
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /my_cool_request HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.47.0
> Accept: */*
>
[16380 bytes data]
* Connection #0 to host 127.0.0.1 left intact
更新2。 我从 my_response.headers 发送标题。
my_lenth=len(my_response.content)
my_header="HTTP/1.1 " + str(my_response.status_code)+" " + my_response.reason
for key in my_response.headers:
my_header+=key+": "+r.headers[key]+"\n"
my_header+="Content-Length: "+str(my_lenth)+"\n"
header_encoded=my_header.encode()
my_socket.send (header_encoded)
my_socket.send(r.content)
这不是最终版本,因为我的 cURL 仍然出现错误:
* Illegal or missing hexadecimal sequence in chunked-encoding
There is an explanation why it is happening
【问题讨论】:
这可能会有所帮助https://***.com/questions/21233340/sending-string-via-socket-python! 【参考方案1】:正如 Sofian 所说,您可以使用 response.content。 但总的来说,你应该知道,如果你有一个字符串对象,你可以str.encode() 使它成为一个类似字节的对象;
x = "hello, world!"
x.encode()
然后要将其恢复为字符串,请使用 str.decode()
x = b"hello, world!"
print(x.decode())
【讨论】:
感谢更新。如果我错了,请纠正我,但是 response.content 已经是字节,不需要解码它们。 @ZeleniyZmey 是的,它是字节,您不需要将它们编码为字节字符串。【参考方案2】:Response-Class 的 content 变量是一个类似字节的对象:
response = requests.get("https://google.com")
mySocket.send(response.content)
【讨论】:
感谢您的回答。我尝试了 response.content,但似乎 .content 只包含一个没有标头的有效负载。因此,当我使用这种结构时,我没有得到响应代码和其他信息。只是一个有效载荷。以上是关于如何将“requests.get”的结果发送到另一个套接字?的主要内容,如果未能解决你的问题,请参考以下文章