mirror of https://github.com/bvn13/ScaProxy.git
48 lines
1.5 KiB
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)
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|