Gauche > Archives > 2020/02/13

2020/02/13 16:18:05 UTCkaki
#
httpよく分からなくて恐縮なんですが、rfc.httpで、あるサイトに同じhttp-connectionオブジェクトを使って100回http-getすると SYSTEM-ERROR: ssl_read() failed: Undefined error: 0 っていう変なエラーが上がってきます。keep alive的な上限ならそういうhttp-errorか何かが上がってほしいんですが、何かおかしなことしてますでしょうか?
#
*** SYSTEM-ERROR: ssl_read() failed: Undefined error: 0
Stack Trace:
_______________________________________
  0  (read-line remote)
        at "/usr/local/share/gauche-0.97/0.9.9_rc2/lib/rfc/http.scm":825
  1  (parse-status-line (read-line remote))
        at "/usr/local/share/gauche-0.97/0.9.9_rc2/lib/rfc/http.scm":825
  2  (receive-header in)
        at "/usr/local/share/gauche-0.97/0.9.9_rc2/lib/rfc/http.scm":278
  3  (with-connection conn (^ (i o) (request-response i o method u ...
        at "/usr/local/share/gauche-0.97/0.9.9_rc2/lib/rfc/http.scm":305
2020/02/13 17:13:10 UTCkaki
#
101回な気がしてきました。尚、最初のレスポンスヘッダにkeep-alive: timeout~ max~みたいなのはありませんでした。
2020/02/13 17:23:31 UTCshiro
#
いや特にそういう制限は無かった気がするんで内部的になにかリークしててリソースくいつぶしちゃったとかがありそう
2020/02/13 19:24:28 UTCshiro
#
あ、ssl_read()は失敗してもerrnoセットしないからSYSTEM-ERRORを投げてるのがおかしいな。
#
diff --git a/ext/tls/tls.c b/ext/tls/tls.c
index eae859a..3a40ed5 100644
--- a/ext/tls/tls.c
+++ b/ext/tls/tls.c
@@ -339,7 +339,7 @@ static ScmObj ax_read(ScmTLS* tls)
     ax_close_check(t, "read");
     int r; uint8_t* buf;
     while ((r = ssl_read(t->conn, &buf)) == SSL_OK);
-    if (r < 0) Scm_SysError("ssl_read() failed");
+    if (r < 0) Scm_Error("ssl_read() failed: %d", r);
     return Scm_MakeString((char*) buf, r, r, SCM_STRING_INCOMPLETE);
 }
#
とりあえずこれでエラーコード調べてみてください。コードの中身は ext/tls/axTLS/ssl/ssl.h niarimasu