最近在学习HTTP及HTTP server实现原理,于是用python谢了个 HTTP server 示例,用于HTTP测试用,在这里分享给大家。想要深入学习HTTP协议,推荐买一本《HTTP权威指南》
说明
Demo程序默认绑定8080端口,在有请求到来时打印出请求的HTTP报文。控制台阻塞,手动通过控制台输入原生的HTTP报文(包括响应行,相应Header,内容)并以":q"最为结束符。
示例中仅将原生的HTTP请求进行返回。响应中我们可以输入任何满足HTTP格式的内容,通过Header告诉客户端如何解析。
1. Code
import os
import sys
import socket
import datetime
class HTTPServer():
def __init__(self, port=8080):
print "HTTP server is initiating ..." + os.linesep
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind(("", port))
def startServer(self):
self.server_socket.listen(sys.maxint)
print("HTTP server is started ..." + os.linesep)
while True:
client_socket, client_address = self.server_socket.accept()
self.handle_client(client_socket, client_address)
def handle_client(self, client_socket, client_address):
request_data = client_socket.recv(2048)
print datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m-%d %H:%M:%S') + " : " + str(client_address) + " connected"
print("HTTP request:" + os.linesep+ "----------------------------------------")
print(request_data)
httpResponseStr = self.generateResponseStr()
print(os.linesep + "Sending response:" + os.linesep+ "----------------------------------------")
print(httpResponseStr)
client_socket.send(httpResponseStr)
client_socket.close()
def generateResponseStr(self):
print "Please input the response string with HTTP format(:q to exit)"
responseStr = ""
while True:
line = raw_input()
if line.__eq__(":q"):
break
responseStr = responseStr + line + os.linesep
return responseStr
def main():
http_server = HTTPServer(port=8080)
http_server.startServer()
main()
Demo
通过Postman发送HTTP请求(GET/POST/TRACE/HEAD/PUT/OPTIONS/…)
服务器收到请求后等待输入相应:
客户端收到并显示响应