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!