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!