BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #14686同步于 2016/6/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

[已解决]小白求助,有关http的问题

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