Por favor me ajude a descobrir o que há de errado com este código de proxy da web

Eu quero escrever um proxy web para o exercício, e este é o código que tenho até agora:


// 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()
    }
}

Agora, tudo que faz é:

leia a solicitação HTTP que meu navegador envia

analisar o host e a porta

conectar-se a esse host e gravar os dados recebidos do cliente

enviar o cliente de volta os dados recebidos do host

Mas ... não funciona o tempo todo. Às vezes, faz um bom pedido, às vezes não. Eu acho que é um problema de buffer, não tenho certeza. A coisa é, eu adicioneiflush chama, e ainda nada.

Você consegue identificar o que estou fazendo de errado?

EDITAR:

Notei que se eu adicionar algunssleep chama, o proxy parece "trabalhar" em um número maior de solicitações, mas não todas elas.para coletar a recompensa, me ajude a descobrir o que estou fazendo de errado. Qual é o "algoritmo" normal usado para um proxy da web? Onde estou me desviando disso? Obrigado!

questionAnswers(6)

yourAnswerToTheQuestion