summaryrefslogtreecommitdiff
path: root/freebase-api/freebase/api/session.py
diff options
context:
space:
mode:
authoralex.boterolowry <alex.boterolowry@5914aa95-5b3a-0410-a3b5-7b719e7fe9b2>2008-06-13 18:47:48 +0000
committeralex.boterolowry <alex.boterolowry@5914aa95-5b3a-0410-a3b5-7b719e7fe9b2>2008-06-13 18:47:48 +0000
commitaad119a9686ec04abec7c639976dd4235d93ec56 (patch)
tree62de5f58c997e6a2c4de8ddf7785a2f1473e99c2 /freebase-api/freebase/api/session.py
parent8401b289fadd6d216c747d7e8721bd2f5ec38710 (diff)
Add support for Google AppEngine's urlfetch api
git-svn-id: http://freebase-python.googlecode.com/svn/trunk@41 5914aa95-5b3a-0410-a3b5-7b719e7fe9b2
Diffstat (limited to 'freebase-api/freebase/api/session.py')
-rw-r--r--freebase-api/freebase/api/session.py88
1 files changed, 26 insertions, 62 deletions
diff --git a/freebase-api/freebase/api/session.py b/freebase-api/freebase/api/session.py
index 6e3c422..73ae692 100644
--- a/freebase-api/freebase/api/session.py
+++ b/freebase-api/freebase/api/session.py
@@ -42,23 +42,38 @@ __all__ = ['MetawebError', 'MetawebSession', 'HTTPMetawebSession', 'attrdict']
__version__ = '0.1'
import os, sys, re
-import urllib2
import cookielib
-import simplejson
-from urllib import quote as urlquote
+try:
+ import simplejson
+except ImportError:
+ from django.utils import simplejson
+try:
+ from urllib import quote as urlquote
+except ImportError:
+ from urlib_stub import quote as urlquote
import pprint
import socket
import logging
+from httpclients import Httplib2Client, Urllib2Client, UrlfetchClient
+
+# Check for urlfetch first so that urlfetch is used when running the appengine SDK
try:
- import httplib2
- from httplib2cookie import CookiefulHttp
+ import google.appengine.api.urlfetch
+ from cookie_handlers import CookiefulUrlfetch
+ http_client = UrlfetchClient
except ImportError:
- httplib2 = None
- CookiefulHttp = None
- print ('freebase.api: you can install httplib2 for better performance')
+ try:
+ import httplib2
+ from cookie_handlers import CookiefulHttp
+ http_client = Httplib2Client
+ except ImportError:
+ import urllib2
+ httplib2 = None
+ CookiefulHttp = None
+ http_client = Urllib2Client
+ print ('freebase.api: you can install httplib2 for better performance')
-import simplejson.encoder
# remove whitespace from json encoded output
simplejson.JSONEncoder.item_separator = ','
simplejson.JSONEncoder.key_separator = ':'
@@ -124,7 +139,6 @@ NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
def _normalize_headers(headers):
return dict([ (key.lower(), NORMALIZE_SPACE.sub(value, ' ').strip()) for (key, value) in headers.iteritems()])
-
class HTTPMetawebSession(MetawebSession):
"""
a MetawebSession is a request/response queue.
@@ -169,11 +183,7 @@ class HTTPMetawebSession(MetawebSession):
else:
self.cookiejar = self._default_cookiejar
- if CookiefulHttp is not None:
- self.httpclient = CookiefulHttp(cookiejar=self.cookiejar)
- else:
- cookiespy = urllib2.HTTPCookieProcessor(self.cookiejar)
- self.opener = urllib2.build_opener(cookiespy)
+ self._http_request = http_client(self.cookiejar)
def open_cookie_file(self, cookiefile=None):
@@ -275,11 +285,7 @@ class HTTPMetawebSession(MetawebSession):
self.log.info('%s %s%s%s', method, url, formstr, headerstr)
#######
- if CookiefulHttp is not None:
- return self._httplib2_request(url, method, body, headers)
- else:
- return self._urllib2_request(url, method, body, headers)
-
+ return self._http_request(url, method, body, headers)
def _raise_service_error(self, url, status, ctype, body):
@@ -292,48 +298,6 @@ class HTTPMetawebSession(MetawebSession):
raise MetawebError, 'request failed: %s: %r %r' % (url, status, body)
- def _urllib2_request(self, url, method, body, headers):
- req = urllib2.Request(url, body, headers)
-
- try:
- resp = self.opener.open(req)
-
- except socket.error, e:
- self.log.error('SOCKET FAILURE: %s', e.fp.read())
- raise MetawebError, 'failed contacting %s: %s' % (url, str(e))
-
- except urllib2.HTTPError, e:
- _raise_service_error(url, e.code, e.info().type, e.fp.read())
-
- for header in resp.info().headers:
- self.log.debug('HTTP HEADER %s', header)
- name, value = re.split("[:\n\r]", header, 1)
- if name.lower() == 'x-metaweb-tid':
- self.tid = value.strip()
-
- return (resp, resp.read())
-
- def _httplib2_request(self, url, method, body, headers):
- try:
- resp, content = self.httpclient.request(url, method=method,
- body=body, headers=headers)
- if (resp.status != 200):
- self._raise_service_error(url, resp.status, resp['content-type'], content)
-
- except socket.error, e:
- self.log.error('SOCKET FAILURE: %s', e.fp.read())
- raise MetawebError, 'failed contacting %s: %s' % (url, str(e))
-
- except httplib2.HttpLib2ErrorWithResponse, e:
- self._raise_service_error(url, resp.status, resp['content-type'], content)
- except httplib2.HttpLib2Error, e:
- raise MetawebError(u'HTTP error: %s' % (e,))
-
- #tid = resp.get('x-metaweb-tid', None)
-
- return (resp, content)
-
-
def _httpreq_json(self, *args, **kws):
resp, body = self._httpreq(*args, **kws)
return self._loadjson(body)