Thorsten Kitz created AXIS2-5840:
------------------------------------

             Summary: http-Transport: Request  for static WSDL does not work 
with syntax "serviceName?wsdl"
                 Key: AXIS2-5840
                 URL: https://issues.apache.org/jira/browse/AXIS2-5840
             Project: Axis2
          Issue Type: Bug
          Components: transports
    Affects Versions: 1.7.4
            Reporter: Thorsten Kitz
            Priority: Minor


Since we upgraded our Axis2 framework from version 1.5.x to 1.7.4 it is no 
longer possible to get a *static* WSDL using the syntax <ServiceURL>?wsdl. 
Regardless of the location of the wsdl-file itself, the returned message is 
either an error text or a generated wsdl by Axis2 (if you turn the 
"useOriginalwsdl" parameter in the services.xml file to true). The cause of the 
bug is somewhere either in the AxisServlet or in the AxisService classes.

First the request executes the AxisServlet.doGet(HttpServletRequest request,
HttpServletResponse response) class:

{code:java}
... starting line number 275 ...
        if ((query != null) && new 
QueryStringParser(query).search(metadataQueryParamNames)) {
            // handling meta data exchange stuff
            agent.processListService(request, response);
        } else if (HttpUtils.endsWithIgnoreCase(requestURI , ".xsd") ||
                HttpUtils.endsWithIgnoreCase(requestURI, ".wsdl")) {
            agent.processExplicitSchemaAndWSDL(request, response);
...
{code}

The "metadataQueryParameterNames" are ["wsdl","xsl","wsdl2","policy"], so the 
first if-branch is taken (unless you write <service-URL>/service-name.wsdl, 
then the first else statement is taken). The following code fragment is in the 
class ListingAgent (starting line 297):

{code:java}
    private void handleWSDLRequest(HttpServletRequest req,
                                   HttpServletResponse res,
                                   String url,
                                   AxisService axisService) throws IOException {
        if (!canExposeServiceMetadata(axisService)){
            res.sendError(HttpServletResponse.SC_FORBIDDEN);
            return;
        }
        OutputStream out = res.getOutputStream();
        res.setContentType("text/xml");
        String ip = extractHost(url);
        String wsdlName = getParamtereIgnoreCase(req , "wsdl");

        if (wsdlName != null && wsdlName.length()>0) {
            axisService.printUserWSDL(out, wsdlName, ip);
        } else {
            axisService.printWSDL(out, ip);
        }
    }
{code}

Since there is no "wsdlName" in the GET-request, the else branch calls the 2 
parameter "printWSDL" method in the AxisService class:

{code:java}
        public void printWSDL(OutputStream out, String requestIP) throws 
AxisFault {
                // If we're looking for pre-existing WSDL, use that.
                if (isUseUserWSDL()) {
                        printUserWSDL(out, null, requestIP);
                        return;
                }
...
{code}

"useOriginalwsdl" is a parameter in the services.xml and is set to "true", 
therefor

{code:java}
        public void printUserWSDL(OutputStream out, String wsdlName, String ip)
                        throws AxisFault {
                Definition definition = null;
                // first find the correct wsdl definition
                Parameter wsdlParameter = 
getParameter(WSDLConstants.WSDL_4_J_DEFINITION);
                if (wsdlParameter != null) {
                        definition = (Definition) wsdlParameter.getValue();
                }

                if (definition != null) {
                        try {
                                
printDefinitionObject(getWSDLDefinition(definition, wsdlName),
                                                out, ip);
                        } catch (WSDLException e) {
                                throw AxisFault.makeFault(e);
                        }
                } else {
                        printWSDLError(out);
                }

        }
{code}

is called. 

There seems to be no way, that

{code:java}
getParameter(WSDLConstants.WSDL_4_J_DEFINITION)
{code}

ever returns a not null "Parameter object" in this scenario, therefor the 
"printWSDLError()" is called and the error message is returned to the caller.

This bug is easily reproducable in any scenario.




--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to