Python socket如何解析HTTP请求内容
作者:aefuimn 发布时间:2022-05-06 20:09:23
标签:Python,socket,HTTP,请求
socket解析HTTP请求内容
思路
1. 解析HTTP请求的头部
HTTP请求头部的结束符行为"\r\n",可以按行读取HTTP请求头的内容,如果读到一行为"\r\n",说明HTTP请求头结束。
2. 请求头里面含有Content-Length参数
如果HTTP请求里面有Content-Length参数,说明HTTP请求的内容大小是确定的,请求直接读取Content-Length的值,然后读取相应字节的的内容即可。
3. 请求头里面含有Transfer-Encoding: chunked 参数
如果HTTP请求里面有Transfer-Encoding参数,说明HTTP请求的内容大小是不确定的,这种内容的结束符是"0\r\n\r\n",因此可以按行读取HTTP请求的内容部分,如果连续读到"0\r\n"和"\r\n"说明内容读取完毕。
代码实现
代码中: self._file 代表的是socket.makefile()
def get_http_content(self):
content_length = 0
transfer_encoding = False
while True:
req_line = self._file.readline()
req_line = str(req_line, "utf-8")
# 遇到http头结束符
# 读取http内容
if req_line == "\r\n":
if content_length != 0:
content = self._file.read(content_length)
content = str(content, "utf-8")
self._content = content
return None
if transfer_encoding:
content = ""
self._file.readline()
while True:
line = self._file.readline()
line = str(line, "utf-8")
if line == "0\r\n":
sub_line = self._file.readline()
sub_line = str(sub_line, "utf-8")
if sub_line == "\r\n":
self._content = content
return None
else:
content += line
continue
self._content = False
# 头文件没有结束
# 并且没有找到关于内容大小的字段
else:
if content_length == 0 and transfer_encoding is False:
words = req_line.split()
if words[0] == "Content-Length:":
content_length = int(words[1])
if words[0] == "Transfer-Encoding:":
transfer_encoding = True
self._content = False
socket 模拟http请求
# coding: utf-8
import socket
from urllib.parse import urlparse
def get_url(url):
url = urlparse(url)
host = url.netloc
path = url.path
if path == "":
path = "/"
# 建立 socket 连接
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, 80))
client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path, host).encode("utf-8"))
data = b""
while True:
d = client.recv(1024)
if d:
data += d
else:
break
data = data.decode("utf-8")
html_data = data.split("\r\n\r\n")[1]
print(html_data)
client.close()
pass
if __name__ == '__main__':
get_url("http://www.baidu.com")
来源:https://blog.csdn.net/m0_37954775/article/details/100114334
0
投稿
猜你喜欢
- 来炫耀一下,谁看得懂我写的加密算法写了一整天了,这个代码用于ajax提交,要求就是加密后内容不能变得过长,加密解密需要效率高,至于安全性,被
- 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELECT查
- 当我们在使用validate等方法进行验证时,如果是错误,则会返回首页1、直接在请求头中在请求头header中,accept使用appcli
- 在许多人看来,HTML应该是WEB制作所有语言中最简单的语言,因为它不需要编译、封闭等,甚至只需要一个记事本就可以让其在浏览器中呈现出来。所
- 网页的布局也许是大家最不放在眼里的地方,其实布局地位如同文字的排版一样,随便可布,布即随便。但是看过我上篇《网页设计技巧系列 之 文本排版》
- 一、若出现404错误,自动跳转到所在目录的首页;二、若当前页本身是目录首页,则自动跳转至上一级目录的默认首页。自定义404页面代码如下:&l
- 本文主要给大家介绍了关于Golang中switch和select用法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:一、swi
- 加在< head>中< SCRIPT LANGUAGE="JavaScript">//more
- 一、报错: 「Can't swap PDO instance while within transaction」通过查询 Larav
- 一、安装软件包并创建项目$sudo pip install django$sudo python -c "import djang
- glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合。1、通配符星号(*)匹配零个或多个字符import globf
- innewDropList = [9,10,11,12,22,50,51,60,61]newDB = newDB[newDB['gr
- Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重作日
- 作为临时测试用python命令来搭建web测试是最好不过的选择了;CD切换到当前目录只需要一句python命令就迅速搭建好了简单的web服务
- 如何使用Index Server建立一个网站导航地图?程序代码如下:<html><head><title>asp教程之网站导航 -
- 情景互动广告是指需要广告画面外的物体来参与的广告,例如:ps:这是我收集的,大家慢慢看吧!其中有大多数收集http://www.netnoe
- 常规循环引用内存泄漏和Closure内存泄漏 要了解javascript的内存泄漏问题,首先要了解的就是javascript的GC原理。我记
- 在存储过程中,请问如何判断所指定表的字段的类型?由于表和视图的每一列在SYSCOLUMNS表中都有详细资料,所以,我们只管从中取用来即可,很
- 如何用我的国际域名做虚拟域名?config.asp<%Domain_URL = "intels.net&
- 十个免费的web前端开发工具网络技术发展迅速,部分技术难以保持每年都有新的工具出现,这同时也意味着许多旧的工具倒在了新技术的发展之路上。前端