最近需要一个http服务中转一些数据,简单起见使用python搭建了个http数据读写服务
http_server.py
import os
import urllib
from http.server import HTTPServer, BaseHTTPRequestHandler
host = ('localhost', 10086) # 主机名和端口号
data_path = '/tmp/http_data' # 数据存储路径
if not os.path.exists(data_path):
os.mkdir(data_path)
class Request(BaseHTTPRequestHandler):
timeout = 5
server_version = "Apache" # 设置服务器返回的的响应头
def do_GET(self):
# 解析请求参数
parse = urllib.parse.urlparse(self.path)
path = parse.path
query = parse.query
query_dict = dict([(k, v[0]) for k, v in urllib.parse.parse_qs(query, True).items()])
# 过滤非法请求
illegal = False
if not query_dict:
illegal = True
for k, v in query_dict.items():
if '..' in k:
illegal = True
if k.startswith('/') or k.startswith('\\'):
illegal = True
if not os.path.abspath(os.path.join(data_path, k)).startswith(data_path):
illegal = True
if illegal:
self.send_error(403)
return
# 处理请求
data = {}
if path == '/r':
for k, v in query_dict.items():
loc_path = os.path.join(data_path, k)
if os.path.exists(loc_path):
with open(loc_path, 'r') as f:
data[k] = f.read()
else:
data[k] = ''
elif path == '/w':
for k, v in query_dict.items():
loc_path = os.path.join(data_path, k)
with open(loc_path, 'w') as f:
f.write(v)
else:
self.send_error(403)
return
# 返回结果
self.send_response(200)
self.send_header("Content-type", "json")
self.end_headers()
self.wfile.write(str(data).encode())
if __name__ == '__main__':
server = HTTPServer(host, Request)
print("Starting server, listen at: %s:%s" % host)
server.serve_forever()
启动命令:
python http_server.py
提交数据:
http://localhost:10086/w?k1=v1&k2=v2
读取数据:
http://localhost:10086/r?k1&k2