从GAE请求时从make_fetch_call中删除标头(用户代理)

时间:2016-02-07 07:43:19

标签: google-app-engine http-headers urlfetch google-app-engine-python

我有Google App Engine(GAE)的应用程序,我正在使用Python 2.7。此应用程序从用户门户(例如Chrome)接收GET(ajax)请求。收到请求后,我准备异步连接,使用urlfetch.make_fetch_call() - GET请求从GAE之外的多个网站(比如X1,X2等)请求数据。

这适用于X1网站,但不适用于X2。 开始在本地开发服务器上进行探测。在探测时我怀疑X2正在检查{' User-Agent':#py; 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 = default version = 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 = default version = 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~xxx-etching-112014)" " 1.usedForIntercepting.appspot.com" ms = 59 cpu_ms = 6 cpm_usd = 0.000043 app_engine_release = 1.9.32 trace_id = a4a1f521c5a6fa65ed0295835dd175 instance = 00c61b117ce5ebac2a2eba44f26a01d4f2

我想要的是这样的。

获取http://somelink/search/abc HTTP / 1.1 Accept-Encoding:身份 主持人:somelink.com 连接:关闭 用户代理:Mozilla / 5.0

我想删除User-Agent以外的所有表头:Mozilla / 5.0 ??

注意 - 为了拦截使用urlfetch从GAE做出的请求,我正在使用另一个GAE实例。

1 个答案:

答案 0 :(得分:3)

在文档URL Fetch Python API Overview: Request Headers中,它说

  

出于安全原因,应用程序无法修改以下标头:

     
      
  • 的Content-Length
  •   
  • 主机
  •   
  • 因人而异
  •   
  •   
  • X-的AppEngine-入站-APPID
  •   
  • X - 转发,对于
  •   
  • X-PROXYUSER-IP
  •   

它还说:

  

以下标题表示请求应用的应用ID:

     

User-Agent。可以修改此标头,但App Engine将附加标识符字符串以允许服务器识别App Engine请求。附加的字符串格式为"AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)",其中APPID是您应用的标识符。

如果您想要自定义标题,则必须编写自己的urlfetch代码或使用外部服务器来为您调用标题。