How to preserve the Content-Type header of a Tomcat HTTP response sent through an AJP connector to Apache using mod_proxy
Asked Answered
O

3

8

I'm having a problem with an incorrect HTTP Response Content-Type header while accessing an Axis2 web service hosted in Tomcat behind Apache through an AJP/1.3 connector.

I can access the web service without problems in the browser through its RESTful interface and I can see the results but somehow Apache is changing the response Content-Type header sent by Tomcat from text/xml to text/plain and it prevents me from consuming the web service through SOAP in NetBeans, because of an Unsupported Content-Type: text/plain Supported ones are: [text/xml] exception.

Here's the relevant section of my Apache vhosts configuration:

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName  myserver.example
    ServerAlias other.myserver.example

    ProxyPreserveHost On 
    SetEnv force-proxy-request-1.0 1
    SetEnv proxy-nokeepalive 1

    <Location /axis2/services>
        ProxyPass ajp://localhost:8009/axis2/services
        ProxyPassReverse ajp://localhost:8009/axis2/services
    </Location>
</VirtualHost>

And the relevant section of my Tomcat server.xml:

<Connector port="8009" protocol="AJP/1.3" redirectPort="9443" />

<Connector port="9443" protocol="HTTP/1.1" SSLEnabled="true" maxHttpHeaderSize="8192"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" disableUploadTimeout="true"
    acceptCount="100" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    SSLCertificateFile="path/to/bundle" 
    SSLCertificateKeyFile="path/to/key"
    SSLPassword="S3cr3t"
    proxyName="myserver.example" proxyPort="443" />

If I access the WS directly in Tomcat using the default connector on port 8080 I get the correct content-type but if I access it through Apache then I get text/plain, so it's definitely a problem with the proxy.

How can I solve this problem?

EDIT: I got it to work by using the Tomcat HTTP connector for the proxying, instead of the AJP one, but I would prefer to use mod_ajp if I find a working solution.

I just changed the

ProxyPass ajp://localhost:8009/axis2/services
ProxyPassReverse ajp://localhost:8009/axis2/services

lines to

ProxyPass http://localhost:8080/axis2/services
ProxyPassReverse http://localhost:8080/axis2/services
Onwards answered 3/8, 2010 at 18:32 Comment(2)
markmail.org/message/… seems related to your issueRossiter
Yes, it's the same issue and I already found some mail archives like that one from 2007 before posting the question here, but I still can't find a solution to this problem.Onwards
I
11
# DefaultType: the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value.  If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType None

This is the solution. Look at this part in the httpd.conf, It's important that DefalutType is None. If you see plain/text this is the problem. Sorry, this solution is not mine but i dont find out in which blog i've found it :-)

Inhumation answered 6/12, 2011 at 10:44 Comment(1)
thanks. the proxy was struggeling with a 401. THIS WORKS!Schnapp
A
2

I've spent the past two days at work tracking down something similar to this.

There have been a few bugs producing problems similar to this in the past, in both Apache HTTPD and Tomcat, but most seem to have been resolved at least 2 years ago. I think this one is what anyone using current software is likely to be hitting - it is certainly what I am currently experiencing:

https://issues.apache.org/bugzilla/show_bug.cgi?id=49929

There may be a patch in Tomcat 7.x, but nobody has tested it yet. I plan to do so when I have time in about a week as well as produce a reliable test case so this can get fixed in all relevant versions of tomcat.

This only occurs when using APR, so one intermediate solution is to avoid that (but that could have performance consequences).

Adenaadenauer answered 25/3, 2011 at 2:50 Comment(0)
N
1

This solved a head ache for me. I had Apache 2.2 as frontend with mod_proxy_ajp and jboss as backend. Several transactions failed with

Message: Client found response content type of 'text/plain; charset=UTF-8', but expected 'text/xml'.

My Apache did have 'text/plain' as DefaultType. I did not however, change this at the global level (httpd.conf). I went about and added a new line to my vhost config in the <proxy> config section setting it to text/xml.

DefaultType text/xml

I did try using None did not work for me, then I just got:

'' in the error msg instead of 'text/plain'.
Nonpareil answered 9/5, 2012 at 10:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.