return response now

This commit is contained in:
Benoit Chesneau 2009-12-02 19:43:56 +01:00
parent 90e87c6f0d
commit 93097b74e6
4 changed files with 30 additions and 61 deletions

View File

@ -41,6 +41,9 @@ class HTTPRequest(object):
self.method = None self.method = None
self.path = None self.path = None
self.headers = {} self.headers = {}
self.response_status = None
self.response_headers = {}
self._version = 11
self.fp = socket.makefile("rw", self.CHUNK_SIZE) self.fp = socket.makefile("rw", self.CHUNK_SIZE)
@ -93,8 +96,6 @@ class HTTPRequest(object):
key = 'HTTP_' + key.replace('-', '_') key = 'HTTP_' + key.replace('-', '_')
if key not in ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'): if key not in ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'):
environ[key] = value environ[key] = value
print environ
return environ return environ
def read_headers(self): def read_headers(self):
@ -152,6 +153,16 @@ class HTTPRequest(object):
data.seek(0) data.seek(0)
return data, str(length) or "" return data, str(length) or ""
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.fp.write("%s\r\n\r\n" % "\r\n".join(resp_head))
def write(self, data): def write(self, data):
self.fp.write(data) self.fp.write(data)
@ -161,7 +172,7 @@ class HTTPRequest(object):
def first_line(self, line): def first_line(self, line):
method, path, version = line.split(" ") method, path, version = line.split(" ")
self.version = version self.version = version.strip()
self.method = method.upper() self.method = method.upper()
self.path = path self.path = path
@ -202,7 +213,6 @@ class FileInput(object):
self.close() self.close()
return s return s
def readline(self, size=None): def readline(self, size=None):
if self.fp is None or self.eof: if self.fp is None or self.eof:
return '' return ''

View File

@ -25,6 +25,7 @@ import sys
import time import time
from gunicorn.httprequest import HTTPRequest from gunicorn.httprequest import HTTPRequest
from gunicorn.httpresponse import HTTPResponse
from gunicorn import socketserver from gunicorn import socketserver
from gunicorn.util import NullHandler from gunicorn.util import NullHandler
@ -149,8 +150,12 @@ class HTTPServer(object):
def process_client(self, listener, conn, addr): def process_client(self, listener, conn, addr):
""" do nothing just echo message""" """ do nothing just echo message"""
req = HTTPRequest(conn, addr, listener.getsockname()) req = HTTPRequest(conn, addr, listener.getsockname())
environ = req.read() try:
req.write(str(environ)) result = self.app(req.read(), req.start_response)
response = HTTPResponse(req, result)
response.send()
except Exception, e:
print >>sys.stderr, str(e)
req.close() req.close()
def worker_loop(self, worker_pid, worker): def worker_loop(self, worker_pid, worker):

View File

@ -1,54 +0,0 @@
# -*- coding: utf-8 -*-
#
# Copyright 2008,2009 Benoit Chesneau <benoitc@e-engura.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at#
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import socket
class Socket(socket.socket):
def accept_nonblock(self):
self.setblocking(0)
return self.accept()
class TCPServer(Socket):
"""class for server-side TCP sockets.
This is wrapper around socket.socket class"""
def __init__(self, address, **opts):
self.address = address
self.backlog = opts.get('backlog', 1024)
self.timeout = opts.get('timeout', 300)
self.reuseaddr = opts.get('reuseaddr', True)
self.nodelay = opts.get('nodelay', True)
self.recbuf = opts.get('recbuf', 8192)
socket.socket.__init__(self, socket.AF_INET, socket.SOCK_STREAM)
if self.reuseaddr:
self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if self.nodelay:
self.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
if self.recbuf:
self.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF,
self.recbuf)
self.settimeout(self.timeout)
self.bind(address)
self.listen()
def listen(self):
super(TCPServer, self).listen(self.backlog)

10
test.py
View File

@ -1,5 +1,13 @@
from gunicorn.httpserver import HTTPServer from gunicorn.httpserver import HTTPServer
def simple_app(environ, start_response):
"""Simplest possible application object"""
status = '200 OK'
response_headers = [('Content-type','text/plain')]
start_response(status, response_headers)
return ['Hello world!\n']
if __name__ == '__main__': if __name__ == '__main__':
server = HTTPServer(None, 4) server = HTTPServer(simple_app, 4)
server.join() server.join()