Pomóż mi dowiedzieć się, co jest nie tak z tym internetowym kodem proxy

Chcę napisać web proxy do ćwiczeń, a to jest kod, który do tej pory mam:


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

W tej chwili wszystko co robi to:

przeczytaj żądanie HTTP, które wysyła moja przeglądarka

przeanalizuj hosta i port

połącz się z tym hostem i zapisz dane otrzymane od klienta

wysłać klientowi dane otrzymane od hosta

Ale ... to nie działa cały czas. Czasami będzie to dobra prośba, czasem nie. Myślę, że to kwestia buforowania, nie jestem pewien. Rzecz w tym, dodałemflush dzwoni i nadal nic.

Czy widzisz, co robię źle?

EDYTOWAĆ:

Zauważyłem, że jeśli dodam trochęsleep wywołania, proxy wydaje się „działać” na większej liczbie żądań, ale nie na wszystkich.aby zebrać nagrodę, pomóż mi dowiedzieć się, co robię źle. Jaki jest normalny „algorytm” używany w proxy sieciowym? Gdzie się od niej odchodzę? Dzięki!

questionAnswers(6)

yourAnswerToTheQuestion