日別アーカイブ: 2024年2月21日

ESPのWiFiClientSecureでサーバから情報をもらう時サーバでContentsLength指定していないと面倒

ESP8266(ESP-WROOM-02)の内容。ESP-WROOM-32ではないのでがおおよそ同じと思う。

現象

ESP8266のWiFiClientSecureでサーバからデータを取得しようとした。本来レスポンスの本体(ペイロード本文)は”[0]“を期待していたが以下の下3行のようにレスポンスが期待していたものと違う形になっていた。

Connecting to https://hoge.co.jp/api/fuga
Connected to server
Server: nginx
Date: Wed, 21 Feb 2024 05:21:47 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close

3
[0]
0

理由

これはTransfer-Encoding: chunkedになっていてペイロード本文

データ1のバイト数\r\nデータ1\r\n0\r\n

というフォーマットになっているため。長いもの送る場合は

データ1のバイト数\r\nデータ1\r\nデータ2のバイト数\r\nデータ2\r\n…データxのバイト数\r\nデータx\r\n…0\r\n

となる。なおデータのバイト数は16 進数表記。

対処

その1

対処としてそういうものとして読み込んでもよいけど、マルチバイトの場合データ1,2の間でぶった切られるのでつなげるのとか面倒。

その2

可能ならサーバ側で送る際にTransfer-Encoding: chunkedじゃなくしたい。

今回はサーバ側はpythonのBaseHTTPRequestHandlerを使っているがレスポンスにContent-Lengthをつけてやれば自動でTransfer-Encoding: chunkedじゃなくなった。「とりあえず、Content-Lengthついてないからchunkedでおくとっくわ」という仕様だったっぽい。(明示的にヘッダー付けた場合に消えるかは未確認)

http1.1の仕様的にはTransfer-Encoding: chunkedの時にはContent-Length不要らしい。

ATTinyのArduinoIDE用パッケージダウンロード先の暫定対処

いつの日からかArduinoIDEで追加ボードマネージャーURLに入れていたAttiny用(プロジェクトの正式名称ATTinyCore?megatinycore?)のjsonがダウンロード先の証明書が切れてつながらなくなっていた。

Some indexes could not be updated. Get "https://drazzy.com/package_drazzy.com_index.json": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: : http://drazzy.com/package_drazzy.com_index.json

adafruitのgithubに以下の暫定対処先のURLダウンロード先がのっていたのでそちらに修正

https://web.archive.org/web/20230504110614/http://drazzy.com/package_drazzy.com_index.json

ArduinoIDEのprefarences->settingタブ->additional board manager urls

とりあえず暫定対処っぽいこと書いてあるけど、数か月前にfixされてそのままみたいなのでしばらくそのままかも