ByteArrayOutputStream os = new ByteArrayOutputStream();
multi.writeTo(os);
// Create request with multi-part body and query args
RestRequest request = new RestRequestBuilder(new URI("http://localhost:7279?args=xyz"))
.setMethod("PUT")
.setHeader("Content-Type", multi.getContentType())
.setEntity(ByteString.copy(os.toByteArray())).build();
// Encode and verify
RestRequest encoded = QueryTunnelUtil.encode(request, 0);
Assert.assertEquals(encoded.getMethod(), "POST");
Assert.assertEquals(encoded.getURI().toString(), "http://localhost:7279");
Assert.assertTrue(encoded.getEntity().length() > 0);
Assert.assertTrue(encoded.getHeader("Content-Type").startsWith("multipart/mixed"));
// Decode and make sure we have the original request back
RestRequest decoded = QueryTunnelUtil.decode(request);
Assert.assertEquals(decoded.getURI().toString(), "http://localhost:7279?args=xyz");
Assert.assertEquals(decoded.getMethod(), "PUT");
Assert.assertEquals(decoded.getEntity(), request.getEntity());
Assert.assertTrue(encoded.getHeader("Content-Type").startsWith("multipart/mixed"));
}