如何检查远程文件是不是存在于代理后面

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)

Android 使用其 URL 检查文件是不是存在于远程服务器中

Win XP 中命令行实用程序的代理

代理模式

在 Anylogic 中检查墙壁是不是存在

创建集群后如何检查是不是启用了反向代理