Httpプロキシ練習

actorの練習を兼ねて書いてみた。
最小限過ぎてまともに動かない。
fromURLで手抜きしているところもう少しローレベルに書いて、
ascii以外の文字列がきても大丈夫にして、
redirectくらいには、対応させねばなるまい。

package proxy

import io._
import scala.actors._
import java.net._
import java.io._

case class Client(socket :Socket, index :Int)

class Resolver(bufSize :Int) extends Actor {

    private def get(socket :Socket, index :Int, url :String, version :String){
        println("["+index+"] GET: ", url, version)
        val iter=Source.fromURL(url).getLines
        val out=new DataOutputStream(socket.getOutputStream())
        for(line <- iter){
            out.writeChars(line)
        }
    }
        
    private def request(socket :Socket, index :Int){
        val iter=Source.fromInputStream(socket.getInputStream()).getLines
        iter.next.split(' ') match {
            case Array("GET", url, version)=>get(socket, index, url, version)
        }
        socket.close()
    }

    def act(){
        while(true){
            receive {
                case Client(socket, i)=>request(socket, i)
            }
        }
    }
}

class Server(port :Int) {
    def run() =
    {
        val server = new ServerSocket(port)
        println("server: Waiting for connection: "+port)
        var count=0
        def inc(n: Int): Stream[Int]=Stream.cons(n, inc(n+1))
        for(i <- inc(0)){
            val socket=server.accept()
            val resolver= new Resolver(65535);
            resolver.start()
            resolver ! Client(socket, i)
        }
    }
}

object Server {
    def main(args :Array[String]){
        val p=new Server(if(args.length>0){
                    args(0) toInt
                }
                else{
                    9998
                })
        p.run
    }
}