[
https://issues.apache.org/jira/browse/SHINDIG-695?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12648593#action_12648593
]
Zsolt Bányai commented on SHINDIG-695:
--------------------------------------
I cannot upload my patch, but this is the working version (tested on win,
linux, osx):
@SuppressWarnings("unchecked")
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
httpStatusCode = in.readInt();
Map<String, List<String>> headerCopy = (Map<String,
List<String>>)in.readObject();
int bodyLength = in.readInt();
responseBytes = new byte[bodyLength];
int cnt, offset = 0;
while ((cnt = in.read(responseBytes, offset, bodyLength)) > 0) {
offset += cnt;
bodyLength -= cnt;
}
if (offset != responseBytes.length) {
throw new IOException("Invalid body! Expected length = " +
responseBytes.length + ", bytes readed = " + offset + ".");
}
date = getAndUpdateDate(headerCopy);
encoding = getAndUpdateEncoding(headerCopy, responseBytes);
headers = Collections.unmodifiableMap(headerCopy);
metadata = Collections.emptyMap();
}
> HttpResponse's externalizable implementation not works on Linux/Unix systems
> ----------------------------------------------------------------------------
>
> Key: SHINDIG-695
> URL: https://issues.apache.org/jira/browse/SHINDIG-695
> Project: Shindig
> Issue Type: Bug
> Components: Gadget Rendering Server (Java)
> Reporter: Zsolt Bányai
> Priority: Blocker
>
> In readExternal(ObjectInput in) it cannot read the whole content at the first
> time so the responseString could be truncated.
> One of the right ways:
> /**
> * Expected layout:
> *
> * int - status code
> * Map<String, List<String>> - headers
> * int - length of body
> * byte array - body, of previously specified length
> */
> @SuppressWarnings("unchecked")
> public void readExternal(ObjectInput in) throws IOException,
> ClassNotFoundException {
> httpStatusCode = in.readInt();
> Map<String, List<String>> headerCopy = (Map<String,
> List<String>>)in.readObject();
> int bodyLength = in.readInt();
> responseBytes = new byte[bodyLength];
> int cnt, offset = 0;
> while ((cnt = in.read(responseBytes, offset, bodyLength)) >= 0) {
> //cnt cannot be 0, because: "This method will block until some input is
> available.", but can be lower than bodyLength
> offset += cnt;
> bodyLength -= cnt;
> }
> if (offset != responseBytes.length) {
> throw new IOException("Invalid body! Expected length = " +
> responseBytes.length + ", bytes readed = " + offset + ".");
> }
> date = getAndUpdateDate(headerCopy);
> encoding = getAndUpdateEncoding(headerCopy, responseBytes);
> headers = Collections.unmodifiableMap(headerCopy);
> metadata = Collections.emptyMap();
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.