-l
で起動できる超簡易HTTPモードの概要。
処理の中身は src/main/groovy/ui/Groovy(Main|SocketServer).java にある。
- localhost のルートで待つ。デフォルトのポートは 1960。
- -n/-p 同様リクエスト一行毎に指定したスクリプトを実行。
- ファイルを指定した場合は接続毎にコンパイルし直す。つまり起動したままで変更が反映される。
- 以下のプロパティを設定。
- init 一行目の処理時のみ true で以降は false
- line リクエストの各行が格納される
- socket ソケット
- out ソケットの出力ストリーム
- Object#(print|println) は out に書き込むのと同じ。こちら側のコンソールに出力したい場合は System.(out|err)へ。
- -p 時はスクリプトの返値も out に書き込む。
- 'success' という文字列を返すと out と socket を閉じて接続終了。これはfinallyでどのみち実行されるため,スクリプト側で勝手に閉じると例外が飛ぶ。
以上を踏まえ,リクエストのヘッダのみを送り返すサーバは
> groovy -l -p -e "line?:'success'"
だけで起動できる。localhost:1960 に繋いで確認。
入力の終わりが分からないので,ボディ部分も表示したい場合はContent-Lengthを見た上で空行判定するしか無い(と思う)。↓こんな感じ。
if(init) body = false println line //System.out.println line if(body){ bytes += line.size() + 2 // for crlf if(bytes >= clen) return 'success' } else { if((body = !line)) bytes = 0 else if((m = line =~ /^Content-Length: *(\d+)/)) clen = m[0][1].toLong() }
> groovy -l 777 server.groovy groovy is listening on port 777
> curl -F name=value localhost:777 User-Agent: curl/7.19.0 (i386-pc-win32) libcurl/7.19.0 OpenSSL/0.9.8h zlib/1.2.3 Host: localhost:777 Accept: */* Content-Length: 144 Expect: 100-continue Content-Type: multipart/form-data; boundary=----------------------------dbb1010dc8d4 ------------------------------dbb1010dc8d4 Content-Disposition: form-data; name="name" value ------------------------------dbb1010dc8d4--