You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@camel.apache.org by "Jeremy Norris (JIRA)" <ji...@apache.org> on 2010/04/25 06:37:24 UTC

[jira] Issue Comment Edited: (CAMEL-1806) put the query parameters into the message header

    [ https://issues.apache.org/activemq/browse/CAMEL-1806?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=59078#action_59078 ] 

Jeremy Norris edited comment on CAMEL-1806 at 4/25/10 12:35 AM:
----------------------------------------------------------------

In order to preserve the message body during "application/x-www-form-urlencoded" POSTs (for the purpose of proxying http endpoints), I've come up the following solution:  This still propagates the form params to the message headers, but the body is preserved.  Feedback is appreciated.  Thanks.

      was (Author: jnorris):
    In order to preserve the message body during "application/x-www-form-urlencoded" POSTs (for the purpose of proxying http endpoints), I've come up the following solution:  This still propagates the form params to the message headers, but the body is preserved.  Feedback is appreciated.  Thanks.

public class HttpBindingPreservePostFormUrlEncodedBody extends DefaultHttpBinding {

    private static final Logger LOG = Logger.getLogger(HttpBindingPreservePostFormUrlEncodedBody.class.getName());
    
    public HttpBindingPreservePostFormUrlEncodedBody() {
    }
    
    public HttpBindingPreservePostFormUrlEncodedBody(HeaderFilterStrategy headerFilterStrategy) {
        super(headerFilterStrategy);
    }

    @Override
    public void readRequest(HttpServletRequest request, HttpMessage message) {    

        // Read body first because DefaultHttpBinding delegate will look for
        // POST MediaType.APPLICATION_FORM_URLENCODED form params and remove
        // them from the body. It will then be our responsibility to add these
        // form params into the message headers to retain compatibility with
        // DefaultHttpBinding.        
        InputStream inputStream = (InputStream) message.getBody();
        String body = "";
        try {
            body = IOUtils.toString(inputStream, "UTF-8");
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
        
        super.readRequest(request, message);

        message.setBody(body);
        
        String contentType = request.getContentType();
        if (contentType != null && contentType.equals(MediaType.APPLICATION_FORM_URLENCODED)) {
            // Push POST form params into the headers to retain compatibility with DefaultHttpBinding
            try {
                for (String param : body.split("&")) {
                    String[] pair = param.split("=", 2);
                    String key = URLDecoder.decode(pair[0], "UTF-8");
                    String value = URLDecoder.decode(pair[1], "UTF-8");
                    message.getHeaders().put(key, value);
                }
            }
            catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }
    }
    
}

And a unit test:

public class TestHttpBindingPreservePostFormUrlEncodedBody extends CamelTestSupport {

    private static final String TEST_POST_BODY = "b1=x&b2=y";
    
    @Test
    public void testSendPost() throws Exception {

        // The test will include POST params and query string params on the same
        // test to ensure everything ends up in the headers.
        
        // It will also ensure that the POST body is preserved when they are
        // form params.
        
        Client client = Client.create();
        WebResource webResource = client.resource("http://localhost:9080/test?q1=x&q2=y");
        
        WebResource.Builder requestBuilder = webResource.getRequestBuilder();
        requestBuilder.type(MediaType.APPLICATION_FORM_URLENCODED);
        
        requestBuilder.post(String.class, TEST_POST_BODY);
    }

    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() throws Exception {
                from("jetty://http://localhost:9080/test?httpBindingRef=httpBindingPreservePostFormUrlEncodedBody").process(new Processor() {
                    public void process(Exchange exchange) throws Exception {
                        Message in = exchange.getIn();
                        
                        Assert.assertEquals("x", in.getHeader("q1"));
                        Assert.assertEquals("y", in.getHeader("q2"));
                        Assert.assertEquals("x", in.getHeader("b1"));
                        Assert.assertEquals("y", in.getHeader("b2"));   
                        Assert.assertEquals(TEST_POST_BODY, in.getBody(String.class));
                    }
                });
            }
        };
    }

    @Override
    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry jndi = super.createRegistry();
        jndi.bind("httpBindingPreservePostFormUrlEncodedBody", new HttpBindingPreservePostFormUrlEncodedBody());
        return jndi;
    }

}

  
> put the query parameters into the message header
> ------------------------------------------------
>
>                 Key: CAMEL-1806
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-1806
>             Project: Apache Camel
>          Issue Type: Improvement
>          Components: camel-http
>            Reporter: Willem Jiang
>            Assignee: Willem Jiang
>             Fix For: 1.6.2, 2.0.0
>
>
> We will have the query parameter with POST and GET method.
> But current Camel just support to put these parameters into the message header with the http GET method.
> Here is the user requirement of this[1], we should add this support in Camel.
> [1] http://www.nabble.com/Jetty-component-and-HTTP-parameter-to24287116.html

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.