|
@@ -9,7 +9,6 @@ import com.owncloud.android.authentication.AccountUtils;
|
|
|
import com.owncloud.android.lib.common.OwnCloudAccount;
|
|
|
import com.owncloud.android.lib.common.OwnCloudClient;
|
|
|
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
|
|
|
-import com.owncloud.android.ui.asynctasks.AsyncTaskHelper;
|
|
|
|
|
|
import org.apache.commons.httpclient.HttpMethodBase;
|
|
|
import org.apache.commons.httpclient.NameValuePair;
|
|
@@ -19,11 +18,14 @@ import org.apache.commons.httpclient.methods.PostMethod;
|
|
|
import org.apache.commons.httpclient.methods.PutMethod;
|
|
|
import org.apache.commons.httpclient.methods.StringRequestEntity;
|
|
|
|
|
|
+import java.io.ByteArrayInputStream;
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
import java.io.ObjectInputStream;
|
|
|
+import java.io.ObjectOutputStream;
|
|
|
+import java.io.Serializable;
|
|
|
import java.util.Map;
|
|
|
-import java.util.concurrent.Callable;
|
|
|
|
|
|
/**
|
|
|
* Created by david on 29.06.17.
|
|
@@ -55,31 +57,48 @@ public class InputStreamBinder extends IInputStreamService.Stub {
|
|
|
// read the input
|
|
|
final InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(input);
|
|
|
|
|
|
- try {
|
|
|
- final NextcloudRequest request = deserializeObjectAndCloseStream(is);
|
|
|
-
|
|
|
- InputStream resultStream = processRequest(request);
|
|
|
- try {
|
|
|
- return ParcelFileDescriptorUtil.pipeFrom(resultStream, new IThreadListener() {
|
|
|
- @Override
|
|
|
- public void onThreadFinished(Thread thread) {
|
|
|
- Log.d(TAG, "Done sending result");
|
|
|
- }
|
|
|
- });
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
+ Exception exception = null;
|
|
|
+ InputStream httpStream = new InputStream() {
|
|
|
+ @Override
|
|
|
+ public int read() throws IOException {
|
|
|
+ return 0;
|
|
|
}
|
|
|
- } catch (IOException e) {
|
|
|
- Log.d(TAG, "Test #1 failed");
|
|
|
+ };
|
|
|
+ try {
|
|
|
+ // Start request and catch exceptions
|
|
|
+ NextcloudRequest request = deserializeObjectAndCloseStream(is);
|
|
|
+ httpStream = processRequest(request);
|
|
|
+ } catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
- } catch (ClassNotFoundException e) {
|
|
|
+ exception = e;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // Write exception to the stream followed by the actual network stream
|
|
|
+ InputStream exceptionStream = serializeObjectToInputStream(exception);
|
|
|
+ InputStream resultStream = new java.io.SequenceInputStream(exceptionStream, httpStream);
|
|
|
+ return ParcelFileDescriptorUtil.pipeFrom(resultStream, new IThreadListener() {
|
|
|
+ @Override
|
|
|
+ public void onThreadFinished(Thread thread) {
|
|
|
+ Log.d(TAG, "Done sending result");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (IOException e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ private <T extends Serializable> ByteArrayInputStream serializeObjectToInputStream(T obj) throws IOException {
|
|
|
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
|
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
|
|
|
+ oos.writeObject(obj);
|
|
|
+ oos.flush();
|
|
|
+ oos.close();
|
|
|
+ return new ByteArrayInputStream(baos.toByteArray());
|
|
|
+ }
|
|
|
|
|
|
- private <T> T deserializeObjectAndCloseStream(InputStream is) throws IOException, ClassNotFoundException {
|
|
|
+ private <T extends Serializable> T deserializeObjectAndCloseStream(InputStream is) throws IOException, ClassNotFoundException {
|
|
|
ObjectInputStream ois = new ObjectInputStream(is);
|
|
|
T result = (T) ois.readObject();
|
|
|
is.close();
|
|
@@ -87,80 +106,66 @@ public class InputStreamBinder extends IInputStreamService.Stub {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private InputStream processRequest(final NextcloudRequest request) {
|
|
|
- try {
|
|
|
- return AsyncTaskHelper.executeBlockingRequest(new Callable<InputStream>() {
|
|
|
- @Override
|
|
|
- public InputStream call() throws Exception {
|
|
|
- Account account = AccountUtils.getOwnCloudAccountByName(context, request.accountName); // TODO handle case that account is not found!
|
|
|
- OwnCloudAccount ocAccount = new OwnCloudAccount(account, context);
|
|
|
- OwnCloudClient client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(ocAccount, context);
|
|
|
-
|
|
|
- //OwnCloudVersion version = AccountUtils.getServerVersion(account);
|
|
|
- //client.setOwnCloudVersion(version);
|
|
|
-
|
|
|
- // TODO do some checks if url is correct!! (prevent ../ in url etc..
|
|
|
- request.url = client.getBaseUri() + request.url;
|
|
|
-
|
|
|
- //AccountManagerService.INetworkInterface network = (stream) ? new AccountManagerService.StreamingRequest(port) : new AccountManagerService.PlainRequest();
|
|
|
-
|
|
|
- HttpMethodBase method = null;
|
|
|
-
|
|
|
- switch (request.method) {
|
|
|
- case "GET":
|
|
|
- method = new GetMethod(request.url);
|
|
|
- break;
|
|
|
-
|
|
|
- case "POST":
|
|
|
- method = new PostMethod(request.url);
|
|
|
- if (request.requestBody != null) {
|
|
|
- StringRequestEntity requestEntity = new StringRequestEntity(
|
|
|
- request.requestBody,
|
|
|
- "application/json",
|
|
|
- "UTF-8");
|
|
|
- ((PostMethod) method).setRequestEntity(requestEntity);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case "PUT":
|
|
|
- method = new PutMethod(request.url);
|
|
|
- if (request.requestBody != null) {
|
|
|
- StringRequestEntity requestEntity = new StringRequestEntity(
|
|
|
- request.requestBody,
|
|
|
- "application/json",
|
|
|
- "UTF-8");
|
|
|
- ((PutMethod) method).setRequestEntity(requestEntity);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case "DELETE":
|
|
|
- method = new DeleteMethod(request.url);
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- throw new Exception("Unexpected type!!");
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- method.setQueryString(convertMapToNVP(request.parameter));
|
|
|
- method.addRequestHeader("OCS-APIREQUEST", "true");
|
|
|
-
|
|
|
- //throw new Exception("Test!!!");
|
|
|
-
|
|
|
- int status = client.executeMethod(method);
|
|
|
- if (status == 200) {
|
|
|
- return method.getResponseBodyAsStream();
|
|
|
- } else {
|
|
|
- throw new Exception("Request returned code: " + status);
|
|
|
- }
|
|
|
+ private InputStream processRequest(final NextcloudRequest request) throws Exception {
|
|
|
+ Account account = AccountUtils.getOwnCloudAccountByName(context, request.accountName); // TODO handle case that account is not found!
|
|
|
+ OwnCloudAccount ocAccount = new OwnCloudAccount(account, context);
|
|
|
+ OwnCloudClient client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(ocAccount, context);
|
|
|
+
|
|
|
+ //OwnCloudVersion version = AccountUtils.getServerVersion(account);
|
|
|
+ //client.setOwnCloudVersion(version);
|
|
|
+
|
|
|
+ // TODO do some checks if url is correct!! (prevent ../ in url etc..
|
|
|
+ request.url = client.getBaseUri() + request.url;
|
|
|
+
|
|
|
+ //AccountManagerService.INetworkInterface network = (stream) ? new AccountManagerService.StreamingRequest(port) : new AccountManagerService.PlainRequest();
|
|
|
+
|
|
|
+ HttpMethodBase method = null;
|
|
|
+
|
|
|
+ switch (request.method) {
|
|
|
+ case "GET":
|
|
|
+ method = new GetMethod(request.url);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "POST":
|
|
|
+ method = new PostMethod(request.url);
|
|
|
+ if (request.requestBody != null) {
|
|
|
+ StringRequestEntity requestEntity = new StringRequestEntity(
|
|
|
+ request.requestBody,
|
|
|
+ "application/json",
|
|
|
+ "UTF-8");
|
|
|
+ ((PostMethod) method).setRequestEntity(requestEntity);
|
|
|
}
|
|
|
- });
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- //TODO return exception to calling client app!
|
|
|
- //return exceptionToInputStream(null);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "PUT":
|
|
|
+ method = new PutMethod(request.url);
|
|
|
+ if (request.requestBody != null) {
|
|
|
+ StringRequestEntity requestEntity = new StringRequestEntity(
|
|
|
+ request.requestBody,
|
|
|
+ "application/json",
|
|
|
+ "UTF-8");
|
|
|
+ ((PutMethod) method).setRequestEntity(requestEntity);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "DELETE":
|
|
|
+ method = new DeleteMethod(request.url);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ throw new Exception("Unexpected type!!");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ method.setQueryString(convertMapToNVP(request.parameter));
|
|
|
+ method.addRequestHeader("OCS-APIREQUEST", "true");
|
|
|
+
|
|
|
+ int status = client.executeMethod(method);
|
|
|
+ if (status == 200) {
|
|
|
+ return method.getResponseBodyAsStream();
|
|
|
+ } else {
|
|
|
+ throw new Exception("Request returned code: " + status);
|
|
|
}
|
|
|
- return null;
|
|
|
}
|
|
|
|
|
|
}
|