Por favor, ayúdame a descubrir qué está mal con este código proxy web
Quiero escribir un proxy web para hacer ejercicio, y este es el código que tengo hasta ahora:
// returns a map that contains the port and the host
def parseHostAndPort(String data) {
def objMap // this has host and port as keys
data.eachLine { line ->
if(line =~ /^(?i)get|put|post|head|trace|delete/) {
println line
def components = line.split(" ")
def resource = components[1]
def colon = resource.indexOf(":")
if(colon != -1) {
URL u = new URL(resource)
def pHost = u.host
def pPort = u.port
return (objMap = [host:pHost,port:pPort])
}
else {
return (objMap = [host:resource,port:80])
}
}
}
return objMap
}
// reads a http request from a client
def readClientData(Socket clientSocket) {
def actualBuffer = new StringBuilder()
InputStream inStream = clientSocket.inputStream
while(true) {
def available = inStream.available()
if(available == 0)
break;
println "available data $available"
def buffer = new byte[available]
def bytesRead = inStream.read(buffer,0,available)
actualBuffer << new String(buffer)
}
return actualBuffer.toString()
}
def sock = new ServerSocket(9000)
sock.reuseAddress = true
while(true) {
sock.accept { cli ->
println "got a client"
def data = readClientData(cli)
def parsed = parseHostAndPort(data)
def host = parsed["host"]
def port = parsed["port"]
println "got from client $data"
def nsock = new Socket(host,port)
nsock << data // send data received from client to the socket
nsock.outputStream.flush()
def datax = readClientData(nsock)
println "got back $datax"
cli << datax // send the client the response
cli.outputStream.flush()
cli.close()
}
}
En este momento, todo lo que hace es:
lee la solicitud HTTP que mi navegador envía
analizar el host y el puerto
conéctese a ese host y escriba los datos recibidos del cliente
devolver al cliente los datos recibidos del host
Pero ... no funciona todo el tiempo. A veces hará una buena petición, a veces no. Creo que es un problema de almacenamiento, no estoy seguro. La cosa es, agregué.flush
Llama, y todavía nada.
¿Puedes ver lo que estoy haciendo mal?
EDITAR:
Me di cuenta de que si agrego algosleep
llamadas, el proxy parece "funcionar" en un número mayor de solicitudes, pero no todas.para recoger la recompensa, ayúdame a descubrir qué estoy haciendo mal. ¿Cuál es el "algoritmo" normal utilizado para un proxy web? ¿De dónde me estoy desviando? ¡Gracias!