资讯专栏INFORMATION COLUMN

【python socket编程】—— 2.解析http请求头

韩冰 / 2606人阅读

摘要:请求头的换行使用的是。编写一个类,来解析请求的方法路径和,如下下一篇文章编程响应

前文:【python socket编程】—— 1.初探

在上一篇文章中我们知道,socket.accept()接受的数据是请求头,请求头格式是这样的:

POST /login HTTP/1.1
Host: 127.0.0.1:1207
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1:1207/login
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
Cookie: D9zb2HfPUf8RI7AOwsUZpiBq
Connection: keep-alive
Upgrade-Insecure-Requests: 1

username=Harp&password=1234

这是一个POST请求,请求头第一行是POST /login HTTP/1.1,以空格划分,分别是请求方法、路径和协议,之后则是key: value形式的各种数据组成的header,我们暂且不管每一行分别是什么意思,然后是空行,结尾的username=Harp&password=1234body部分,表单通过POST方法提交的数据(如账号密码)就在这里,GET请求则没有body部分。请求头的换行使用的是"/r/n"


编写一个Request类,来解析请求的方法、路径、headerbody,如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# contact: liutao25@baidu.com

from urllib.parse import unquote, quote


class Request:
    def __init__(self, r):
        self.content = r
        self.method = r.split()[0]
        self.path = r.split()[1]
        self.body = r.split("

", 1)[1]

    def form_body(self):
        return self._parse_parameter(self.body)

    def parse_path(self):
        index = self.path.find("?")
        if index == -1:
            return self.path, {}
        else:
            path, query_string = self.path.split("?", 1)
            query = self._parse_parameter(query_string)
            return path, query

    @property
    def headers(self):
        header_content = self.content.split("

", 1)[0].split("
")[1:]
        result = {}
        for line in header_content:
            k, v = line.split(": ")
            result[quote(k)] = quote(v)
        return result

    @staticmethod
    def _parse_parameter(parameters):
        args = parameters.split("&")
        query = {}
        for arg in args:
            k, v = arg.split("=")
            query[k] = unquote(v)
        return query

下一篇文章:【python socket编程】—— 3.响应

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41329.html

相关文章

  • python socket编程】—— 1.初探

    摘要:从导入相应函数,即传入一个上一步中的类,返回对应的网页内容,具体实现将在后续讲解。后续只要去处理解析请求和响应部分即可,主程序可以不用再修改。下一篇文章编程解析请求头 Flask或者其他框架都是封装的比较完善,我们可以不去关注路由、SESSION等到底是怎么实现的,现在我们使用socket来实现一个带有注册、登录功能的To do网站,这样能对后端框架了解的稍微更深入一点(当然你也可以直...

    int64 评论0 收藏0
  • python socket编程】—— 3.响应

    摘要:前文编程解析请求头的框架和解析请求的类我们都写好了,现在唯一要做的就是处理相应。回复响应的原理就是这样,后续每增加一个路径,就在字典中增加一条及增加一个对应的响应函数。下一篇文章编程实现函数 前文:【python socket编程】—— 2.解析http请求头 web的框架和解析请求的Request类我们都写好了,现在唯一要做的就是处理相应。编写一个route_dict字典,key是...

    iOS122 评论0 收藏0
  • [译]Python 中的 Socket 编程(指南)

    摘要:当一个客户端连接时,它将返回一个新的对象,对象中有表示当前连接的和一个由主机端口号组成的连接的元组,更多关于元组值的内容可以查看地址族一节中的详情这里必须要明白我们通过调用方法拥有了一个新的对象。 博客原文: https://keelii.com/2018/09/24/socket-programming-in-python/ 说明 本书翻译自 realpython 网站上的文章教程 ...

    sushi 评论0 收藏0
  • 走进Node.js 之 HTTP实现分析

    摘要:事实上,协议确实是基于协议实现的。的可选参数用于监听事件另外,它也监听事件,只不过回调函数是自己实现的。并且会把本次连接的套接字文件描述符封装成对象,作为事件的参数。过载保护理论上,允许的同时连接数只与进程可以打开的文件描述符上限有关。 作者:正龙(沪江Web前端开发工程师)本文为原创文章,转载请注明作者及出处 上文走进Node.js启动过程中我们算是成功入门了。既然Node.js的强...

    April 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<