Home » appengine中urlfetch的406

按照google官方的说法(http://code.google.com/appengine/docs/python/urlfetch/fetchfunction.html#Disallowed_HTTP_Headers)是urlfetch关掉了一些http header: Content-Length Host Referer User-Agent Vary Via X-Forwarded-For
但是在添加Accept-Encoding: zip处理压缩的请求时,会拿到406.究其原因,就是dev appserver中google.appengine.api.urlfetch不仅禁掉了上面那些header、连accept-encoding也一并禁掉了,而在appengine上面这是透明处理的。但是那个dev appserver却没有透明的处理zip的页面。所以dev appserver的并没有完全实现appengine。解决这个问题也不难,dev appserver不支持,那我们就自己做一个支持zip的urlfetch的实现就ok了。 使用的时候如下: ………………………….. if (os.environ['SERVER_SOFTWARE']).find(‘Development’) == -1: #in the appengine box from google.appengine.api import urlfetch else: from common import urlfetch …………………….
这个urlfetch.py:
class Respon(object): content = None status_code = “” headers = {} def fetch(url,headers ={‘Accept-Encoding’:'gzip’}): import urllib2, httplib import os,sys import StringIO sys.path.insert(0,os.environ['PROJECT_ROOT']) request = urllib2.Request(”) respon = Respon() request = urllib2.Request(url) for k,v in headers.iteritems(): request.add_header( k , v) opener = urllib2.build_opener() f = opener.open(request) data= f.read() if (f.headers.get(‘Content-Encoding’,”)).find(‘zip’) == 1 : #zipped import gzip,StringIO compressedstream = StringIO.StringIO(data) gzipper = gzip.GzipFile(fileobj=compressedstream) data = gzipper.read() respon.content = data respon.status_code = str(f.code) respon.headers = dict(f.headers) return respon
这样算是在dev appserver上面透明的处理了zip的页面,而在appengine上面也很好的work。

Leave a Reply




=>