打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python 异步 IO 的未来(从 Web 后端开发的角度)

HTTP协议

我不得不说一些关于HTTP的事情。

对HTTP的支持普遍存在,但是使用python会很低效。不仅是因为不能像zeromq那样在其他线程处理事务,对HTTP解析也很缓慢。常常持久连接(keep-alive connection)也不受支持。

同时HTTP是复杂的,如果你认为不是这样,你就错了。来看个简单的例子吧。你可能写出下面的代码:

1
2
3
4
5
def simple_app(environ, start_response):
    status = '304 Not Modified'
    headers = [('Content-Length''5')]
    start_response(status, headers)
    return [b'hello']

理论上服务器会返回一个写有“hello”的页面(在wsgiref下测试),但是实际上:

The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields
(304响应必须不包含消息体,因此通常会被头域后的第一个空行终止)

意思是说“hello”行会被客户端在下次请求时识别成响应的第一行。这在一些设置中会导致缓存污染和安全漏洞。有多少使用HTTP的程序员意识到了这个现象呢?还有更多莫名其妙的细节。

HTTP不要在内部消息中使用,因为它容易使用但不简单,甚至复杂到使用了5个RFC也只描述了基本内容。即使误解最简单的内容可能会导致安全漏洞。

说实话,大多数微服务(microservice)使用了HTTP的子集,比如只认可200的响应码(其他的都作为失败),不使用特别的数据头或类似的,这可能不会出问题。当然这不是真正意义上的HTTP(但是经常用来负载均衡的代理则需要真正的HTTP,比如HAProxy),而且需要对HTTP特性非常熟悉的人才能构建安全的HTTP子集。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux环境下NodeJS的安装配置(HelloWorld)
使用spring ResponseEntity处理http响应
Python如何使用urllib2获取网络资源[转] - python中的网络编程 - 不...
多种语言(Python/C#)实现抓取网页,模拟登陆网站
Python3爬虫教程基础篇之二:网络库Reqeusts详解(上)
零基础写python爬虫之urllib2使用指南
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服