ScaProxy/src/main/scala/ru/bvn13/scaproxy/engine/ClientListener.scala

48 lines
1.5 KiB
Scala

package ru.bvn13.scaproxy.engine
import java.io.{BufferedReader, InputStreamReader}
import java.net.{InetAddress, Socket}
import java.util.concurrent.{ExecutorService, Executors}
import java.util.regex.{Matcher, Pattern}
case class ClientListener(clientSocket: Socket) extends Runnable {
private val RE_HOST = Pattern.compile("^Host: (\\S)+:(\\d)*")
private var buffer: List[String] = List()
private var outgoingTunnel: SocketTunnel = ???
private var incomingTunnel: SocketTunnel = ???
private val executorService: ExecutorService = Executors.newFixedThreadPool(2)
override def run(): Unit = {
val clientStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream))
var line = clientStream.readLine
while (line != null && !line.isEmpty) {
buffer = line :: buffer
}
if (buffer.length >= 2) {
val matcher: Matcher = RE_HOST.matcher(buffer(2))
if (matcher.matches) {
val host:String = matcher.group(1)
val port:String = if (matcher.groupCount > 2) matcher.group(2) else "80"
val remoteSocket: Socket = new Socket(InetAddress.getByName(host), port.toInt)
outgoingTunnel = SocketTunnel(sender = clientSocket, receiver = remoteSocket)
outgoingTunnel.initialBuffer = buffer
incomingTunnel = SocketTunnel(sender = remoteSocket, receiver = clientSocket)
executorService.execute(outgoingTunnel)
executorService.execute(incomingTunnel)
}
}
}
}