[ 
https://issues.apache.org/jira/browse/CXF-4917?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kou, Zhi Qiang closed CXF-4917.
-------------------------------

    Resolution: Duplicate

Due to network issue I thought the first issue submit was failed. Close this 
one as duplicated. Sorry for that.
                
> Cannot load xsd schema file when accessing "?wsdl" with AutoRedirect turned on
> ------------------------------------------------------------------------------
>
>                 Key: CXF-4917
>                 URL: https://issues.apache.org/jira/browse/CXF-4917
>             Project: CXF
>          Issue Type: Bug
>          Components: Transports
>    Affects Versions: 2.6.2
>         Environment: windows
>            Reporter: Kou, Zhi Qiang
>
> =============
> Problem Description:
> =============
> The scenario is trying to access wsdl file from remote service provider using 
> URL as "http://localhost:9083/TestWeb/HelloService?wsdl";. The remote service 
> redirect the request to URL 
> "http://localhost:9083/TestWeb/HelloService/HelloService.wsdl";.
> I turned on AutoRedirect by calling method 
> "HTTPClientPolicy.setAutoRedirect(true)" in CXF. The auto redirection works 
> and WSDL file is loaded successfully.
> However, inside of the WSDL file it imports another XSD schema file which is 
> in the same folder as WSDL file on remote server.
> <xsd:schema>
> <xsd:import namespace="http://hello.jaxws.sample.com/"; 
> schemaLocation="HelloService_schema1.xsd"/>
> </xsd:schema>
> CXF tries to load this XSD file, but it use the original URL 
> "http://localhost:9083/TestWeb/HelloService?wsdl"; as base URI, and got the 
> wrong target address as 
> "http://localhost:9083/TestWeb/HelloService_schema1.xsd";. Obviously it failed 
> since the XSD file is not there.
> Actually if CXF use the new URL after auto redirect as base URI, it will get 
> the correct URL for XSD file, in this case it should be 
> "http://localhost:9083/TestWeb/HelloService/HelloService_schema1.xsd";.
> =============
> Investigation
> =============
> In method TransportURIResolver.resolve(String curUri, String baseUri):
>                     c.prepare(message);
>                     c.close(message);
>                     InputStream ins = exch.get(InputStream.class);
>                     resourceOpened.addElement(ins);
>                     InputSource src = new InputSource(ins);
>                     src.setPublicId(base.toString());
>                     src.setSystemId(base.toString());
>                     lastestImportUri = base.toString();
> The actual redirect happens in method HTTPConduit.redirectRetransmit(...) 
> when "c.close(message)" above is invoked. However TransportURIResolver has no 
> idea if redirect happens or not. So it still save the original URI (the 
> variable base) to publicId and systemId and lastestImportUri. Later when it 
> tries to get XSD file these info will be used as base URI.
> To resolve this problem I suggest we get the new URL after redirect, and save 
> it as publicId, systemId, or lastestImportUri. And use it as future base URI.
> Per my investigation the new URL after redirect can be retrieved from message 
> object:
>                     java.net.HttpURLConnection conn = 
> (java.net.HttpURLConnection)message.get("http.connection");
>                     String newURL = conn.getURL().toURI().toString();
> The problem is at this place it does not know if redirect happened or not. If 
> it does not happen, the returned URL should be the same as original base URI.
> Could somebody help to review this logic please? Is there any object for this 
> proposed change? Any suggestion are welcome. Thank you!
> Regards,
> Eric
>  

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to