[ 
https://issues.apache.org/jira/browse/AXIS2-2635?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12505011
 ] 

Glen Daniels commented on AXIS2-2635:
-------------------------------------

Tricky one.  I agree that the solution definitely involves making sure SOME 
kind of error happens on the client.  Coincidentally we've been working on 
fault handling in various places in the Axis2 framework at the hackathon, so 
perhaps we'll get around to trying something like this.  I'm a little torn as 
to what to do - the simplest approach would be just to cut off the output when 
the error happens and let the client deal with malformed XML.  However, there's 
also a part of me that rather likes injecting the fault there, so that you can 
actually tell what's going on by tracing the message.

We could go so far as to have some kind of "flag" element that indicates to 
Axiom that the document currently being parsed should be thrown away and the 
remainder of the content is a fault... but it might be expensive constantly 
checking for that QName while we parse.

For now I'd propose we adopt the simple solution where the error gets logged on 
the server and output is simply truncated. What do you guys think?


> Exception in XML serialization causes malformed/corrupted response
> ------------------------------------------------------------------
>
>                 Key: AXIS2-2635
>                 URL: https://issues.apache.org/jira/browse/AXIS2-2635
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 1.2, 1.1.1
>         Environment: Windows Vista, Tomcat 5.5.20, JDK 1.5.0_10
>            Reporter: Alan Xu
>            Assignee: Glen Daniels
>            Priority: Blocker
>
> Hi there,
> We have a simple SOAP layer that returns data pulled from the DB using Axis.  
> Nothing special here.
> In our testing, one of the objects happened to have an invalid XML 1.0 
> character (0x10) in its description field.  As it's not an application Fault 
> (our application currently doesn't check for it.  It no doubt should, 
> obviously), Axis2 wasn't aware of it until it's notified by the Woodstox 
> BufferingXMLWriter of an invalid character (through IOException).  Axis2 
> caught the exception (at , and raised an AxisFault.  It then proceeded to 
> send the Fault as its own message (envelope) back to the client.  All is 
> well, except that Axis2 was in the middle of writing out response provided by 
> the business application.  That led to a corrupted byte stream that contained 
> a partial, not well-formed envelope, followed immediately by the Fault 
> envelope.  Something to the effect of a purging (not flushing) to clear the 
> output stream before sending out the Fault message would seem desirable.
> It may not be so bad if the client receives such a corrupted stream, and 
> throws some sort of error.  The Fault message becomes meaningless, obviously, 
> which isn't great either.  But, what's worse is that the Axis2 client 
> (ServiceClient.sendReceive) actually was able to parse the corrupted byte 
> stream, and somehow considered the Fault message be the content of the last 
> XML element that contained the invalid character.  Now, that's really bad.
> This may have been logged in JIRA, but I couldn't seem to find it.
> -Alan
> Stack track of the exception caught by Axis2 during serialization:
>  com.ctc.wstx.exc.WstxIOException: Invalid white space character (0x10) in 
> text to output
>       at 
> com.ctc.wstx.sw.BaseStreamWriter.writeCharacters(BaseStreamWriter.java:520)
>       at 
> org.apache.axiom.om.impl.llom.OMTextImpl.writeOutput(OMTextImpl.java:209)
>       at 
> org.apache.axiom.om.impl.llom.OMTextImpl.internalSerializeLocal(OMTextImpl.java:368)
>       at 
> org.apache.axiom.om.impl.llom.OMTextImpl.internalSerialize(OMTextImpl.java:197)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:766)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:750)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:766)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:750)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:766)
>       at 
> org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerialize(OMSourcedElementImpl.java:564)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:750)
>       at 
> org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerialize(OMSourcedElementImpl.java:551)
>       at 
> org.apache.axiom.om.impl.llom.OMSourcedElementImpl.serialize(OMSourcedElementImpl.java:592)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.toString(OMElementImpl.java:907)
>       ... 30 more
> Caused by: java.io.IOException: Invalid white space character (0x10) in text 
> to output
>       at com.ctc.wstx.sw.XmlWriter.throwInvalidChar(XmlWriter.java:545)
>       at 
> com.ctc.wstx.sw.BufferingXmlWriter.writeCharacters(BufferingXmlWriter.java:453)
>       at 
> com.ctc.wstx.sw.BaseStreamWriter.writeCharacters(BaseStreamWriter.java:518)
>       ... 43 more
> This is the call stack from Eclipse debugger:
> CoyoteOutputStream.write(byte[], int, int) line: 88   
> UTF8Writer.flush() line: 96   
> BufferingXmlWriter.flush() line: 214  
> SimpleNsStreamWriter(BaseStreamWriter).flush() line: 311      
> MTOMXMLStreamWriter.flush() line: 115 
> SOAPEnvelopeImpl(OMNodeImpl).serializeAndConsume(OutputStream, 
> OMOutputFormat) line: 419      
> SOAPMessageFormatter.writeTo(MessageContext, OMOutputFormat, OutputStream, 
> boolean) line: 55  
> CommonsHTTPTransportSender.sendUsingOutputStream(MessageContext, 
> OMOutputFormat) line: 275    
> CommonsHTTPTransportSender.invoke(MessageContext) line: 203   
> AxisEngine.sendFault(MessageContext) line: 533        
> AxisServlet.handleFault(MessageContext, OutputStream, AxisFault) line: 393    
> AxisServlet.processAxisFault(MessageContext, HttpServletResponse, 
> OutputStream, AxisFault) line: 355  
> AxisServlet.doPost(HttpServletRequest, HttpServletResponse) line: 152 
> AxisServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) 
> line: 709   
> AxisServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 802   
> ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) 
> line: 252    
> ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 173    
> HibernateFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 
> 95       
> ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) 
> line: 202    
> ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 173    
> StandardWrapperValve.invoke(Request, Response) line: 213      
> StandardContextValve.invoke(Request, Response) line: 178      
> StandardHostValve.invoke(Request, Response) line: 126 
> ErrorReportValve.invoke(Request, Response) line: 105  
> FastCommonAccessLogValve.invoke(Request, Response) line: 495  
> StandardEngineValve.invoke(Request, Response) line: 107       
> CoyoteAdapter.service(Request, Response) line: 148    
> Http11Processor.process(InputStream, OutputStream) line: 869  
> Http11Protocol$JmxHttp11ConnectionHandler(Http11BaseProtocol$Http11ConnectionHandler).processConnection(TcpConnection,
>  Object[]) line: 664    
> PoolTcpEndpoint.processSocket(Socket, TcpConnection, Object[]) line: 527      
> LeaderFollowerWorkerThread.runIt(Object[]) line: 80   
> ThreadPool$ControlRunnable.run() line: 684    
> ThreadWithAttributes(Thread).run() line: 595  
> What got sent over the wire back to the client:
> <soapenv:Body 
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";><ns2:getSKUListResponse
>  xmlns:ns2="http://mds.adserver.massive.com/xsd";><ns2:record><s41:createdOn 
> xmlns:s41="http://types.mds.adserver.massive.com/";>2005-09-20T19:56:21.000Z</s41:createdOn><s42:description
>  
> xmlns:s42="http://types.mds.adserver.massive.com/";>x</s42:description><s43:id 
> xmlns:s43="http://types.mds.adserver.massive.com/";>51</s43:id><s44:modifiedOn 
> xmlns:s44="http://types.mds.adserver.massive.com/";>2005-09-23T17:51:37.000Z</s44:modifiedOn><s45:name
>  
> xmlns:s45="http://types.mds.adserver.massive.com/";>EveryoneSKU</s45:name><s46:enabled
>  
> xmlns:s46="http://types.mds.adserver.massive.com/";>true</s46:enabled></ns2:record><ns2:record><s47:createdOn
>  
> xmlns:s47="http://types.mds.adserver.massive.com/";>2005-09-20T19:55:23.000Z</s47:createdOn><s48:description
>  xmlns:s48="http://types.mds.adserver.massive.com/";><xml version='1.0' 
> encoding='UTF-8'?><soapenv:Envelope><soapenv:Body><soapenv:Fault><faultcode>soapenv:Client</faultcode><faultstring>Invalid
>  white space character (0x10) in text to output</faultstring><detail 
> /></soapenv:Fault></soapenv:Body></soapenv:Envelope>
> What the client (Axis2 ServiceClient) thought it was getting:
> <soapenv:Body 
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";><ns2:getSKUListResponse
>  xmlns:ns2="http://mds.adserver.massive.com/xsd";><ns2:record><s41:createdOn 
> xmlns:s41="http://types.mds.adserver.massive.com/";>2005-09-20T19:56:21.000Z</s41:createdOn><s42:description
>  
> xmlns:s42="http://types.mds.adserver.massive.com/";>x</s42:description><s43:id 
> xmlns:s43="http://types.mds.adserver.massive.com/";>51</s43:id><s44:modifiedOn 
> xmlns:s44="http://types.mds.adserver.massive.com/";>2005-09-23T17:51:37.000Z</s44:modifiedOn><s45:name
>  
> xmlns:s45="http://types.mds.adserver.massive.com/";>EveryoneSKU</s45:name><s46:enabled
>  
> xmlns:s46="http://types.mds.adserver.massive.com/";>true</s46:enabled></ns2:record><ns2:record><s47:createdOn
>  
> xmlns:s47="http://types.mds.adserver.massive.com/";>2005-09-20T19:55:23.000Z</s47:createdOn><s48:description
>  xmlns:s48="http://types.mds.adserver.massive.com/";> version='1.0' 
> encoding='UTF-8'?><soapenv:Envelope><soapenv:Body><soapenv:Fault><faultcode>soapenv:Client</faultcode><faultstring>Invalid
>  white space character (0x10) in text to output</faultstring><detail 
> /></soapenv:Fault></soapenv:Body></soapenv:Envelope></s48:description></ns2:record></ns2:getSKUListResponse></soapenv:Body>

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to