您的位置:首页 > 编程语言 > Python开发

simple dynamic web server with self defined framework (python)

2017-10-05 23:09 561 查看
The framework

import time
from test1 import HTTPServer

class Applicatoin(object):
def __init__(self,urls):
self.urls = urls

def __call__(self, evn, start_response):
path = evn.get("PATH_INFO")
print('original pathinfo %s'%path)
for url,handler in self.urls:
if path == url:
print('----------%s--------'%path)
return handler(evn,start_response)
status = '404 not found'
headers = []
start_response(status,headers)
print('-----%s  not found'%path)
return '404 not found'

def show_ctime(evn,start_response):
status = '200 Ok'
headers = [
('Content-Type','text/plain')
]
start_response(status,headers)
return time.ctime()

def say_hello(env,start_response):

status = '200 Ok'
headers = [
('Content-Type','text/plain')
]
start_response(status,headers)
return 'hello'

urls = [
('/',show_ctime),
('/ctime',show_ctime),
('/sayhello',say_hello)
]
if __name__ == '__main__':
app = Applicatoin(urls)
http_server = HTTPServer(app)
http_server.bind(8000)
http_server.start()


The server

from socket import *
import re
from multiprocessing import Process

class HTTPServer(object):
def __init__(self,app):
self.sSocket = socket(AF_INET,SOCK_STREAM)
self.app = app
self.sSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

def start(self):
self.sSocket.listen()
while True:
client_socket,client_add = self.sSocket.accept()
print('---%s %s---connect--'%(client_add))
handle_client_process = Process(target=self.handle_client,args=(client_socket,))
handle_client_process.start()
client_socket.close()

def start_response(self,status,headers):
response_headers = 'HTTP/1.1 '+status+"\r\n"
for header in headers:
response_headers+='%s %s\r\n'%header

self.response_headers = response_headers

def handle_client(self,client_socket):
request_data = client_socket.recv(1024)
print('request data is'%request_data)
requst_lines = request_data.splitlines()
for line in requst_lines:
print(line)

requst_start_line = requst_lines[0]
print('*'*10)
print(requst_start_line.decode('utf-8'))
file_name = re.match(r'\w+ +(/[^ ]*)',requst_start_line.decode('utf-8')).group(1)
method = re.match(r'(\w)+ +/[^ ]*',requst_start_line.decode('utf-8')).group(1)
print('filename = %s'%file_name)
env = {
'PATH_INFO':file_name,
'METHOD':method
}
response_body = self.app(env,self.start_response)
print('respnse body %s'%response_body)
response = self.response_headers + '\r\n'+response_body
print('response = %s'%response)
client_socket.send(bytes(response,'utf-8'))
client_socket.close()

def bind(self,port):
self.sSocket.bind(('',port))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: