This commit is contained in:
donovan
2008-05-17 19:57:48 -07:00
2 changed files with 58 additions and 36 deletions

View File

@@ -44,9 +44,7 @@ try:
def from_http_time(t, defaultdate=None): def from_http_time(t, defaultdate=None):
return int(DateTime.Parser.DateTimeFromString( return int(DateTime.Parser.DateTimeFromString(
t, defaultdate=defaultdate).gmticks()) t, defaultdate=defaultdate).gmticks())
except ImportError: except ImportError:
import calendar import calendar
parse_formats = (HTTP_TIME_FORMAT, # RFC 1123 parse_formats = (HTTP_TIME_FORMAT, # RFC 1123
'%A, %d-%b-%y %H:%M:%S GMT', # RFC 850 '%A, %d-%b-%y %H:%M:%S GMT', # RFC 850
@@ -453,7 +451,7 @@ class HttpSuite(object):
self.loader = loader self.loader = loader
self.fallback_content_type = fallback_content_type self.fallback_content_type = fallback_content_type
def request_(self, params): def request_(self, params, connection=None):
'''Make an http request to a url, for internal use mostly.''' '''Make an http request to a url, for internal use mostly.'''
params = _LocalParams(params, instance=self) params = _LocalParams(params, instance=self)
@@ -482,7 +480,7 @@ class HttpSuite(object):
else: else:
params.body = '' params.body = ''
params.response, params.response_body = self._get_response_body(params) params.response, params.response_body = self._get_response_body(params, connection)
response, body = params.response, params.response_body response, body = params.response, params.response_body
if self.loader is not None: if self.loader is not None:
@@ -501,8 +499,10 @@ class HttpSuite(object):
klass = status_to_error_map.get(response.status, ConnectionError) klass = status_to_error_map.get(response.status, ConnectionError)
raise klass(params) raise klass(params)
def _get_response_body(self, params): def _get_response_body(self, params, connection):
connection = connect(params.url, params.use_proxy) print "CONENCTO", connection
if connection is None:
connection = connect(params.url, params.use_proxy)
connection.request(params.method, params.path, params.body, connection.request(params.method, params.path, params.body,
params.headers) params.headers)
params.response = connection.getresponse() params.response = connection.getresponse()
@@ -512,30 +512,40 @@ class HttpSuite(object):
return params.response, params.response_body return params.response, params.response_body
def request(self, params): def request(self, params, connection=None):
return self.request_(params)[-1] return self.request_(params, connection=connection)[-1]
def head_(self, url, headers=None, use_proxy=False, ok=None, aux=None): def head_(
return self.request_(_Params(url, 'HEAD', headers=headers, self, url, headers=None, use_proxy=False,
loader=self.loader, dumper=self.dumper, ok=None, aux=None, connection=None):
use_proxy=use_proxy, ok=ok, aux=aux)) return self.request_(
_Params(
url, 'HEAD', headers=headers,
loader=self.loader, dumper=self.dumper,
use_proxy=use_proxy, ok=ok, aux=aux),
connection)
def head(self, *args, **kwargs): def head(self, *args, **kwargs):
return self.head_(*args, **kwargs)[-1] return self.head_(*args, **kwargs)[-1]
def get_(self, url, headers=None, use_proxy=False, ok=None, aux=None): def get_(
self, url, headers=None, use_proxy=False, ok=None,
aux=None, connection=None):
if headers is None: if headers is None:
headers = {} headers = {}
headers['accept'] = self.fallback_content_type+';q=1,*/*;q=0' headers['accept'] = self.fallback_content_type+';q=1,*/*;q=0'
return self.request_(_Params(url, 'GET', headers=headers, return self.request_(
loader=self.loader, dumper=self.dumper, _Params(
use_proxy=use_proxy, ok=ok, aux=aux)) url, 'GET', headers=headers,
loader=self.loader, dumper=self.dumper,
use_proxy=use_proxy, ok=ok, aux=aux),
connection)
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
return self.get_(*args, **kwargs)[-1] return self.get_(*args, **kwargs)[-1]
def put_(self, url, data, headers=None, content_type=None, ok=None, def put_(self, url, data, headers=None, content_type=None, ok=None,
aux=None): aux=None, connection=None):
if headers is None: if headers is None:
headers = {} headers = {}
if 'content-type' not in headers: if 'content-type' not in headers:
@@ -544,22 +554,29 @@ class HttpSuite(object):
else: else:
headers['content-type'] = content_type headers['content-type'] = content_type
headers['accept'] = headers['content-type']+';q=1,*/*;q=0' headers['accept'] = headers['content-type']+';q=1,*/*;q=0'
return self.request_(_Params(url, 'PUT', body=data, headers=headers, return self.request_(
loader=self.loader, dumper=self.dumper, _Params(
ok=ok, aux=aux)) url, 'PUT', body=data, headers=headers,
loader=self.loader, dumper=self.dumper,
ok=ok, aux=aux),
connection)
def put(self, *args, **kwargs): def put(self, *args, **kwargs):
return self.put_(*args, **kwargs)[-1] return self.put_(*args, **kwargs)[-1]
def delete_(self, url, ok=None, aux=None): def delete_(self, url, ok=None, aux=None, connection=None):
return self.request_(_Params(url, 'DELETE', loader=self.loader, return self.request_(
dumper=self.dumper, ok=ok, aux=aux)) _Params(
url, 'DELETE', loader=self.loader,
dumper=self.dumper, ok=ok, aux=aux),
connection)
def delete(self, *args, **kwargs): def delete(self, *args, **kwargs):
return self.delete_(*args, **kwargs)[-1] return self.delete_(*args, **kwargs)[-1]
def post_(self, url, data='', headers=None, content_type=None, ok=None, def post_(
aux=None): self, url, data='', headers=None, content_type=None,ok=None,
aux=None, connection=None):
if headers is None: if headers is None:
headers = {} headers = {}
if 'content-type' not in headers: if 'content-type' not in headers:
@@ -568,9 +585,12 @@ class HttpSuite(object):
else: else:
headers['content-type'] = content_type headers['content-type'] = content_type
headers['accept'] = headers['content-type']+';q=1,*/*;q=0' headers['accept'] = headers['content-type']+';q=1,*/*;q=0'
return self.request_(_Params(url, 'POST', body=data, return self.request_(
headers=headers, loader=self.loader, _Params(
dumper=self.dumper, ok=ok, aux=aux)) url, 'POST', body=data,
headers=headers, loader=self.loader,
dumper=self.dumper, ok=ok, aux=aux),
connection)
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
return self.post_(*args, **kwargs)[-1] return self.post_(*args, **kwargs)[-1]

View File

@@ -35,7 +35,7 @@ import BaseHTTPServer
from eventlet import api from eventlet import api
from eventlet.httpdate import format_date_time from eventlet.httpdate import format_date_time
from eventlet import pools from eventlet import coros
DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024 DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024
@@ -101,6 +101,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
return return
self.environ = self.get_environ() self.environ = self.get_environ()
self.application = self.server.app
try: try:
self.handle_one_response() self.handle_one_response()
except socket.error, e: except socket.error, e:
@@ -168,7 +169,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
return write return write
try: try:
result = self.server.app(self.environ, start_response) result = self.application(self.environ, start_response)
except Exception, e: except Exception, e:
exc = ''.join(traceback.format_exception(*sys.exc_info())) exc = ''.join(traceback.format_exception(*sys.exc_info()))
print exc print exc
@@ -275,7 +276,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
class Server(BaseHTTPServer.HTTPServer): class Server(BaseHTTPServer.HTTPServer):
def __init__(self, socket, address, app, log, environ=None, max_http_version=None): def __init__(self, socket, address, app, log=None, environ=None, max_http_version=None, protocol=HttpProtocol):
self.socket = socket self.socket = socket
self.address = address self.address = address
if log: if log:
@@ -284,7 +285,8 @@ class Server(BaseHTTPServer.HTTPServer):
self.log = sys.stderr self.log = sys.stderr
self.app = app self.app = app
self.environ = environ self.environ = environ
self.max_http_version = max_http_version self.max_http_version = max_http_version
self.protocol = protocol
def get_environ(self): def get_environ(self):
socket = self.socket socket = self.socket
@@ -301,7 +303,7 @@ class Server(BaseHTTPServer.HTTPServer):
return d return d
def process_request(self, (socket, address)): def process_request(self, (socket, address)):
proto = HttpProtocol(socket, address, self) proto = self.protocol(socket, address, self)
proto.handle() proto.handle()
def log_message(self, message): def log_message(self, message):
@@ -309,11 +311,11 @@ class Server(BaseHTTPServer.HTTPServer):
def server(sock, site, log=None, environ=None, max_size=None, max_http_version=DEFAULT_MAX_HTTP_VERSION): def server(sock, site, log=None, environ=None, max_size=None, max_http_version=DEFAULT_MAX_HTTP_VERSION, protocol=HttpProtocol):
serv = Server(sock, sock.getsockname(), site, log, environ=None, max_http_version=max_http_version) serv = Server(sock, sock.getsockname(), site, log, environ=None, max_http_version=max_http_version, protocol=protocol)
if max_size is None: if max_size is None:
max_size = DEFAULT_MAX_SIMULTANEOUS_REQUESTS max_size = DEFAULT_MAX_SIMULTANEOUS_REQUESTS
pool = pools.CoroutinePool(max_size=max_size) pool = coros.CoroutinePool(max_size=max_size)
try: try:
print "wsgi starting up on", sock.getsockname() print "wsgi starting up on", sock.getsockname()
while True: while True: