Closed7

WebTransport aioquic examples を動かす

https://zenn.dev/yamayuski/scraps/bbb029e8d292af

前回 Chrome のサンプルを動作させてみたが、 --origin-to-force-quic-on=localhost:4433 このオプションをつけないと繋がらないのが厳しかったので、 aioquic 公式のサンプルを動かしてみる。

https://github.com/aiortc/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 サーバが正常に稼働している様子。

残念ながら aioquic の examples でも --origin-to-force-quic-on=localhost:4433 はまだ必須の模様。 Chrome 101 に期待...?

このスクラップは2ヶ月前にクローズされました
ログインするとコメントできます