You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Luke Xu (JIRA)" <ji...@apache.org> on 2017/07/31 09:22:00 UTC

[jira] [Created] (CXF-7459) JAX-RS WebClient.invoke() do not respect Content-Type setting in HTTP-Conduit

Luke Xu created CXF-7459:
----------------------------

             Summary: JAX-RS WebClient.invoke() do not respect Content-Type setting in HTTP-Conduit
                 Key: CXF-7459
                 URL: https://issues.apache.org/jira/browse/CXF-7459
             Project: CXF
          Issue Type: Bug
          Components: JAX-RS
    Affects Versions: 3.1.5
            Reporter: Luke Xu


Hi,

We got in some problem while using WebClient.invoke() to communicate external services.

The message sent by WebClient.invoke() comes from other part of our product, which plays the role of an integrator basing on configuration. Thus during development, we can't know the real type of message and set all message type in the invoke method as inputStream. Other information of the connection for example Content-Type is set in http-conduit.

The problem we found is that under our usage of WebClient.invoke(), Content-Type in http-conduit can't be set to application/x-www-form-urlencoded. It is set back to default value application/xml as is WebClient. But it is not true for other type of Content-Type setting in conduit. To set ourselves' headers object to the WebClient before invoking bypasses the issue as well.

Another problem is logging feature lie on this issue. application/x-www-form-urlencoded is showed in log but if monitoring with third part tool its application/xml.

Related configuration xml:
{quote}
    <http:conduit name="*.http-conduit">
        <http:client AutoRedirect="false" AllowChunking="false" Accept="*/*" ContentType="application/x-www-form-urlencoded"/>
    </http:conduit>
    <cxf:bus>
        <cxf:features>
            <cxf:logging/>
        </cxf:features>
    </cxf:bus>
{quote}

Sample code of our product to call service.
{quote}
        if (webClientTemplate == null) {
            // create from the url and provider list
            webClientTemplate = WebClient.create(address, providerList);
            // copy the headers over
            MultivaluedMap<String, String> tempHeaders = webClientTemplate.getHeaders();
            for (String key : headers.keySet()) {
                String value = headers.get(key);
                tempHeaders.putSingle(key, value);
            }
            webClientTemplate.headers(tempHeaders);
        }
        // now we always have a template, copy it for best speed in creating a web client
        return WebClient.fromClient(webClientTemplate, true);
        ......
        responseStream = webClient.invoke(requestMethod, requestStream, InputStream.class);
{quote}

Comparing logging we got between old version and 3.1.5 we are in use.
{quote}
Working (2.7.8):
 
INFO: Outbound Message
---------------------------
ID: 1
Address: https://developer.tigertext.me/v2/message
Http-Method: POST
Content-Type: application/x-www-form-urlencoded
Headers: {Content-Type=[application/xml], Accept=[*/*], Authorization=[Basic VFF3Y1ZUOXljaHpFVG93bkVTUVpxc3g2cm9oaE5yUDU6V1lUeGpDUzgwTEF6YWFTOWNyRFp3QlhTZnRjRmxmb1JBMDFHbW9MUFpwZUJxbG14], Connection=[Keep-Alive]}
Payload: recipient=%2B15739992640&ttl=1440&body=Patient Test, ADM (DOB: 19650414) has been admitted to Stamford Hospital and indicated you as their PCP.
--------------------------------------
 
INFO: Inbound Message
----------------------------
ID: 1
Response-Code: 204
Encoding: ISO-8859-1
Content-Type: application/json
Headers: {connection=[keep-alive], Content-Length=[0], content-type=[application/json], Date=[Wed, 26 Jul 2017 21:04:48 GMT], Server=[nginx], TT-X-Message-Id=[67e0fa88-4965-41a7-a37a-97ec0280d4ec], TT-X-Msg-Ttl=[1440], TT_Log_Account_Token=[d7d6b87c-1ccd-4ad1-bc2b-40f2d4d28e1d], TT_Log_API_Key=[16675b77-a1d7-4815-96e4-9802254cb3f3], TT_Log_HTTP_Verb=[POST], TT_Log_Message_ID=[67e0fa88-4965-41a7-a37a-97ec0280d4ec], TT_Log_Organization=[agbdTQbwmlqiasaI2zkPLFO2], TT_Log_Processed_By_Host=[prod-tigerconnect-xmpp-i-08fc29d0a5e5715a2], TT_Log_Product_Token=[consumer], TT_Log_Traffic_Type=[public], TT_Log_URI_Name=[/api/message/message_id]}
--------------------------------------
 
 
Not working (3.1.5):
 
INFO: Outbound Message
---------------------------
ID: 1
Address: https://developer.tigertext.me/v2/message
Http-Method: POST
Content-Type: application/x-www-form-urlencoded
Headers: {Content-Type=[application/xml], Accept=[*/*], Authorization=[Basic VFF3Y1ZUOXljaHpFVG93bkVTUVpxc3g2cm9oaE5yUDU6V1lUeGpDUzgwTEF6YWFTOWNyRFp3QlhTZnRjRmxmb1JBMDFHbW9MUFpwZUJxbG14], Connection=[Keep-Alive]}
Payload: recipient=%2B15739992640&ttl=1440&body=Patient Test, ADM (DOB: 19650414) has been admitted to Stamford Hospital and indicated you as their PCP.
--------------------------------------
 
INFO: Inbound Message
----------------------------
ID: 1
Response-Code: 415
Encoding: ISO-8859-1
Content-Type: application/json
Headers: {connection=[keep-alive], Content-Length=[0], content-type=[application/json], Date=[Wed, 26 Jul 2017 20:56:48 GMT], Server=[nginx], TT_Log_Account_Token=[d7d6b87c-1ccd-4ad1-bc2b-40f2d4d28e1d], TT_Log_API_Key=[16675b77-a1d7-4815-96e4-9802254cb3f3], TT_Log_HTTP_Verb=[POST], TT_Log_Organization=[agbdTQbwmlqiasaI2zkPLFO2], TT_Log_Processed_By_Host=[prod-tigerconnect-xmpp-i-08fc29d0a5e5715a2], TT_Log_Product_Token=[consumer], TT_Log_Traffic_Type=[public], TT_Log_URI_Name=[/api/message/message_id]}
--------------------------------------
{quote}




--
This message was sent by Atlassian JIRA
(v6.4.14#64029)