返回信息流搞了一周了,python用时方恨学少QAQ
我想做一个小的python服务器,然后想办法将客户端所有的请求先代理到这个服务器上,
根据请求path判断这个服务器能不能处理请求内容,如果可以就自己处理并返回,
不行就原封不动将它转发出去,相当于做一层透明代理,再返回结果。
我希望这东西足够简单以便于今后的扩展,所以先不考虑第三方库(其实是不会用)
实际写起来发现遍地都是坑啊TAT
首先如果我用BaseHTTPRequestHandler,HTTPServer这些去做,的确能够很方便的处理请求头,
但问题是转发那一块要怎么做?我怎么能将经过处理的请求再转发出去?
如果我用Socket这一层去写,转发的时候比较好办,原文读进来,再原文写出去就好。
但这样的话请求头我就得自己处理,现在遇到的问题是我还得判断content-length或者Transfer-Encoding: chunked从Socket中拿数据。
怎么想都不好做啊,版上的大大有没有什么好的思路orz
对了,用的python3
这是一条镜像帖。来源:北邮人论坛 / python / #14686同步于 2016/6/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
[已解决]小白求助,有关http的问题
ytinrete
2016/6/27镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
【 在 nuanyangyang 的大作中提到: 】
: 如果是代理的话,你的服务器即是服务器,又是客户端。你还需要一个客户端,来与你的真的服务器联系。
: 或者,直接开个tcp连接连你的后端服务器。
:
嗯,对的,道理都懂但是写起来就。。
现在不把服务器和客户端分开两个进程,而是作为两个模块,
代理部分服务器接收到请求之后起一个新的线程处理,再这里面直接发请求到目标服务器,
接收返回,然后直接返回给原始客户端。
现在基本打算用socket来做了,但瓶颈在recv()这部分,我要接收多少个字节合适?
根绝http协议请求头和body之间用\r\n分割,我是应该一个一个字节地读然后再判断么?
用tcp的话,万一这个请求我地代理服务器能够处理,也就是不用代理,这样还要从tcp那一层解析出http的内容感觉有点恐怖哎(其实是不会)。
我这样想:如果你的代理服务器的目的是降低后端服务器的负担,那么肯定绝大多数的请求,代理服务器是可以处理的。所以,应该为绝大多数请求优化。
所以,在代理服务器端,尽管放心地解析http好了。如果能处理,就处理了。如果不能处理,用requests等常规的http客户端重新构造一个新的http请求发给你的后端服务器,也不算太大的负担。
body部分……4096字节吧。我猜的。
【 在 ytinrete 的大作中提到: 】
:
: 嗯,对的,道理都懂但是写起来就。。
: 现在不把服务器和客户端分开两个进程,而是作为两个模块,
: ...................
【 在 nuanyangyang 的大作中提到: 】
: 我这样想:如果你的代理服务器的目的是降低后端服务器的负担,那么肯定绝大多数的请求,代理服务器是可以处理的。所以,应该为绝大多数请求优化。
: 所以,在代理服务器端,尽管放心地解析http好了。如果能处理,就处理了。如果不能处理,用requests等常规的http客户端重新构造一个新的http请求发给你的后端服务器,也不算太大的负担。
: body部分……4096字节吧。我猜的。
: ...................
唔,其实之所以搞这么一套是因为后端服务器处理不了某些特定请求(因为后端没开发完,但我需要用这个接口先简单测试),
这东西是自己做着玩的w,所以大多数请求其实是需要转发的。
但现在看起来实现转发(应该叫正向代理)并不能随随便便就写出来,就算弄出来也违背了我希望足够简单的初衷,我果然还是太天真(其实是不会)。
想了想还是就实现普通的应用服务器就好了,判断和转发再架个nginx来做,让专业的来。
谢谢暖神!