-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--