title: Get the full, raw HTTP request message that would be sent from an HttpPost
body: <p>I'm trying to build a raw HTTP POST request. I don't want to actually connect to the server and send the message, however.</p>
  
  <p>I've been poking around the Apache HTTP libraries, hoping that I could just create an HttpPost object, set the entity, and then grab the message that it would have created. So far, I can dump the entity, but not the entire request as it'd appear on the server-side.</p>
  
  <p>Any ideas? Aside from just re-creating the wheel, of course.</p>
  
  <h1>Solution</h1>
  
  <p>I refactored ShyJ's response into a pair of static classes, however the original response works just fine. Here are the two classes:</p>
  
  <pre><code>public static final class LoopbackPostMethod extends PostMethod {
      private static final String STATUS_LINE = "HTTP/1.1 200 OK";
  
      @Override
      protected void readResponse(HttpState state, HttpConnection conn) throws IOException, HttpException {
          statusLine = new StatusLine (STATUS_LINE);
      }
  }
  
  public static final class LoopbackHttpConnection extends HttpConnection {
      private static final String HOST = "127.0.0.1";
      private static final int PORT = 80;
  
      private final OutputStream fOutputStream;
  
      public LoopbackHttpConnection(OutputStream outputStream) {
          super(HOST, PORT);
          fOutputStream = outputStream;
      }
  
      @Override
      public void flushRequestOutputStream() throws IOException { /* do nothing */ }
  
      @Override
      public OutputStream getRequestOutputStream() throws IOException, IllegalStateException {
          return fOutputStream;
      }
  
      @Override
      public void write(byte[] data) throws IOException, IllegalStateException {
          fOutputStream.write(data);
      }
  }
  </code></pre>
  
  <p>Here's the factory method that I'm using for my own implementation, as an example:</p>
  
  <pre><code>private ByteBuffer createHttpRequest(ByteBuffer data) throws HttpException, IOException {
      LoopbackPostMethod postMethod = new LoopbackPostMethod();
      final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
      postMethod.setRequestEntity(new ByteArrayRequestEntity(data.array()));
      postMethod.execute(new HttpState(), new LoopbackHttpConnection(outputStream));
      byte[] bytes = outputStream.toByteArray();
      ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
      buffer.put(bytes);
      return buffer;
  }
  </code></pre>