WebTransport aioquic examples を動かす
前回 Chrome のサンプルを動作させてみたが、 --origin-to-force-quic-on=localhost:4433
このオプションをつけないと繋がらないのが厳しかったので、 aioquic 公式のサンプルを動かしてみる。
WSL2 で UDP サーバが動かない問題があるので、 Windows でサーバを起動させる必要がある。
scoop install python
pip install aioquic asgiref dnslib httpbin starlette wsproto
で依存関係を全てインストール
\path\to\aioquic > python .\examples\http3_server.py --certificate .\tests\ssl_cert.pem --private-key .\tests\ssl_key.pem
Traceback (most recent call last):
File "C:\Users\akai_\Downloads\aioquic\examples\http3_server.py", line 542, in <module>
module = importlib.import_module(module_str)
File "C:\Users\akai_\scoop\apps\python\current\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "C:\Users\akai_\Downloads\aioquic\examples\demo.py", line 9, in <module>
import httpbin
File "C:\Users\akai_\scoop\apps\python\current\lib\site-packages\httpbin\__init__.py", line 3, in
<module>
from .core import *
File "C:\Users\akai_\scoop\apps\python\current\lib\site-packages\httpbin\core.py", line 22, in <module>
from werkzeug.wrappers import BaseResponse
ImportError: cannot import name 'BaseResponse' from 'werkzeug.wrappers' (C:\Users\akai_\scoop\apps\python\current\lib\site-packages\werkzeug\wrappers\__init__.py)
起動しようとするとこのエラーが出る。見た所、 werkzeug というライブラリの最新バージョンを使うと出るらしい。
> pip install werkzeug==0.16.1
これで古いバージョンを入れれる。再度 python を叩くとちゃんと起動する。
/path/to/aioquic > python .\examples\http3_server.py --certificate .\tests\ssl_cersts\ssl_cert.pem --private-key .\tests\ssl_key.pem
C:\Users\akai_\Downloads\aioquic\examples\http3_server.py:572: DeprecationWarning: There is no current event loop
loop = asyncio.get_event_loop()
DeprecationWarning が出ていますが、とりあえず起動しました。
netstat -an
...
UDP [::]:4433 *:*
...
UDP 4433 ポートをリッスンしているのが HTTP/3 サーバです。
python .\examples\http3_client.py --ca-certs .\tests\pycacert.pem https://localhost:4433/
C:\Users\akai_\Downloads\aioquic\examples\http3_client.py:528: DeprecationWarning: There
is no current event loop
loop = asyncio.get_event_loop()
2022-04-20 21:13:32,500 INFO quic [e6f6a746c272f694] ALPN negotiated protocol h3
2022-04-20 21:13:32,500 INFO client New session ticket received
2022-04-20 21:13:32,523 INFO client Response received for GET / : 1276 bytes in 0.0 s (0.464 Mbps)
2022-04-20 21:13:32,524 INFO client Push received for GET /style.css : 0 bytes
2022-04-20 21:13:32,524 INFO quic [e6f6a746c272f694] Connection close sent (code 0x100, reason )
クライアントから接続できるのも確認。
この状態で Google Chrome からもアクセスしたいですが、 ERR_CONNECTION_REFUSED
を返されます。これは自己署名証明書が Chrome に認識されていないためと思われます。
Windows ショートカットで chrome を選択し、「リンク先」を下記に変更。
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --origin-to-force-quic-on=localhost:4433 --ignore-certificate-errors-spki-list=BSQJ0jkQ7wwhR7KvPZ+DSNk2XTZ/MS6xCbo9qu++VdQ= https://localhost:4433
自己署名証明書の verify を ignore するため、この警告が出ます。そのままページが表示出来れば HTTP/3 サーバが正常に稼働している様子。
ここで https://localhost:4433/wt
に接続できるようにもなっているはず。
残念ながら aioquic の examples でも --origin-to-force-quic-on=localhost:4433
はまだ必須の模様。 Chrome 101 に期待...?
現時点(2023/02/25)での最新版であるChrome 112でも--origin-to-force-quic-on=localhost:4433
は必須なようです