如何检查远程文件是不是存在于代理后面
Posted
技术标签:
【中文标题】如何检查远程文件是不是存在于代理后面【英文标题】:How to check if remote file exits behind a proxy如何检查远程文件是否存在于代理后面 【发布时间】:2011-11-15 13:41:45 【问题描述】:我编写连接到 Web 服务器的应用程序(我是他服务器的所有者)发送用户提供的信息,处理该信息并将结果发送回应用程序。处理结果所需的时间取决于用户请求(从几秒到几分钟)。
我使用无限循环来检查文件是否存在(可能有更智能的方法...可能我可以估计请求可能花费的最长时间并避免使用无限循环)
代码的重要部分如下所示
import time
import mechanize
br = mechanize.Browser()
br.set_handle_refresh(False)
proxy_values='http':'proxy:1234'
br.set_proxies(proxy_values)
While True:
try:
result=br.open('http://www.example.com/sample.txt').read()
break
except:
pass
time.sleep(10)
在代理之后,循环永远不会结束,但如果我为这样的事情更改代码,
time.sleep(200)
result=br.open('http://www.example.com/sample.txt').read()
即我等待足够的时间以确保在尝试读取文件之前创建文件,我确实得到了文件:-)
似乎如果 mechanize 每次都要求一个不退出的文件 mechanize 会再次询问我将没有文件...
我使用 Firefox 复制了相同的行为。我要求一个不存在的文件,然后创建该文件(记住我是服务器的所有者......)我无法获取该文件。 并且使用 mechanize 和 Firefox 我可以删除文件...
我认为问题与代理缓存有关,我认为我无法删除该缓存,但可能有一些方法可以告诉代理我需要重新检查文件是否存在......
还有其他解决此问题的建议吗?
【问题讨论】:
【参考方案1】:最简单的解决方案可能是添加一个(未使用的)GET 参数以避免缓存请求。
即:
i = 0
While True:
try:
result=br.open('http://www.example.com/sample.txt?r=%d' % i).read()
break
except:
i += 1
time.sleep(10)
Web 应用程序应忽略额外参数。
HTTP HEAD 可能是执行此操作的正确方法,请参阅 this question for a example。
【讨论】:
谢谢,您的解决方案就像一个魅力 :-) 我也会阅读您的链接。唯一的问题是我不明白为什么您的解决方案有效。我不明白你为什么分配“request = 0”(我删除了这一行,代码仍然有效)而且我不知道“?r=%d”参数的作用(似乎它让代理相信程序请求不同的文件,但没有真正向服务器请求不同的文件) @aloctavodia:我的意思是同一个变量,但写了不同的名称。现已修复。以上是关于如何检查远程文件是不是存在于代理后面的主要内容,如果未能解决你的问题,请参考以下文章
当远程但不是本地时,Socket.io 退回到 nginx 代理后面的轮询(websocket 给出 400)