Удаление заголовка (User-agent) из make_fetch_call при запросе от GAE

У меня есть приложение Google App Engine(GAE), и я использую Python 2.7. Это приложение получает запрос GET(ajax) от пользовательского портала (скажем, Chrome). После получения запроса я подготавливаю асинхронные соединения для запроса данных с нескольких веб-сайтов (скажем, X1, X2 и т. Д.) За пределами GAE, используя urlfetch.make_fetch_call() - запрос GET.

Это работало нормально для сайта X1, но не для X2. Началось исследование на локальном сервере разработки. После проверки я подозревал, что X2 проверяет тег {'User-Agent':'Python-urllib/2.7'} в заголовке. Это мое лучшее предположение, так как изменение этого поля на {'User-Agent': 'Mozilla/5.0'} возвращает желаемые результаты.

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

302 218ms 0kb Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 48.0.2564.103 Safari / 537.36 AppEngine-Google; (+ http://code.google.com/appengine; appid: s ~ xxx-etching-112014) module = версия по умолчанию = 1 107.178.194.96 - - [06 / Feb / 2016: 19: 57: 04 -0800] "GET / HTTP / 1.1" 302 383 " http://www.mywebbsite.com/" "Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 48.0.2564.103 Safari / 537.36 AppEngine -Google; (+ http://code.google.com/appengine; appid: s ~ xxx-etching-112014)" " 1.usedForIntercepting.appspot.com "ms = 218 cpu_ms = 224 cpm_usd = 0,000043 loading_request=1 app_engine_release=1.9.32 trace_id=fd7b7420e7f8c23371a5b0ea7e9651 instance=00c61b117ce5ebac2a2eba44f26a01d4f2

Это то, что я пытался

for portal in self.searchPortals:
        spoofHeader = {
                       'User-agent':'Mozilla/5.0----------------------',
                       'Host':portal.getURL(),
                       'Accept-Encoding': 'identity',
                       'Connection': 'close',
                       'Accept': 'application/json, text/plain, */*',
                       'Origin': 'http://www.mywebsite.com'

                       }
        logging.info(spoofHeader)
        rpc = urlfetch.create_rpc(deadline=5)
        rpc.callback = lambda: self.handleCallBack(rpc, portal)
        #urlfetch.make_fetch_call(rpc, portal.getSearchURL(searchKeyword), headers={'User-agent':'Mozilla/5.0'})
        urlfetch.make_fetch_call(rpc, url='http://1.usedforintercepting.appspot.com', headers=spoofHeader)
        rpcs.append(rpc)

for rpc in rpcs:
    rpc.wait()

Это то, что я получил.

2016-02-07 13: 01: 21.306 / 302 59ms 0kb Mozilla / 5.0 ---------------------- AppEngine-Google; (+ http://code.google.com/appengine; appid: s ~ xxx-etching-112014) module = версия по умолчанию = 1 107.178.194.20 - - [06 / Feb / 2016: 23: 31: 21 -0800] "GET / HTTP / 1.1" 302 383 - "Mozilla / 5.0 ---------------------- AppEngine-Google; (+ http://code.google.com/appengine; AppID: S ~ ххх-травление-112014)" "" 1.usedForIntercepting.appspot.com мс =59 cpu_ms=6 cpm_usd=0,000043 app_engine_release=1.9.32 trace_id=a4a1f521c5a6fa65ed0295835dd175 экземпляра = 00c61b117ce5ebac2a2eba44f26a01d4f2

То, что я хочу, это что-то вроде этого.

ПОЛУЧИТЕ http://somelink/search/abc HTTP / 1.1 Accept-Encoding: identity Хост: somelink.com Соединение: закрыть User-Agent: Mozilla/5.0

Я хочу удалить все заголовки формы, кроме User-Agent:Mozilla/5.0??

Примечание - для перехвата запроса, сделанного из GAE с использованием urlfetch, я использую другой экземпляр GAE.

1 ответ

Решение

В документации URL Fetch Python API Overview: запрашивать заголовки

Из соображений безопасности приложение не может изменять следующие заголовки:

  • Content-Length
  • хозяин
  • изменяться
  • С помощью
  • X-Appengine-Inbound-APPID
  • X-Forwarded-For
  • X-PROXYUSER-IP

Это также говорит:

Следующие заголовки указывают идентификатор приложения запрашивающего приложения:

User-Agent, Этот заголовок можно изменить, но App Engine добавит строку идентификатора, чтобы серверы могли идентифицировать запросы App Engine. Добавленная строка имеет формат "AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)", где APPID идентификатор вашего приложения.

Если вам нужны пользовательские заголовки, вам придется написать собственный код urlfetch или использовать внешний сервер, который выполняет вызов для вас с вашими заголовками.

Другие вопросы по тегам