HTTPS защищенные соединения с Python HTTP Simple Server - PullRequest
0 голосов
/ 22 апреля 2019

Благодаря вашим ответам на мой последний вопрос я смог получить постоянные 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...