axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andreas Veithen (Commented) (JIRA)" <>
Subject [jira] [Commented] (AXIS2-4465) TransportInDescription and TransportListener instances for AxisServlet are not managed properly
Date Fri, 18 Nov 2011 23:40:53 GMT


Andreas Veithen commented on AXIS2-4465:

The assumption you are making is that the port is only needed when a WSDL is requested using
a "?wsdl" GET request. That is incorrect. There are at least two other cases where an EPR
needs to be calculated:
* MEX (which is also about WSDL generation, but which uses POST).
* Calculating the WS-A ReplyTo header for asynchronous requests.
> TransportInDescription and TransportListener instances for AxisServlet are not managed
> -----------------------------------------------------------------------------------------------
>                 Key: AXIS2-4465
>                 URL:
>             Project: Axis2
>          Issue Type: Bug
>          Components: transports
>    Affects Versions: 1.5
>            Reporter: Andreas Veithen
>            Assignee: Andreas Veithen
>             Fix For: 1.5.3, 1.6.0
> There are three (!) different types of TransportListener implementations (and TransportInDescription
instances) that are used during the lifecycle of AxisServlet:
> 1) The default axis2.xml that we ship with the Web app has a transportReceiver entry
for org.apache.axis2.transport.http.SimpleHTTPServer. This is of course wrong because we want
to use AxisServlet, not the standalone HTTP server. Since AxisServlet replaces this TransportInDescription
anyway (see point 2), the SimpleHTTPServer is never started (fortunately!), but it is still
necessary to have the dependencies of SimpleHTTPServer in the classpath (see AXIS2-4464).
Note that simply removing the transportReceiver entry from axis2.xml doesn't work, because
this leads to the issue described in AXIS2-4141.
> 2) AxisServlet#init creates a fresh TransportInDescription (with AxisServlet as TransportListener)
and registers it in the ListenerManager/AxisConfiguration. This replaces the TransportInDescription
from point 1. AxisServlet, in conjunction with ListingAgent#extractHostAndPort also implements
some sort of autodetection mechanisms for the port number (using the RUNNING_PORT configuration
context property). Note that all this is only done for HTTP, not HTTPS.
> 3) ListingAgent can also create and register TransportInDescription instances on the
fly if it detects requests using a protocol for which no TransportInDescription has been registered,
i.e. HTTPS. See the addTransportListener method. This TransportInDescription instance will
have yet another type of TransportListener associated with it, namely org.apache.axis2.transport.http.CustomListener.
> This approach has several problems:
> - It is a complete mess.
> - Nobody will ever be able to document this properly or explain to a user how this works.
> - It causes lots of issues. See the JIRAs linked to this report.
> - It doesn't take into account that fundamentally, no port autodetection scheme will
ever work reliably (i.e. in such a way that it produces the correct WSDL from the start) if
the servlet is used with both HTTP and HTTPS. The reason is that autodetection can only rely
on information from incoming requests. This means that the WSDL can only be complete if the
servlet has received at least on HTTP request and at least one HTTPS request.
> Here is a simple proposal to solve these problems once and for all:
> - Use a single TransportListener implementation with AxisServlet. This cannot be the
AxisServlet itself because there can be two TransportListener instances for the same AxisServlet
instance. It would basically be CustomListener, but with a better name, e.g. AxisServletListener.
> - Require the user to declare a transportReceiver (with AxisServletListener) in axis2.xml
for every protocol (http and/or https) he wants to use.
> - If a single transportReceiver is configured, the user is not required to specify the
port and AxisServlet will autodetect it based on incoming requests.
> - If a transportReceiver is configured for both http and https, the user is required
to provide information about the port numbers. This makes sure that the correct WSDL can always
be generated.
> - For consistency, if AxisServlet receives a request with a protocol for which no transportReceiver
is configured, the request is rejected.
> - Update the default axis2.xml for the WAR distribution so that it contains: <transportReceiver
name="http" class="org.apache.axis2.transport.http.AxisServletListener"/>
> The only cases where this approach may fail to give consistent results is when
> - port autodetection takes places and the WSDL is retrieved through a non HTTP protocol
(very unlikely, unless something like MEX over SOAP/JMS is used...);
> - port autodetection takes places and the servlet container accepts connections for the
same protocol on different ports.
> In both cases it is sufficient to specify the port number in the transportReceiver element
to avoid the issue.

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:!default.jspa
For more information on JIRA, see:


To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message