Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 54439ffb authored by David Luhmer's avatar David Luhmer Committed by GitHub
Browse files

Merge pull request #204 from desperateCoder/master

Provide HTTP-Header information on demand
parents eb4b1f20 e16cdea6
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -201,6 +201,10 @@ AccountImporter.getSingleSignOnAccount(context, accountName);
        @GET("user")
        Observable<UserInfo> user();

        // use ParsedResponse, in case you also need the response headers. Works currently only for Observable calls.
        @GET("user")
        Observable<ParsedResponse<UserInfo>> user();

        @POST("feeds")
        Call<List<Feed>> createFeed(@Body Map<String, Object> feedMap);

+27 −22
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.google.gson.Gson;
import com.nextcloud.android.sso.aidl.NextcloudRequest;
import com.nextcloud.android.sso.model.SingleSignOnAccount;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
@@ -47,7 +48,6 @@ public class NextcloudAPI {
    private NetworkRequest networkRequest;
    private Gson gson;


    @Documented
    @Target(METHOD)
    @Retention(RUNTIME)
@@ -91,17 +91,40 @@ public class NextcloudAPI {
        });
    }

    public <T> Observable<ParsedResponse<T>> performRequestObservableV2(final Type type, final NextcloudRequest request) {
        return Observable.fromPublisher( s-> {
            try {
                Response response = performNetworkRequestV2(request);
                s.onNext(ParsedResponse.of(convertStreamToTargetEntity(response.getBody(), type), response.getPlainHeaders()));
                s.onComplete();
            } catch (Exception e) {
                s.onError(e);
            }
        });
    }

    public <T> T performRequest(final @NonNull Type type, NextcloudRequest request) throws Exception {
        Log.d(TAG, "performRequest() called with: type = [" + type + "], request = [" + request + "]");
        return convertStreamToTargetEntity(performNetworkRequest(request), type);
    }

    public <T> T performRequestV2(final @NonNull Type type, NextcloudRequest request) throws Exception {
        Log.d(TAG, "performRequestV2() called with: type = [" + type + "], request = [" + request + "]");
        Response response = performNetworkRequestV2(request);
        return convertStreamToTargetEntity(response.getBody(), type);
    }

    private <T> T convertStreamToTargetEntity(InputStream inputStream, Type targetEntity) throws IOException {
        T result = null;
        try (InputStream os = performNetworkRequest(request);
        try (InputStream os = inputStream;
             Reader targetReader = new InputStreamReader(os)) {
            if (type != Void.class) {
                result = gson.fromJson(targetReader, type);
            if (targetEntity != Void.class) {
                result = gson.fromJson(targetReader, targetEntity);
                /*
                if (result != null) {
                    Log.d(TAG, result.toString());
                }
                */
            }
        }
        return result;
@@ -119,24 +142,6 @@ public class NextcloudAPI {
        return networkRequest.performNetworkRequest(request, request.getBodyAsStream());
    }

    public Response performRequestV2(final @NonNull Type type, NextcloudRequest request) throws Exception {
        Log.d(TAG, "performRequestV2() called with: type = [" + type + "], request = [" + request + "]");

        Response result = null;
        Response response = performNetworkRequestV2(request);
        Reader targetReader = new InputStreamReader(response.getBody());

        if (type != Void.class) {
            result = gson.fromJson(targetReader, type);
            if (result != null) {
                Log.d(TAG, result.toString());
            }

        }
        return result;
    }


    /**
     * The InputStreams needs to be closed after reading from it
     *
+11 −4
Original line number Diff line number Diff line
@@ -179,20 +179,27 @@ public class NextcloudRetrofitServiceMethod<T> {
                // Streaming
                if(typeArgument == ResponseBody.class) {
                    return (T) Observable.just(Okhttp3Helper.getResponseBodyFromRequest(nextcloudAPI, request));
                } else {
                    return (T) nextcloudAPI.performRequestObservable(typeArgument, request);
                } else if (typeArgument instanceof ParameterizedType) {
                    ParameterizedType innerType = (ParameterizedType) typeArgument;
                    Type innerOwnerType = innerType.getRawType();
                    if(innerOwnerType == ParsedResponse.class) {
                        return (T) nextcloudAPI.performRequestObservableV2(innerType.getActualTypeArguments()[0], request);
                    }
                }
                //fallback
                return (T) nextcloudAPI.performRequestObservableV2(typeArgument, request).map(r -> r.getResponse());

            } else if(ownerType == Call.class) {
                Type typeArgument = type.getActualTypeArguments()[0];
                return (T) Retrofit2Helper.WrapInCall(nextcloudAPI, request, typeArgument);
            }
        } else if(this.returnType == Observable.class) {
            return (T) nextcloudAPI.performRequestObservable(Object.class, request);
            return (T) nextcloudAPI.performRequestObservableV2(Object.class, request).map(r -> r.getResponse());
        } else if (this.returnType == Completable.class) {
            return (T) ReactivexHelper.wrapInCompletable(nextcloudAPI, request);
        }

        return nextcloudAPI.performRequest(this.returnType, request);
        return nextcloudAPI.performRequestV2(this.returnType, request);
    }

    private void addHeader(NextcloudRequest.Builder rBuilder, String key, Object value) {
+35 −0
Original line number Diff line number Diff line
package com.nextcloud.android.sso.api;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class ParsedResponse <T> {
    private T response;
    private Map<String, String> headers = new HashMap<>();

    public ParsedResponse(T response, ArrayList<AidlNetworkRequest.PlainHeader> headers) {
        this.response = response;
        if (headers!= null) {
            for (AidlNetworkRequest.PlainHeader header : headers) {
                this.headers.put(header.getName(), header.getValue());
            }
        }
    }

    public static <T> ParsedResponse<T> of(T data) {
        return new ParsedResponse<>(data, null);
    }

    public static <T> ParsedResponse<T> of(T data, ArrayList<AidlNetworkRequest.PlainHeader> headers) {
        return new ParsedResponse<T>(data, headers);
    }

    public T getResponse() {
        return response;
    }

    public Map<String, String> getHeaders() {
        return headers;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ public final class Okhttp3Helper {
            InputStream os = nextcloudAPI.performNetworkRequestV2(request).getBody();
            return ResponseBody.create(null, 0, new BufferedSourceSSO(os));
        } catch (Exception e) {
            Log.e(TAG, "[getResponseBodyFromRequest] encountered a problem", e);
            Log.e(TAG, "[getResponseBodyFromRequestV2] encountered a problem", e);
        }
        return ResponseBody.create(null, "");
    }
Loading