jettyでテスト用簡易サーバ 

微妙にはまったのでメモ
すげー頭の悪いはまり方だったから、自戒の意味もこめて・・・orz

まずは結論を簡単に
・jettyの8はservlet3、7は2.5だ。バージョンの違いに注意。
・7.3.1⇒7.6.1のどこかで、HttpConnectionが
 AsyncHttpConnectionとBlockingHttpConnectionに分かれた。
 そりゃ、HttpConnectionが解決できません、って怒られるわ・・・。
 
以下経緯。

JUnitでWebサービスのモックを作る
これを参考にして、簡易サーバを立てようとしたわけだ

なるほど、最新版は8.1.1か・・・とりあえずこれでいいか、とダウンロードして
ビルドパスに追加。

で、↑のソースをほぼコピペして、とりあえず動かしてみて
一週間くらいまえにHttpClient4でmixiにつないでみたで触ったHttpClientで
つないでみた・・・が、AsyncContextがみつからねぇぞ、と怒られてしまう。
ここみると、Servletのバージョンのせいらしい。なるほど確かに、jettyのDLページを見ると、8ってServlet3じゃないですか
今作ってるもので使ってるのって、2.5じゃないですか。8じゃだめじゃないですか。

ってことで、7の最新、7.6.1をDLして、ビルドパス修正、再実行。

おぉ、繋がった。が、Responseに設定した値が取れない。
↓のようにコメントアウトしてる部分か・・・。

    private static class RequestHandlerImpl extends AbstractHandler {

        @Override
        public void handle(String target, Request baseRequest,
                HttpServletRequest request, HttpServletResponse response)
                throws IOException, ServletException {
            
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json");
            response.setStatus(HttpServletResponse.SC_OK);
            
            Writer writer = response.getWriter();
            writer.write(TEST_RESULT);
            
            // HttpConnectionが解決できないのでとりあえずコメントアウト
            //HttpConnection connection =
            //    HttpConnection.getCurrentConnection();
            //Request req = connection.getRequest();
            //req.setHandled(true);
        }
    }

参考にしたブログは7.3.1、使おうとしてるのは7.6.1
いくらバージョンが違うとはいえ7.X.Xなのに・・・と思って、7.6.1のjavadoc見てたら
あったよ、↓の三つが・・・!
AbstructHttpConnection
AsyncHttpConnection
BlockingHttpConnection

なるほど、HttpConnectionが非同期通信のために二つに分かれたのか・・・。
というわけで、早速修正。

    private static class RequestHandlerImpl extends AbstractHandler {

        @Override
        public void handle(String target, Request baseRequest,
                HttpServletRequest request, HttpServletResponse response)
                throws IOException, ServletException {
            
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json");
            response.setStatus(HttpServletResponse.SC_OK);
            
            Writer writer = response.getWriter();
            writer.write(TEST_RESULT);
            
            AbstructHttpConnection connection =
                BlockingHttpConnection.getCurrentConnection();
            Request req = connection.getRequest();
            req.setHandled(true);
        }
    }

めでたく、レスポンスに設定した値も取れるようになりましたとさ。

参考にしたブログの記事は1年も立ってないのに、変わってしまうもんだねぇ・・・。