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!

Respuestas a la pregunta(6)

Su respuesta a la pregunta