从python BaseHTTPServer上深入理解HTTP协议

Py的BaseHTTPServer:Python标准库中实现HTTP服务器的模块 BaseHTTPServer模块是Python标准库中用于实现HTTP服务器的模块之一,它提供了一个基础的HTTP服务器框架。在Python中,有一个标准库可以轻松地创建HTTP服务器,那就是BaseHTTPServer。下面介绍BaseHTTPServer模块的详细介绍、安装和使用方法。BaseHTTPServer模块提供了一种快速、简单地在Python中实现HTTP服务器的方法。BaseHTTPServer模块是Python标准库的一部分,因此无需额外安装。只需要在Python代码中导入即可开始使用。 阅读详情

从python BaseHTTPServer上深入理解HTTP协议

因为项目关系,需要写一个简单的web服务做测试桩,为了开发和部署方便,选择了Python开发,及python自带的BaseHTTPServer,不依赖其他三方件。
关于如何用Python编写一个简单的Http Server,可以自行搜索,我参考了这篇文章:https://blog.youkuaiyun.com/u010087956/article/details/50500071

奇怪的错误

在给浏览器返回response时,碰到了奇怪的错误,折腾了很久:

try:
    self.send_header("Content-type", "text/xml")
    self.send_header("Content-Length", str(len(content)))
    self.end_headers()
    self.wfile.write(content)
    self.send_response(200)

except Exception, e:
    print >> sys.stderr, "request failed: %s" % e
    sys.exit(1)

总是报10053错误,没有任何错误message。最后仔细看了BaseHTTPRequestHandler的源码,调整try的语句顺序,成功!

try:
    self.send_response(200)
    self.send_header("Content-type", "text/xml")
    self.send_header("Content-Length", str(len(content)))
    self.end_headers()
    self.wfile.write(content)
except Exception, e:
    print >> sys.stderr, "request failed: %s" % e
    sys.exit(1)

协议

要理解这个问题,得先从http协议关于response的定义说起,HTTP基本上就是一个文本协议,HTTP响应由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
HTTP响应消息格式
示例:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Content-Length: 51
Content-Type: text/xml

<html>
    <body>
        <p>Hello, world!</p>
    </body>
</html>
  • 第一部分:状态行由HTTP协议版本号, 状态码, 状态消息 三部分组成。
    第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
  • 第二部分:消息报头,用来说明客户端要使用的一些附加信息
    第二到第五行为消息报头,Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html);Server:服务器类型;Content-Length: 消息大小。
  • 第三部分:空行,消息报头后面的空行是必须的
  • 第四部分:响应正文,服务器返回给客户端的文本信息。
    空行后面的html部分为响应正文。

源码分析

self.send_response(200)
对应的源码:
if self.request_version != 'HTTP/0.9':
    self.wfile.write("%s %d %s\r\n" %
                     (self.protocol_version, code, message))
    # print (self.protocol_version, code, message)
self.send_header('Server', self.version_string())
self.send_header('Date', self.date_time_string())

send_response()会先输出状态行,然后换行写入两个报头行(‘Server’和’Date’)。

def send_header(self, keyword, value):
    """Send a MIME header."""
    if self.request_version != 'HTTP/0.9':
        self.wfile.write("%s: %s\r\n" % (keyword, value))

send_header就是按行以"key: value"格式写入消息头。

def end_headers(self):
    """Send the blank line ending the MIME headers."""
    if self.request_version != 'HTTP/0.9':
        self.wfile.write("\r\n")

end_headers则是直接写入一个空行。
self.wfile.write(page)则是在socket连接上写入内容。

Cookie

搞定报文返回后,又碰到cookie设置的问题了。本以为cookie会有单独的API设置,结果找来找去都没找到,查看资料才发现需要通过header设置,好吧,又是拼基础知识了,拜读了这篇文章:https://www.cnblogs.com/ajianbeyourself/p/4900140.html。

cookie就是存储在用户主机浏览器中的一小段文本文件。Cookies是纯文本形式,它们不包含任何可执行代码。一个Web页面或服务器告之浏览器来将这些信息存储并且基于一系列规则在之后的每个请求中都将该信息返回至服务器。Web服务器之后可以利用这些信息来标识用户。

创建cookie

服务端创建cookie,通过HTTP的Set-Cookie消息头,Web服务器可以指定存储一个cookie。Set-Cookie消息的格式如下面的字符串(中括号中的部分都是可选的)

	Set-Cookie:value [ ;expires=date][ ;domain=domain][ ;path=path][ ;secure]

例如

self.send_header('Set-Cookie', 'session_id=' + self.succ_session + ';expires=Mon, 22 Jul 2019 07:52:50 GMT;domain=abc.com;path=/;HTTPOnly;')

读取cookie

通过HTTPHeader的cookie消息头来读取,例如

self.headers['Cookie']

注意(坑)

  • secure选项表示cookie只通过https协议传输。http协议下设置的cookie不会被浏览器返回。
  • domain选项表示cookie作用域,不支持IP。Set-Cookie成功,但是不会被浏览器返回给服务端。

总结

从BaseHTTPServer源码可以看到,代码完全根据http协议一行行的输出,几个函数调用要保持固定调用顺序。
平时使用java的spring boot等等封装好了的类库,完全忽略了协议的本身;这次使用最原始的工具加深了对协议的理解!

利用netmq在相机应用于unity之间传输图像数据 Unity工业相机接入方案解析 本文探讨了在Unity中接入不同品牌工业相机的技术方案。研究发现: Basler相机可直接调用官方DLL(pylonc.net.dll)实现接入 海康和大恒相机因驱动DLL依赖C++组件,无法直接调用 解决方案:通过独立进程(相机应用程序)与Unity进行通信,采用NetMQ实现图像数据传输 技术实现要点: 相机端:使用PublisherSocket发布JPEG图像帧 Unity端:通过SubscriberSocket订阅图像数据 优化:设置高水位线控制缓存帧数,避免数据堆积 阅读详情

相关推荐

陷波滤波器设计以及Simulink仿真

离散型陷波滤波器设计以及simulink仿真

hmq252198885的博客 3168

Python中的BaseHTTPServer介绍

Python是一种功能强大的编程语言,拥有丰富的库和模块用于不同的开发需求。在Web开发领域,Python提供了一个名为BaseHTTPServer的模块,用于快速构建简单的HTTP服务器。本文将介绍Python中的BaseHTTPServer模块以及如何使用它来搭建一个基本的HTTP服务器。BaseHTTPServer模块是Python标准库中的一个模块,提供了HTTP服务器的基本功能。它是一个轻量级的模块,可用于构建简单的HTTP服务器用于开发、调试和测试等目的。

牛肉胡辣汤 853

Vue3实战:集成bpmn-js与Activiti工作流引擎的完整指南

本文详细介绍了如何在Vue3项目中集成bpmn-js流程图编辑器与Activiti工作流引擎,构建一个完整的前端流程设计器。文章重点解析了Vue3响应式系统与bpmn-js集成的核心陷阱及解决方案,并提供了属性面板配置、XML命名空间适配、撤销重做等实用功能的完整实现指南,帮助开发者高效完成工作流系统的前端开发。

weixin_29009881的博客 213

python中的 http.server,BaseHTTPServer解释及如何安装教程

python中的 http.server,BaseHTTPServer解释及如何安装教程 1、解释: python3已经将BaseHTTPServer合并到http.server 2、如何安装http.server 首先不能直接使用pip 下载(反正我没找到相关的例子),安装步骤如下 http://nodejs.cn/ 官网下载安装文件,安装nodejs;(很简单) 运行中输入cmd进入命令行模式,输入 node -v ,显示版本号,代表安装成功 如何按任意键,会下载具体的文件如下(自动下载,等待即

qq_44218805的博客 6152

7系列ZYNQ硬件调试:Vitis无法识别ARM DAP的排查与解决

本文详细分析了Xilinx 7系列ZYNQ芯片在Vitis开发环境中无法识别ARM DAP的常见问题及解决方案。从硬件设计检查(电源系统、时钟电路)、JTAG连接诊断到软件环境排查,提供了全面的调试指南。特别针对ARM DAP初始化失败的情况,给出了实用的排查步骤和预防措施,帮助开发者快速定位和解决类似问题。

weixin_33737134的博客 515

华为2288H-V5服务器做raid的详细步骤

华为2288H-V5服务器做RAID

qq_50263172的博客 6万+

Python的学习(十四)---- 实现简单的HTTP服务器

用Python实现简单的HTTP服务器 用于搭建http server的模块有如下三种: 1)BaseHTTPServer:提供基本的Web服务和处理器类,分别是HTTPServer及BaseHTTPRequestHandler; 2)SimpleHTTPServer:包含执行GET和HEAD请求的SimpleHTTPRequestHandler类; 3)CGIHTTPServer:包含处

宁静以致远 6万+

Python实战:超分辨率图像质量评估全攻略——PSNR、SSIM、LPIPS与NIQE的代码实现与优化

本文详细介绍了在Python中实现超分辨率图像质量评估的完整方案,涵盖PSNR、SSIM、LPIPS和NIQE四大核心指标。通过模块化代码设计、多进程并行处理和GPU加速优化,帮助开发者构建高效、可扩展的评估系统,并提供了实战避坑指南与结果解读方法。

weixin_29053073的博客 476

python 基于BaseHTTPServer的web服务器搭建(二)

#coding=utf-8 from BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler import urllib class MyHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self...

nanxiaoting的博客 7755

从传感器到执行-智能家居 Agent 的感知-决策-执行闭环

本文提出了一种面向智能家居的感知型Agent架构,通过"感知-决策-执行"的闭环系统实现智能化控制。感知模块整合多源传感器数据,决策模块基于规则或机器学习模型生成控制策略,执行模块完成设备操作。系统能够实时监测环境参数和用户状态,自动调节温度、照明等设备,提升家居舒适度。该架构可扩展为多模态感知与强化学习相结合的智能系统,为智慧家居发展提供技术基础。

一键难忘的博客 1123

CANOE-介绍 @014-基于CAPL的Someip测试(CANOE 15.0/16.0/17.0)【草稿】发送事件、方法

摘要:本文介绍了使用CANoe 16.0及更高版本配置SOME/IP测试环境的方法,包括硬件连接、工程配置和CAPL代码实现。SOME/IP是一种面向服务的车载通信协议,支持服务发现、事件推送和方法调用。文章详细说明了网络拓扑配置、数据库文件加载等步骤,并提供了CAPL代码示例,展示如何初始化多个应用端点(15个不同端口)和服务实例(73个服务),通过SomeIpOpenLocalApplicationEndpoint和SomeIpCreateProvidedServiceInstance函数实现。配置过程

沿流不止 424

Python HTTP服务器底层实现:从Socket到GET/POST请求处理

HTTP协议是Web通信的基石,它定义了客户端与服务器之间请求与响应的标准格式。其工作原理基于TCP连接,通过请求行、头部和正文构成报文,实现资源的获取与提交。理解HTTP底层机制对于Web开发、性能优化和网络编程至关重要,能帮助开发者深入掌握框架原理并处理定制化场景。本文聚焦于使用Python标准库手动实现HTTP服务器,核心内容包括通过socket监听处理网络连接、解析HTTP/1.1协议规范,并重点实现GET与POST请求的完整处理流程。通过实践请求解析、路由分发、响应构建及表单数据处理等关键环节,读

weixin_30571465的博客 493

9篇3章7节:基于 R 语言的 FAERS 数据提取与合并

本文主要探讨了 FAERS 数据提取与合并的操作流程。首先,通过程序化方法从本地存储的 FAERS ASCII 文件中提取指定季度或范围内的单药报告数据,并可通过参数设置控制数据存储位置、处理方式、计算资源分配以及报告者职业类别等。随后,通过批量读取的方式对多个季度的 DRUG 文件进行循环处理,并将其合并为一个综合数据框。

MD Code 1269

Python Internet

今天的进度更新到《python标准库》的第十二章 Internet。 初读之下,略感陌生,拿起了之前只读了1/3的《自顶向下方法》复习起来,结合之前的Tcp/Udp的一些小demo之后,感觉理解和思考更进了一个层次,之前很多掠过一眼的东西,现在能引起我的思考。愿一步一个脚印。 今天主要打了HTTP中 GET和POST两大方法的实现。虽然书中给出的报文似乎不是很标准,但是对其实现有了更进一步的思考

wallpainting的博客 391

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python 基于BaseHTTPServer的web服务器搭建

转载:https://blog.youkuaiyun.com/nanxiaoting/article/details/81225601 #coding=utf-8 from BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler import urllib class MyHandler(BaseHTTPRequestHandler): ...

lxlong的博客 1101

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python2 搭建简易HTTP服务器python -m SimpleHTTPServer 8080

python -m SimpleHTTPServer 8080 python -m Web服务器模块 [端口号,默认8000] “Web服务器模块”有如下三种:BaseHTTPServer: 提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler。SimpleHTTPServer: 包含执行GET和HEAD请求的SimpleHTTPRequest...

Captain的专栏 161

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

2024年最新【面试必会,Python写一个简易的web服务器(1),Python面试项目

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~给大家准备的学习资料包括但不限于:Python 环境、pycharm编辑器/永久激活/翻译插件python 零基础视频教程Python 界面开发实战教程Python 爬虫实战教程Python 数据分析实战教程python 游戏开发实战教程Python 电子书100本。

2401_84132393的博客 851

Python BaseHTTPServer

原新浪博客(http://blog.sina.com.cn/billsona)搬迁至此。 文章目录前言一、BaseHTTPServer二、程序框架三、程序实例四、关于https的处理 前言 某项目的性能测试工作,已经接近尾声,借此机会进行一下总结。 这项工作,对我这种编码白痴和技术菜鸟来讲,最大的收获莫过于完成工作的同时,入门了一点点python编程和BaseHTTPServer库的使用。 一、BaseHTTPServer BaseHTTPServer库是一个非常简单并且容易上手的python基础库。

阿尔泰野狼的博客 2594

Python实现HTTP服务器:使用BaseHTTPServer或更高级的库

非常适合快速搭建基本的HTTP服务器进行测试或学习,但在开发实际应用程序时,使用更高级的框架如Flask或Django会更为方便。此外,Flask还提供了丰富的扩展,用于支持ORM(对象关系映射)、表单验证、用户认证等高级功能。但如果你正在开发一个复杂的Web应用,那么使用Flask或Django等高级框架将是一个更好的选择。(Python 3)来创建一个基本的HTTP服务器,然后简要提及使用更高级库(如Flask)的优势。在Python中,实现一个简单的HTTP服务器可以通过多种库来完成,从基础的。

weixin_73725158的博客 902

Python小姿势 - 如何用Python实现一个简单的Web服务器

《100天精通Python》专栏,最详细的Python入门到精通教程;理论篇基础知识讲解构建体系框架、实践篇Python黑科技学以致用。https://blog.youkuaiyun.com/weixin_39032019/category_12263598.html

独木不成林,单弦不成音。 3517

[Python http.server] 搭建http服务器用于下载/上传文件

动机:笔者需测试bs架构下的文件上传与下载性能,故想通过Python搭建http服务器并实现客户端与服务器之间的文件上传和下载需求 难点:这应该是很基础的东西,不过笔者之前未接触过http编程,谨在此记录下学习的过程,可能不是最优解 方法:在服务器端部署html页面,并执行监听的Python代码,在客户端操作实现文件的上传与下载

Norths_的博客 2万+

基于python -m http.server的文件共享服务器搭建

使用python构建文件共享服务器

图灵追幕者博客录 2058

服务器上的文件的上传和下载

我们有很多种方式上传文件到服务器上,比如FTP, 比如使用命令行工具:SZ/RZ,SCP等等的。 我之前经常使用的是SZ/RZ这个命令,但是在Mac下经常乱码然后卡住不动了,所以我很崩溃。下面说说我现在 采用的办法吧。 下载文件 python-mSimpleHTTPServer9999 上传文件 文件名:SimpleHTTPServerWithU...

weixin_34025151的博客 588

[python相关]BaseHTTPServer -- 基本的 HTTP 服务器

from:http://hi.baidu.com/janyway/item/7dd94b322b0a47c01a969660   BaseHTTPServer -- 基本的 HTTP 服务器这个模块定义了两个实现 HTTP 服务器 (Web 服务器)的类。 通常地, 这个模块不被直接使用,但被用来作为构建功能性 Web 服务器的一个基类。 参阅 SimpleHTTPServer and CGI

zyflying的专栏 1万+

Python BaseHTTPServer 模块解析

#coding=utf-8 ''' Created on 2015-7-20 @author: xhw @explain: 实现GET方法和POST方法请求 ''' from BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler import urllib class ServerHTTP(BaseHTTPRequestHandle...

liulina603的专栏 9086

python http服务器性能,Python BaseHTTPServer性能测试

最近我要在短时间内要做一个内部使用的诊断服务,于是想到了使用Python的BaseHTTPServer。Python开发速度是飞快的。等开发完了,回过头想了想,发现这个以后性能会是一个瓶颈。诊断服务要调用很多别的服务,单线程的话QPS可能会只有一个,必须得用多线程。于是使用mixin将服务改成多线程版。事后还是不太放心,于是使用abench分别压了两个版本的服务。服务代码如下,非常简单,看看空转速...

weixin_42129412的博客 967
上一篇: 常用的openssl命令
下一篇: 日志分析涉及的命令
CommanderZero
博客等级 码龄9年 6粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值