[vine-users:081455] apache2 HTTP_PARTIAL_CONTENT
ARAI Shun-ichi
hermes @ ceres.dti.ne.jp
2011年 9月 23日 (金) 13:42:58 JST
あらいです。
先日、apache2 がアップデートされましたが、どうもその辺りから動作がお
かしいようです。
何かというと、VLC で URL 指定でアクセスしたとき、時間スライダーが使え
ないのです。というか、途中に飛ぼうとするととんでもない時間がかかります。
その間パケットが飛び続けているようです。
例によって私が変なことをしているからかとも思いましたが、調べてみると
そうでもないような気がしてきました。
まず、LogLevel を debug にしてみたら、こういうのが出ていました。
[Fri Sep 23 11:34:40 2011] [debug] byterange_filter.c(518): [client 192.168.0.3] Sum of ranges not smaller than file, ignoring.
そこで、httpd-2.2.14/modules/http/byterange_filter.c を見てみたところ、
sum_lengths のチェックがおかしいように思えたのです。
なお、ソースは、apache2-2.2.14-13vl5 のものです。
実際に飛んでいたリクエストを見ると、こうなっていました。
Range: bytes=0-\r\n
"0-" だと、start = 0, end = clength - 1 になり、sum_lengths は
clength と同じ、つまり全部になると思うのですが、このソースのチェックで
はそれを弾いています。
とりあえず、こうしたら問題なく使えるようになりました。
--- httpd-2.2.14/modules/http/byterange_filter.c.org 2011-09-23 12:28:46.822909007 +0900
+++ httpd-2.2.14/modules/http/byterange_filter.c 2011-09-23 12:20:38.363596958 +0900
@@ -514,7 +514,7 @@
/* If all ranges are unsatisfiable, we should return 416 */
return -1;
}
- if (sum_lengths >= clength) {
+ if (sum_lengths > clength) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
"Sum of ranges not smaller than file, ignoring.");
return 0;
ただ、このメッセージによると、"not smaller than file" のときにエラー
とするようになっているようです。つまり、メッセージとチェックの仕方はちゃ
んと整合性が取れています。
HTTP_PARTIAL_CONTENT の仕様の確認まではしていませんが、これはどちらが
正しいのでしょうか。
RFC 2616 14.35.1 では、こうなっています。
If the last-byte-pos value is absent, or if the value is greater than
or equal to the current length of the entity-body, last-byte-pos is
taken to be equal to one less than the current length of the entity-
body in bytes.
last-byte-pos が length - 1 ということは、サイズは length まで、と読
めるような気がするのですが。
vine-users メーリングリストの案内