Как правильно пересылать сообщения, приходящие с клиента на веб-сервер в HTTPS? (Java Proxy Server) - PullRequest
0 голосов
/ 15 марта 2012

У меня есть рабочий прокси-сервер HTTP.он может правильно обрабатывать веб-сайт, используя только HTTP, а также может подключаться к веб-сайту HTTPS.Он может правильно согласовать запрос клиента CONNECT и начать подключение к целевому серверу.Теперь моя проблема с некоторыми веб-сайтами HTTPS, требующими входа пользователя, такими как Facebook и Yahoo (хотя на некоторых сайтах я могу сделать это успешно).Кажется, я не мог правильно пересылать сообщения, приходящие с обеих сторон. (клиент и сервер)

, что происходит каждый раз, когда я пытаюсь войти на указанный сайт.Браузер ведет себя успешно, он вошел в мою учетную запись, но вместо отображения реальной страницы он возвращается на страницу входа.

вот как работает мой код

// Класс демона

while(true)
{
  ConnectionHandler handler = new ConnectionHandler(server.accept());
  handler.start();
}

// Класс ConnectionHandler

class ConnectionHandler extends Thread
{
    Socket client = null;
    Socket server = null;
    HTTPRequestHdr request = null;
    public ConnectionHandler(Socket socket)
    {
      client = socket;
      request = new HTTPRequestHdr();
    }

    public void run()
    {
       try
       {
         request.parse(client.getInputStream());
         server = new Socket(request.url,request.port);
         if(request.getMethod().equals("CONNECT");
         {
            // send 200 message to client then proceed
         }
         else
         {
            // send the request to server
         }

         Tunnel clientToServer = new Tunnel(client,server);
         Tunnel ServerToClient = new Tunnel(server,client);
         clientToServer.start();
         ServerToClient.start();

       }catch(Exception e) {}
    }
}

// Туннельный класс

class Tunnel extends Thread
{
   Socket from = null;
   Socket to = null;
   public Tunnel(Socket from , Socket to)
   {
      this.from = from;
      this.to = to;
   }

   public void run()
   {
      OutputStream toClient = null;
      InputStream fromClient = null;
      byte[] buffer = new byte[50];
      int numberRead = 0;
      iny noResponse = 0;
      try
      {
       toClient = to.getOutputStream();
       fromClient = fro.getInputStream();

       int avail = fromClient.available();

        if(avail < 1)
        {
           Thread.sleep(20);
           noResponse += 20; 
        }
        else 
        {
           noResponse = 0; 
        }

        while(avail > 0)
        {
            numberRead = avail;
            numberRead = fromClient.read(buffer,0,numberRead);

            toClient.write(buffer,0,numberRead);
            toClient.flush();
            avail = fromClient.available();
        }

        if(noResponse > 30000)
        {
            // close connection
        }

      }catch(Exception e) {}

   }
}

Мне кажется, я не могу правильно переслать данные, поступающие с обеих сторон.подскажите пожалуйста где я не прав и как это исправить?

1 Ответ

0 голосов
/ 15 марта 2012
try
{
    int avail = fromClient.available();

    if(avail < 1)
    {
       Thread.sleep(20);
       noResponse += 20; 
    }
    else 
    {
       noResponse = 0; 
    }
    while(avail > 0)
    {
        numberRead = avail;
        numberRead = fromClient.read(buffer,0,numberRead);
        toClient.write(buffer,0,numberRead);
        toClient.flush();
        avail = fromClient.available();
    }
    if(noResponse > 30000)
    {
        // close connection
    }
} catch(Exception e) {}

Это все неправильно. Сокеты уже имеют функцию тайм-аута, и вы просто тратите время на звонки available() и sleep(). Все, что вам нужно, это:

try
{
    fro.setSoTimeout(30000);
    while ((length = fromClient.read(buffer)) > 0)
    {
        toClient.write(buffer, 0, length);
    }
    // close sockets
    toClient.close();
    fromClient.close();
}
catch (SocketTimeoutException exc)
{
    // handle timeout, and certainly close the socket
}
catch (IOException exc)
{
    // exception handling
}
finally
{
    fro.close(); // close the input socket, NB not the output socket, the other thread will do that
}
...