はじめに
MH ソフトウェア & サービスが開発・公開している、Webアプリケーションサーバ AiRの便利かな?と思われるコードの紹介です。
Webアプリケーションサーバ AiRはPython、Tornado(Webフレームワーク、Webサーバ)、JavaScript、その他のモジュールで構成されています。
TornadoはSSL(https)で起動できます。
Let's Encryptの例では、RAS秘密鍵が private.key に、fullchain.pem が certificate.crt になります。
private.keyとcertificate.crtをデータフォルダに作成します。
SSL(https)用のファイルが存在するか確認し、存在すればTrueとSSLContextを返します。
def _check_ssl() -> tuple[bool, Union[ssl.SSLContext, None]]:
"""SSL Check.
:sig: () -> tuple(bool, ssl.SSLContext)
"""
crt_files = glob.glob("./*.crt")
key_files = glob.glob("./*.key")
ssl_ctx: Union[ssl.SSLContext, None] = None
result = False
if (len(crt_files) > 0) & (len(key_files) > 0):
ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
# NOTE: If ssl_ctx.load_cert_chain ahs error, crt or key is wrong format.
try:
ssl_ctx.load_cert_chain(crt_files[0], key_files[0])
result = True
except ssl.SSLError:
print("crt or key file is wrong format.\n")
result = False
return (result, ssl_ctx)
その戻り値を使って、_http_serverからtornado.httpserver.HTTPServerとportを取得して、http_serverを起動します。
ssl_enabled, ssl_ctx = _check_ssl()
hat = Hat(system_name, __version__, tornado.options.options)
http_server, port = _http_server(ssl_enabled, hat, ssl_ctx)
try:
http_server.listen(port)
except OSError:
_alert_message()
http_server.listen(81)
hatは特別なクラスです。
def _http_server(
ssl_enabled: bool, hat_: Hat, ssl_ctx: Union[ssl.SSLContext, None],
) -> tuple[tornado.httpserver.HTTPServer, int]:
"""Retrun http sever.
# pylint: disable=line-too-long
:sig: (bool, Hat, Union[ssl.SSLContext, None]) -> tuple[tornado.httpserver.HTTPServer, int]
"""
result: tornado.httpserver.HTTPServer
if ssl_enabled:
result = tornado.httpserver.HTTPServer(
Application(hat_),
ssl_options=ssl_ctx,
)
# これはhttpsサーバのポート番号です
port = 443
else:
result = tornado.httpserver.HTTPServer(
Application(hat_),
decompress_request=True,
)
# これはhttpサーバのポート番号です
port = 80
return (result, port)