Pour vous simplifier la vie voici le version java du proxy http.
Voilà à quoi ça ressemble:

Proxy HTTP en Java avec interface utilisateur

Proxy HTTP en Java avec interface utilisateur

Proxy HTTP en Java avec interface utilisateur

Les deux popups servent à configurer le proxy, le port sur lequel il écoute et si il doit se connecter vers un autre proxy ou pas.
La fenêtre principale est découpée en deux partie, à gauche le texte reçu du browser, à droite celui reçu du serveur. Tant que le checkbox n'est pas selectionné le message n'est pas envoyé, il est donc possible de modifier la requête avant de l'envoyer.

Exemple de code 1
n:cal SetSyn('java')
:so $VIMRUNTIME/syntax/2html.vim
t
import java.net.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;
import java.awt.*;

public class GProxy extends JFrame
{

  public class ProxyDialog extends JDialog
  {
    JTextField hostTF, portTF;

    public ProxyDialog(Frame parent, boolean modal)
    {
      super(parent, modal);

      JPanel panel1, panel2, panel3;
      JButton okButton, cancelButton;

      Container contentPane = this.getContentPane();

      panel1 = new JPanel();
      panel1.setLayout(new FlowLayout(FlowLayout.CENTER));
      contentPane.add(panel1, BorderLayout.SOUTH);
      okButton = new JButton("OK");
      panel1.add(okButton);
      cancelButton = new JButton("Cancel");
      panel1.add(cancelButton);

      panel2 = new JPanel();
      panel2.setLayout(new FlowLayout(FlowLayout.CENTER));
      contentPane.add( panel2, BorderLayout.NORTH);
      panel2.add(new JLabel("Proxy ? "));
      panel2.add(useProxy);

      panel3 = new JPanel();
      panel3.setLayout(new FlowLayout(FlowLayout.CENTER));
      contentPane.add(panel3, BorderLayout.CENTER);
      hostTF = new JTextField(proxy, 20);
      portTF = new JTextField("" + proxyport, 5);
      panel3.add(hostTF);
      panel3.add(portTF);

      setTitle("Proxy info");
      pack();


      cancelButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event)
        {
          dispose();
          setVisible(false);
        }
      });

      okButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event)
        {
          proxy = hostTF.getText();
          proxyport = Integer.parseInt(portTF.getText());
          dispose();
          setVisible(false);
        }
      });

    }
  }


  public class PortDialog extends JDialog
  {
    JTextField portTF;

    public PortDialog(Frame parent, boolean modal)
    {
      super(parent, modal);

      JPanel panel1, panel3;
      JButton okButton, cancelButton;

      Container contentPane = this.getContentPane();

      panel1 = new JPanel();
      panel1.setLayout(new FlowLayout(FlowLayout.CENTER));
      contentPane.add(panel1, BorderLayout.SOUTH);
      okButton = new JButton("OK");
      panel1.add(okButton);
      cancelButton = new JButton("Cancel");
      panel1.add(cancelButton);

      panel3 = new JPanel();
      panel3.setLayout(new FlowLayout(FlowLayout.CENTER));
      contentPane.add(panel3, BorderLayout.CENTER);
      panel3.add(new JLabel("Proxy port"));
      portTF = new JTextField("" + port, 5);
      panel3.add(portTF);

      setTitle("Proxy info");
      pack();


      cancelButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event)
        {
          dispose();
          setVisible(false);
        }
      });

      okButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event)
        {
          port = Integer.parseInt(portTF.getText());
          try {
            s.close();
            s = new ServerSocket(port);
          } catch (Exception e) {};
          dispose();
          setVisible(false);
        }
      });

    }
  }

  class OneServeur extends Thread {
    private Socket socket, socketToWeb;
    private BufferedReader fromBrowser;
    private PrintWriter toBrowser;
    private PrintWriter toWeb;
    private BufferedReader fromWeb;

    public OneServeur() throws IOException {
      start();
    }

    public void run() {
      while ( true ) {
        try {
          socket = s.accept();

          fromBrowser = new BufferedReader(
                            new InputStreamReader ( socket.getInputStream()));
          toBrowser = new PrintWriter(
                           new BufferedWriter (
                                  new OutputStreamWriter (
                                        socket.getOutputStream())),true);

          String str, targetHost="", httpHeader="";
          while(true) {
               str = fromBrowser.readLine();
               httpHeader += str + "\r\n";
               if ( str.startsWith("Host: " ) ) targetHost = str.substring(6);
               if ( str.length() == 0 ) break;
          }

          if ( useProxy.isSelected() )
            socketToWeb = new Socket(InetAddress.getByName(proxy),proxyport);
          else
            socketToWeb = new Socket(InetAddress.getByName(targetHost),80);

          fromWeb = new BufferedReader(
                          new InputStreamReader ( socketToWeb.getInputStream()));
          toWeb = new PrintWriter(
                          new BufferedWriter (
                            new OutputStreamWriter (
                                  socketToWeb.getOutputStream())),true);

          TAfromBw.setText(httpHeader);

          while ( ! autoBw.isSelected() ) sleep(500) ;
          toWeb.println(TAfromBw.getText());

          TAfromWeb.setText("");
          while ( true ) {
               str = fromWeb.readLine();
               if ( str == null ) break;
               TAfromWeb.append(str+"\r\n");
          }


          while ( ! autoWeb.isSelected() )  sleep(500) ;

          toBrowser.println(TAfromWeb.getText());
          socket.close();
          socketToWeb.close();
        } catch ( Exception e) {
        }
      }
    }
  }


  public int port = 12345;
  public int proxyport = 8080;
  public String  proxy = "proxy";
  private ServerSocket s;
  private JCheckBox useProxy = new JCheckBox("", true);
  private JCheckBox autoBw = new JCheckBox("", false);
  private JCheckBox autoWeb = new JCheckBox("", false);
  private JTextArea TAfromBw = new JTextArea(10,20);
  private JTextArea TAfromWeb = new JTextArea(10,20);

  public GProxy() throws IOException {
    JMenuBar menuBar = new JMenuBar();
    JButton closeButton = new JButton("Close");
    JPanel bwPanel = new JPanel();
    JPanel bwCmd = new JPanel();
    JPanel webPanel = new JPanel();
    JPanel webCmd = new JPanel();
    JScrollPane webPane, bwPane;


    Container contentPane = this.getContentPane();

    JPanel Core = new JPanel();
    Core.setLayout(new BorderLayout());
    bwPanel.setLayout(new BorderLayout());
    webPanel.setLayout(new BorderLayout());

    setJMenuBar(menuBar);

    JMenu fMenu = new JMenu("File");
    menuBar.add(fMenu);

    JMenuItem proxyItem = new JMenuItem("Set Proxy", 2);
    fMenu.add(proxyItem);
    JMenuItem portItem = new JMenuItem("Set Port", 2);
    fMenu.add(portItem);
    fMenu.addSeparator();
    JMenuItem exitItem = new JMenuItem("Exit", 2);
    fMenu.add(exitItem);

    webPane = new JScrollPane(TAfromWeb,
                               JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                               JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

    bwPane = new JScrollPane(TAfromBw,
                               JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                               JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

    webCmd.add(new JLabel("Send")); webCmd.add(autoWeb);
    bwCmd.add(new JLabel("Send")); bwCmd.add(autoBw);

    webPanel.add(webPane, BorderLayout.NORTH );
    bwPanel.add(bwPane, BorderLayout.NORTH );
    webPanel.add(webCmd, BorderLayout.SOUTH );
    bwPanel.add(bwCmd, BorderLayout.SOUTH );

    Core.add(bwPanel, BorderLayout.WEST);
    Core.add(webPanel, BorderLayout.EAST);


    contentPane.add(Core);


    // add listeners for the window and the various buttons
    this.addWindowListener( new WindowAdapter(){
         public void windowClosing(WindowEvent e){
              setVisible(false);
              dispose();
              System.exit(0);
    }});

    exitItem.addActionListener( new ActionListener(){
         public void actionPerformed(ActionEvent e){
              System.exit(0);
    }});

    proxyItem.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            changeProxy();
    }});

    portItem.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            changePort();
    }});

    pack();

    s = new ServerSocket(port);
    new OneServeur();

  }

  protected void changeProxy()
  {
    new ProxyDialog(this, true).show();
  }

  protected void changePort()
  {
    new PortDialog(this, true).show();
  }


  public static void main ( String args[] ) {
    try {
      (new GProxy()).setVisible(true);
    } catch ( Exception e ) {}