Author: vsiveton Date: Sat Jun 13 13:59:38 2009 New Revision: 784394 URL: http://svn.apache.org/viewvc?rev=784394&view=rev Log: DOXIA-341: Error 503 when validate XHTML files
o refactor to use HttpClient Modified: maven/doxia/doxia/trunk/doxia-core/pom.xml maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java Modified: maven/doxia/doxia/trunk/doxia-core/pom.xml URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/pom.xml?rev=784394&r1=784393&r2=784394&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-core/pom.xml (original) +++ maven/doxia/doxia/trunk/doxia-core/pom.xml Sat Jun 13 13:59:38 2009 @@ -60,6 +60,11 @@ <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> + <dependency> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + <version>3.1</version> + </dependency> <!-- test --> </dependencies> Modified: maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java?rev=784394&r1=784393&r2=784394&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java (original) +++ maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java Sat Jun 13 13:59:38 2009 @@ -39,6 +39,12 @@ import javax.xml.XMLConstants; +import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.maven.doxia.logging.Log; import org.apache.maven.doxia.macro.MacroExecutionException; import org.apache.maven.doxia.markup.XmlMarkup; @@ -967,33 +973,68 @@ } /** - * Wrap {...@link IOUtil#toByteArray(java.io.InputStream)} to throw SAXException. + * If url is not an http/https urls, call {...@link IOUtil#toByteArray(java.io.InputStream)} to get the url + * content. + * Otherwise, call {...@link GetMethod#getResponseBody()} from HttpClient to get the http content. + * Wrap all internal exceptions to throw SAXException. * * @param url not null * @return return an array of byte * @throws SAXException if any - * @see {...@link IOUtil#toByteArray(java.io.InputStream)} */ private static byte[] toByteArray( URL url ) throws SAXException { - InputStream is = null; + if ( !( url.getProtocol().equalsIgnoreCase( "http" ) || url.getProtocol().equalsIgnoreCase( "https" ) ) ) + { + InputStream is = null; + try + { + is = url.openStream(); + if ( is == null ) + { + throw new SAXException( "Cannot open stream from the url: " + url.toString() ); + } + return IOUtil.toByteArray( is ); + } + catch ( IOException e ) + { + throw new SAXException( "IOException: " + e.getMessage(), e ); + } + finally + { + IOUtil.close( is ); + } + } + + // it is an HTTP url, using HttpClient... + HttpClient client = new HttpClient(); + GetMethod method = new GetMethod( url.toString() ); + + method.getParams().setParameter( HttpMethodParams.RETRY_HANDLER, + new DefaultHttpMethodRetryHandler( 3, false ) ); + try { - is = url.openStream(); - if ( is == null ) + int statusCode = client.executeMethod( method ); + if ( statusCode != HttpStatus.SC_OK ) { - throw new SAXException( "Cannot open stream from the url: " + url.toString() ); + throw new IOException( "Method failed: " + method.getStatusLine() ); } - return IOUtil.toByteArray( is ); + + return method.getResponseBody(); + } + catch ( HttpException e ) + { + throw new SAXException( "HttpException: Fatal protocol violation: " + e.getMessage(), e ); } catch ( IOException e ) { - throw new SAXException( "IOException: " + e.getMessage(), e ); + throw new SAXException( "IOException: Fatal transport error: " + e.getMessage(), e ); } finally { - IOUtil.close( is ); + method.releaseConnection(); } }