Благодаря вашим ответам на мой последний вопрос я смог получить постоянные http-соединения, работающие с HTTP-сервером Python Simple. Сейчас я пытаюсь расширить его для работы с безопасными соединениями HTTP. Я создал самозаверяющие сертификаты и передаю их серверу http.server с помощью функции ssl.wrap_socket (). Остальной код такой же, как и для незащищенных соединений (которые работают нормально), но я получаю ошибку 501, в которой говорится, что «POST» не поддерживается. Тот же код клиента работает с безопасным подключением к Apache.
Ошибка:
127.0.0.1 - - [22 / Apr / 2019 16:54:24] код 501, сообщение Неподдерживаемый метод ('POST')
127.0.0.1 - - [22 / Apr / 2019 16:54:24] "POST / HTTP / 1.1" 501 -
код сервера:
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl
from io import BytesIO
import time
import datetime
import logging
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Connection", "keep-alive")
self.send_header("Content-Length", str(len('Hello, world!')))
self.wfile.write(b'Hello, world!')
def do_POST(self):
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
print("Received POST: " + body.decode())
curr_time = datetime.datetime.now()
data = ('{"msgid":"0x0002", "timestamp": "'+ str(curr_time) +'", "message":"Test https response from Python HTTP server"}').encode()
# Send the response
self.send_response(200)
self.send_header("Connection", "keep-alive")
self.send_header("Content-Length", str(len(data)))
self.end_headers()
response = BytesIO()
response.write(data)
self.wfile.write(response.getvalue())
print("Simple HTTP Server running...")
logging.basicConfig(level=logging.DEBUG)
httpd = HTTPServer(('', 8000), BaseHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket,
keyfile="/etc/ssl/private/http.key",
certfile='/etc/ssl/certs/http.crt',
server_side=True,
ssl_version=ssl.PROTOCOL_TLSv1)
httpd.serve_forever()