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