Browse Source

axmlrpc: fix: consume http entities after parsing them.

pull/350/head
Felipe Barriga Richards 8 years ago
parent
commit
919ce21060
  1. 33
      app/src/main/java/de/timroes/axmlrpc/ResponseParser.java
  2. 2
      app/src/main/java/de/timroes/axmlrpc/XMLRPCClient.java

33
app/src/main/java/de/timroes/axmlrpc/ResponseParser.java

@ -1,9 +1,12 @@
package de.timroes.axmlrpc; package de.timroes.axmlrpc;
import de.timroes.axmlrpc.serializer.SerializerHandler; import de.timroes.axmlrpc.serializer.SerializerHandler;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map; import java.util.Map;
import org.apache.http.HttpEntity;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlPullParserFactory;
@ -18,6 +21,30 @@ class ResponseParser {
private static final String FAULT_CODE = "faultCode"; private static final String FAULT_CODE = "faultCode";
private static final String FAULT_STRING = "faultString"; private static final String FAULT_STRING = "faultString";
/**
* Deallocate Http Entity and close streams
*/
private static void consumeHttpEntity(InputStream response, HttpEntity entity) {
// Ideally we should use EntityUtils.consume(), introduced in apache http utils 4.1 - not available in
// Android yet
if (entity != null) {
try {
entity.consumeContent();
} catch (IOException e) {
// ignore exception (could happen if Content-Length is wrong)
}
}
if (response != null) {
try {
response.close();
} catch (Exception e) {
// ignore exception
}
}
}
/** /**
* The given InputStream must contain the xml response from an xmlrpc server. * The given InputStream must contain the xml response from an xmlrpc server.
* This method extract the content of it as an object. * This method extract the content of it as an object.
@ -27,7 +54,7 @@ class ResponseParser {
* @throws XMLRPCException Will be thrown whenever something fails. * @throws XMLRPCException Will be thrown whenever something fails.
* @throws XMLRPCServerException Will be thrown, if the server returns an error. * @throws XMLRPCServerException Will be thrown, if the server returns an error.
*/ */
public Object parse(InputStream response) throws XMLRPCException { public Object parse(InputStream response, HttpEntity entity) throws XMLRPCException {
try { try {
XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser(); XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();
pullParser.setInput(response, "UTF-8"); pullParser.setInput(response, "UTF-8");
@ -45,11 +72,13 @@ class ResponseParser {
// no parser.require() here since its called in XMLRPCSerializer.deserialize() below // no parser.require() here since its called in XMLRPCSerializer.deserialize() below
// deserialize result // deserialize result
Object obj = SerializerHandler.getDefault().deserialize(pullParser); Object obj = SerializerHandler.getDefault().deserialize(pullParser);
consumeHttpEntity(response, entity);
return obj; return obj;
} else if (tag.equals(XMLRPCClient.FAULT)) { } else if (tag.equals(XMLRPCClient.FAULT)) {
// fault response // fault response
pullParser.nextTag(); // TAG_VALUE (<value>) pullParser.nextTag(); // TAG_VALUE (<value>)
Map<String, Object> map = (Map<String, Object>) SerializerHandler.getDefault().deserialize(pullParser); Map<String, Object> map = (Map<String, Object>) SerializerHandler.getDefault().deserialize(pullParser);
consumeHttpEntity(response, entity);
//Check that required tags are in the response //Check that required tags are in the response
if (!map.containsKey(FAULT_STRING) || !map.containsKey(FAULT_CODE)) { if (!map.containsKey(FAULT_STRING) || !map.containsKey(FAULT_CODE)) {
@ -61,8 +90,10 @@ class ResponseParser {
} }
} catch (XmlPullParserException ex) { } catch (XmlPullParserException ex) {
consumeHttpEntity(response, entity);
throw new XMLRPCException("Error parsing response.", ex); throw new XMLRPCException("Error parsing response.", ex);
} catch (Exception ex) { } catch (Exception ex) {
consumeHttpEntity(response, entity);
if(ex instanceof XMLRPCServerException) if(ex instanceof XMLRPCServerException)
throw (XMLRPCServerException)ex; throw (XMLRPCServerException)ex;
else else

2
app/src/main/java/de/timroes/axmlrpc/XMLRPCClient.java

@ -444,7 +444,7 @@ public class XMLRPCClient {
} }
} }
return responseParser.parse(istream); return responseParser.parse(istream, entity);
} catch(SocketTimeoutException ex) { } catch(SocketTimeoutException ex) {
throw new XMLRPCTimeoutException("The XMLRPC call timed out."); throw new XMLRPCTimeoutException("The XMLRPC call timed out.");

Loading…
Cancel
Save