先日、Content-LengthとTransfer-Encoding: chunkedなんていう、
なんとも不親切なエントリを書きましたが、
その続編といいますか。IOExceptionでBad Chunk Sizeって言われて、
ちょっと困った事があったので、その備忘録的な。
■ 環境構築(今回はMacで)
– Tomcat
MacBookPro% sudo /opt/local/bin/port install tomcat6 Warning: port definitions are more than two weeks old, consider using selfupdate ---> Computing dependencies for tomcat6 〜略〜 # Configuration files in /opt/local/share/java/tomcat6/conf have been # installed with a .sample extension so that they won't be replaced by a # port update. Each will be copied to its proper location during the 〜略〜 # The script /opt/local/share/java/tomcat6/bin/tomcatctl has been installed to # facilitate start and stop of tomcat using the jsvc utility, which allows you to # start tomcat as a true daemon process. Once tomcat has acquired its TCP socket, 〜略〜 ---> Activating tomcat6 @6.0.30_0 ---> Cleaning tomcat6
とりあえず起動させてみます
% sudo /opt/local/share/java/tomcat6/bin/tomcatctl start Password: conf_setup.sh: file conf/catalina.policy is missing; copying conf/catalina.policy.sample to its place. conf_setup.sh: file conf/catalina.properties is missing; copying conf/catalina.properties.sample to its place. 〜略〜 conf_setup.sh: file conf/setenv.local is missing; copying conf/setenv.local.sample to its place. Starting Tomcat.... started. (pid 4640)
AJPは↓こんな感じ。
89 <!-- Define an AJP 1.3 Connector on port 8009 -->$ 90 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />$
– Apache
httpd.confをみたところソレっぽいのは既に入ってそう。
90 LoadModule proxy_module libexec/apache2/mod_proxy.so 91 LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so 92 LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so 93 LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so 94 LoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so 95 LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so
/etc/apache2/extraというところに追加のconfを書くしきたりに
なっているようなので、tomcat_ajp.confとかいう名前で以下のように設定。
<Location /ajp/> ProxyPass ajp://localhost:8009/ </Location>
extraの下のconfをインクルードするようにしてあげて
Include /private/etc/apache2/extra/*.conf
再起動〜
# Include /private/etc/apache2/extra/tomcat_ajp.conf
↓のように http://localhost/ajp/index.jsp でTomcatまで疎通しました。
■ HttpClientからアクセス
ソースはhttp://shinodogg.com/?p=3527のクライアント(Apache commons HTTPClient)を参照
2011/07/19 22:44:07:482 JST [DEBUG] header - ->> "GET /ajp/index.jsp HTTP/1.1[r][n]" 2011/07/19 22:44:07:483 JST [DEBUG] HttpMethodBase - -Adding Host request header 2011/07/19 22:44:07:492 JST [DEBUG] header - ->> "User-Agent: Jakarta Commons-HttpClient/3.0.1[r][n]" 2011/07/19 22:44:07:492 JST [DEBUG] header - ->> "Host: localhost[r][n]" 2011/07/19 22:44:07:492 JST [DEBUG] header - ->> "[r][n]" 2011/07/19 22:44:07:495 JST [DEBUG] header - -<< "HTTP/1.1 200 OK[r][n]" 2011/07/19 22:44:07:497 JST [DEBUG] header - -<< "Date: Tue, 19 Jul 2011 13:44:07 GMT[r][n]" 2011/07/19 22:44:07:497 JST [DEBUG] header - -<< "Content-Type: text/html[r][n]" 2011/07/19 22:44:07:497 JST [DEBUG] header - -<< "Transfer-Encoding: chunked[r][n]"
■ JSPでTransfer-Encoding
index.jspの先頭に以下のコードを入れてみます。
1 <%$ 2 response.addHeader("Transfer-Encoding", "chunked");$ 3 %>$
もっかい実行すると、、
2011/07/19 23:03:22:310 JST [DEBUG] header - ->> "GET /ajp/index.jsp HTTP/1.1[r][n]" 2011/07/19 23:03:22:311 JST [DEBUG] HttpMethodBase - -Adding Host request header 2011/07/19 23:03:22:320 JST [DEBUG] header - ->> "User-Agent: Jakarta Commons-HttpClient/3.0.1[r][n]" 2011/07/19 23:03:22:320 JST [DEBUG] header - ->> "Host: localhost[r][n]" 2011/07/19 23:03:22:320 JST [DEBUG] header - ->> "[r][n]" 2011/07/19 23:03:22:489 JST [DEBUG] header - -<< "HTTP/1.1 200 OK[r][n]" 2011/07/19 23:03:22:492 JST [DEBUG] header - -<< "Date: Tue, 19 Jul 2011 14:03:22 GMT[r][n]" 2011/07/19 23:03:22:492 JST [DEBUG] header - -<< "Transfer-Encoding: chunked[r][n]" 2011/07/19 23:03:22:492 JST [DEBUG] header - -<< "Content-Type: text/html[r][n]" status:200 Exception in thread "main" java.io.IOException: chunked stream ended unexpectedly at org.apache.commons.httpclient.ChunkedInputStream.getChunkSizeFromInputStream(ChunkedInputStream.java:251)
出ました。IOException。Bad Chunk Sizeじゃないけど、そんなような内容ですね。
■ ネットみてくと…
外国人のみなさんたちもソレ系の議論してたり、
https://issues.apache.org/bugzilla/show_bug.cgi?id=50275
mod_proxy_ajpのソースも↓こんな感じだったり
http://apache.wirebrain.de/lxr/source/modules/proxy/mod_proxy_ajp.c?v=2.2.8
179 /* read the first bloc of data */ 180 input_brigade = apr_brigade_create(p, r->connection->bucket_alloc); 181 tenc = apr_table_get(r->headers_in, "Transfer-Encoding"); 182 if (tenc && (strcasecmp(tenc, "chunked") == 0)) { 183 /* The AJP protocol does not want body data yet */ 184 ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, 185 "proxy: request is chunked");
■ まぁ、なんつーか
このヘッダだけでもないですが、AJPで繋いだ場合は、
Cookieとか以外のレスポンスヘッダはApacheにお任せするのがイイんすかね、と。
オライリージャパン
売り上げランキング: 64251
コメント