mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
better response
This commit is contained in:
parent
f1cb61564e
commit
7fccf32c06
@ -15,7 +15,6 @@
|
|||||||
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import StringIO
|
import StringIO
|
||||||
import sys
|
import sys
|
||||||
@ -23,11 +22,12 @@ from urllib import unquote
|
|||||||
|
|
||||||
from gunicorn import __version__
|
from gunicorn import __version__
|
||||||
from gunicorn.http.iostream import IOStream
|
from gunicorn.http.iostream import IOStream
|
||||||
|
from gunicorn.util import http_date
|
||||||
|
|
||||||
NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
|
NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
|
||||||
|
|
||||||
def _normalize_name(name):
|
def _normalize_name(name):
|
||||||
return ["-".join([w.capitalize() for w in name.split("-")])]
|
return "-".join([w.lower().capitalize() for w in name.split("-")])
|
||||||
|
|
||||||
class RequestError(Exception):
|
class RequestError(Exception):
|
||||||
|
|
||||||
@ -55,12 +55,9 @@ class HTTPRequest(object):
|
|||||||
self.io = IOStream(socket)
|
self.io = IOStream(socket)
|
||||||
self.start_response_called = False
|
self.start_response_called = False
|
||||||
|
|
||||||
|
|
||||||
def read(self):
|
def read(self):
|
||||||
|
|
||||||
# read headers
|
# read headers
|
||||||
self.read_headers(first_line=True)
|
self.read_headers(first_line=True)
|
||||||
|
|
||||||
if "?" in self.path:
|
if "?" in self.path:
|
||||||
path_info, query = self.path.split('?', 1)
|
path_info, query = self.path.split('?', 1)
|
||||||
else:
|
else:
|
||||||
@ -74,7 +71,8 @@ class HTTPRequest(object):
|
|||||||
length, wsgi_input = self.decode_chunked()
|
length, wsgi_input = self.decode_chunked()
|
||||||
else:
|
else:
|
||||||
wsgi_input = FileInput(self)
|
wsgi_input = FileInput(self)
|
||||||
|
|
||||||
|
|
||||||
environ = {
|
environ = {
|
||||||
"wsgi.url_scheme": 'http',
|
"wsgi.url_scheme": 'http',
|
||||||
"wsgi.input": wsgi_input,
|
"wsgi.input": wsgi_input,
|
||||||
@ -158,20 +156,26 @@ class HTTPRequest(object):
|
|||||||
|
|
||||||
# Grab any trailer headers
|
# Grab any trailer headers
|
||||||
self.read_headers()
|
self.read_headers()
|
||||||
|
|
||||||
data.seek(0)
|
data.seek(0)
|
||||||
return data, str(length) or ""
|
return data, str(length) or ""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def start_response(self, status, response_headers):
|
def start_response(self, status, response_headers):
|
||||||
resp_head = []
|
|
||||||
self.response_status = status
|
|
||||||
self.response_headers = {}
|
|
||||||
resp_head.append("%s %s" % (self.version, status))
|
|
||||||
for name, value in response_headers:
|
|
||||||
resp_head.append("%s: %s" % (name, value))
|
|
||||||
self.response_headers[name.lower()] = value
|
|
||||||
self.io.send("%s\r\n\r\n" % "\r\n".join(resp_head))
|
|
||||||
self.start_response_called = True
|
self.start_response_called = True
|
||||||
|
resp_head = []
|
||||||
|
self.response_status = int(status.split(" ")[0])
|
||||||
|
self.response_headers = {}
|
||||||
|
resp_head.append("%s %ss\r\n" % (self.version, status))
|
||||||
|
|
||||||
|
resp_head.append("Server: %s\r\n" % self.SERVER_VERSION)
|
||||||
|
resp_head.append("Date: %s\r\n" % http_date())
|
||||||
|
# broken clients
|
||||||
|
resp_head.append("Status: %s\r\n" % str(self.response_status))
|
||||||
|
for name, value in response_headers:
|
||||||
|
resp_head.append("%s: %s\r\n" % (_normalize_name(name), value.strip()))
|
||||||
|
self.response_headers[name.lower()] = value
|
||||||
|
self.io.send("%s\r\n" % "".join(resp_head))
|
||||||
|
|
||||||
def write(self, data):
|
def write(self, data):
|
||||||
self.io.write(send)
|
self.io.write(send)
|
||||||
@ -192,8 +196,6 @@ class HTTPRequest(object):
|
|||||||
self.headers[name] = value.strip()
|
self.headers[name] = value.strip()
|
||||||
return name
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class FileInput(object):
|
class FileInput(object):
|
||||||
|
|
||||||
stream_size = 4096
|
stream_size = 4096
|
||||||
@ -221,6 +223,7 @@ class FileInput(object):
|
|||||||
return s
|
return s
|
||||||
|
|
||||||
def readline(self, amt=-1):
|
def readline(self, amt=-1):
|
||||||
|
print "ici"
|
||||||
i = self._rbuf.find('\n')
|
i = self._rbuf.find('\n')
|
||||||
while i < 0 and not (0 < amt <= len(self._rbuf)):
|
while i < 0 and not (0 < amt <= len(self._rbuf)):
|
||||||
new = self.io.recv(self.stream_size)
|
new = self.io.recv(self.stream_size)
|
||||||
|
|||||||
@ -29,6 +29,9 @@ class HTTPResponse(object):
|
|||||||
self.io.send(data)
|
self.io.send(data)
|
||||||
|
|
||||||
def send(self):
|
def send(self):
|
||||||
if not self.data: return
|
if self.req.method == "HEAD":
|
||||||
|
return
|
||||||
for chunk in self.data:
|
for chunk in self.data:
|
||||||
self.write(chunk)
|
self.write(chunk)
|
||||||
|
self.data.close()
|
||||||
|
|
||||||
@ -15,6 +15,14 @@
|
|||||||
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
|
weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
||||||
|
|
||||||
|
monthname = [None,
|
||||||
|
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
||||||
|
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
||||||
|
|
||||||
def import_app(module):
|
def import_app(module):
|
||||||
parts = module.rsplit(":", 1)
|
parts = module.rsplit(":", 1)
|
||||||
if len(parts) == 1:
|
if len(parts) == 1:
|
||||||
@ -33,4 +41,15 @@ def import_app(module):
|
|||||||
if not callable(app):
|
if not callable(app):
|
||||||
raise TypeError("Application object must be callable.")
|
raise TypeError("Application object must be callable.")
|
||||||
return app
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
def http_date(timestamp=None):
|
||||||
|
"""Return the current date and time formatted for a message header."""
|
||||||
|
if timestamp is None:
|
||||||
|
timestamp = time.time()
|
||||||
|
year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp)
|
||||||
|
s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (
|
||||||
|
weekdayname[wd],
|
||||||
|
day, monthname[month], year,
|
||||||
|
hh, mm, ss)
|
||||||
|
return s
|
||||||
Loading…
x
Reference in New Issue
Block a user