Как проверить, находится ли удаленный файл за прокси - PullRequest
0 голосов
/ 12 сентября 2011

Я пишу приложение, которое подключается к веб-серверу (я владелец сервера), отправляет информацию, предоставленную пользователем, обрабатывает эту информацию и отправляет результат обратно в приложение. Время, необходимое для обработки результатов, зависит от запроса пользователя (от нескольких секунд до нескольких минут).

Я использую бесконечный цикл, чтобы проверить, существует ли файл (может быть, есть более разумный подход ... может быть, я мог бы оценить максимальное время, которое может занять запрос, и избежать его использования, и бесконечный цикл)

важная часть кода выглядит следующим образом

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 я могу получить удаленные файлы ...

Я думаю, что проблема связана с кешем Proxy, я думаю, что не могу удалить этот кеш, но может быть есть какой-то способ сказать прокси, что мне нужно перепроверить, если файл существует ...

Есть еще какие-нибудь предложения по решению этой проблемы?

1 Ответ

2 голосов
/ 12 сентября 2011

Самое простое решение - добавить (неиспользуемый) параметр 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)

Дополнительный параметр должен игнорироваться веб-приложением.

HTTP HEAD, вероятно, является правильным способом сделать это, см. этот вопрос для примера .

...