Search in sources :

Example 1 with Code

use of com.google.firebase.functions.FirebaseFunctionsException.Code in project firebase-android-sdk by firebase.

the class FirebaseFunctions method call.

/**
 * Calls a Callable HTTPS trigger endpoint.
 *
 * @param name The name of the HTTPS trigger.
 * @param data Parameters to pass to the function. Can be anything encodable as JSON.
 * @param context Metadata to supply with the function call.
 * @return A Task that will be completed when the request is complete.
 */
private Task<HttpsCallableResult> call(@NonNull String name, @Nullable Object data, HttpsCallableContext context, HttpsCallOptions options) {
    Preconditions.checkNotNull(name, "name cannot be null");
    URL url = getURL(name);
    Map<String, Object> body = new HashMap<>();
    Object encoded = serializer.encode(data);
    body.put("data", encoded);
    JSONObject bodyJSON = new JSONObject(body);
    MediaType contentType = MediaType.parse("application/json");
    RequestBody requestBody = RequestBody.create(contentType, bodyJSON.toString());
    Request.Builder request = new Request.Builder().url(url).post(requestBody);
    if (context.getAuthToken() != null) {
        request = request.header("Authorization", "Bearer " + context.getAuthToken());
    }
    if (context.getInstanceIdToken() != null) {
        request = request.header("Firebase-Instance-ID-Token", context.getInstanceIdToken());
    }
    if (context.getAppCheckToken() != null) {
        request = request.header("X-Firebase-AppCheck", context.getAppCheckToken());
    }
    OkHttpClient callClient = options.apply(client);
    Call call = callClient.newCall(request.build());
    TaskCompletionSource<HttpsCallableResult> tcs = new TaskCompletionSource<>();
    call.enqueue(new Callback() {

        @Override
        public void onFailure(Call ignored, IOException e) {
            if (e instanceof InterruptedIOException) {
                FirebaseFunctionsException exception = new FirebaseFunctionsException(Code.DEADLINE_EXCEEDED.name(), Code.DEADLINE_EXCEEDED, null, e);
                tcs.setException(exception);
            } else {
                FirebaseFunctionsException exception = new FirebaseFunctionsException(Code.INTERNAL.name(), Code.INTERNAL, null, e);
                tcs.setException(exception);
            }
        }

        @Override
        public void onResponse(Call ignored, Response response) throws IOException {
            Code code = Code.fromHttpStatus(response.code());
            String body = response.body().string();
            FirebaseFunctionsException exception = FirebaseFunctionsException.fromResponse(code, body, serializer);
            if (exception != null) {
                tcs.setException(exception);
                return;
            }
            JSONObject bodyJSON;
            try {
                bodyJSON = new JSONObject(body);
            } catch (JSONException je) {
                Exception e = new FirebaseFunctionsException("Response is not valid JSON object.", Code.INTERNAL, null, je);
                tcs.setException(e);
                return;
            }
            Object dataJSON = bodyJSON.opt("data");
            // TODO: Allow "result" instead of "data" for now, for backwards compatibility.
            if (dataJSON == null) {
                dataJSON = bodyJSON.opt("result");
            }
            if (dataJSON == null) {
                Exception e = new FirebaseFunctionsException("Response is missing data field.", Code.INTERNAL, null);
                tcs.setException(e);
                return;
            }
            HttpsCallableResult result = new HttpsCallableResult(serializer.decode(dataJSON));
            tcs.setResult(result);
        }
    });
    return tcs.getTask();
}
Also used : InterruptedIOException(java.io.InterruptedIOException) OkHttpClient(okhttp3.OkHttpClient) HashMap(java.util.HashMap) URL(java.net.URL) TaskCompletionSource(com.google.android.gms.tasks.TaskCompletionSource) MediaType(okhttp3.MediaType) RequestBody(okhttp3.RequestBody) Call(okhttp3.Call) Request(okhttp3.Request) JSONException(org.json.JSONException) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) Code(com.google.firebase.functions.FirebaseFunctionsException.Code) InterruptedIOException(java.io.InterruptedIOException) JSONException(org.json.JSONException) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) Response(okhttp3.Response) Callback(okhttp3.Callback) JSONObject(org.json.JSONObject) JSONObject(org.json.JSONObject)

Example 2 with Code

use of com.google.firebase.functions.FirebaseFunctionsException.Code in project firebase-android-sdk by firebase.

the class FirebaseFunctions method call.

/**
 * Calls a Callable HTTPS trigger endpoint.
 *
 * @param name The name of the HTTPS trigger.
 * @param data Parameters to pass to the function. Can be anything encodable as JSON.
 * @param context Metadata to supply with the function call.
 * @return A Task that will be completed when the request is complete.
 */
private Task<HttpsCallableResult> call(@NonNull URL url, @Nullable Object data, HttpsCallableContext context, HttpsCallOptions options) {
    Preconditions.checkNotNull(url, "url cannot be null");
    Map<String, Object> body = new HashMap<>();
    Object encoded = serializer.encode(data);
    body.put("data", encoded);
    JSONObject bodyJSON = new JSONObject(body);
    MediaType contentType = MediaType.parse("application/json");
    RequestBody requestBody = RequestBody.create(contentType, bodyJSON.toString());
    Request.Builder request = new Request.Builder().url(url).post(requestBody);
    if (context.getAuthToken() != null) {
        request = request.header("Authorization", "Bearer " + context.getAuthToken());
    }
    if (context.getInstanceIdToken() != null) {
        request = request.header("Firebase-Instance-ID-Token", context.getInstanceIdToken());
    }
    if (context.getAppCheckToken() != null) {
        request = request.header("X-Firebase-AppCheck", context.getAppCheckToken());
    }
    OkHttpClient callClient = options.apply(client);
    Call call = callClient.newCall(request.build());
    TaskCompletionSource<HttpsCallableResult> tcs = new TaskCompletionSource<>();
    call.enqueue(new Callback() {

        @Override
        public void onFailure(Call ignored, IOException e) {
            if (e instanceof InterruptedIOException) {
                FirebaseFunctionsException exception = new FirebaseFunctionsException(Code.DEADLINE_EXCEEDED.name(), Code.DEADLINE_EXCEEDED, null, e);
                tcs.setException(exception);
            } else {
                FirebaseFunctionsException exception = new FirebaseFunctionsException(Code.INTERNAL.name(), Code.INTERNAL, null, e);
                tcs.setException(exception);
            }
        }

        @Override
        public void onResponse(Call ignored, Response response) throws IOException {
            Code code = Code.fromHttpStatus(response.code());
            String body = response.body().string();
            FirebaseFunctionsException exception = FirebaseFunctionsException.fromResponse(code, body, serializer);
            if (exception != null) {
                tcs.setException(exception);
                return;
            }
            JSONObject bodyJSON;
            try {
                bodyJSON = new JSONObject(body);
            } catch (JSONException je) {
                Exception e = new FirebaseFunctionsException("Response is not valid JSON object.", Code.INTERNAL, null, je);
                tcs.setException(e);
                return;
            }
            Object dataJSON = bodyJSON.opt("data");
            // TODO: Allow "result" instead of "data" for now, for backwards compatibility.
            if (dataJSON == null) {
                dataJSON = bodyJSON.opt("result");
            }
            if (dataJSON == null) {
                Exception e = new FirebaseFunctionsException("Response is missing data field.", Code.INTERNAL, null);
                tcs.setException(e);
                return;
            }
            HttpsCallableResult result = new HttpsCallableResult(serializer.decode(dataJSON));
            tcs.setResult(result);
        }
    });
    return tcs.getTask();
}
Also used : Call(okhttp3.Call) InterruptedIOException(java.io.InterruptedIOException) OkHttpClient(okhttp3.OkHttpClient) HashMap(java.util.HashMap) Request(okhttp3.Request) JSONException(org.json.JSONException) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) Code(com.google.firebase.functions.FirebaseFunctionsException.Code) InterruptedIOException(java.io.InterruptedIOException) JSONException(org.json.JSONException) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) Response(okhttp3.Response) TaskCompletionSource(com.google.android.gms.tasks.TaskCompletionSource) Callback(okhttp3.Callback) JSONObject(org.json.JSONObject) MediaType(okhttp3.MediaType) JSONObject(org.json.JSONObject) RequestBody(okhttp3.RequestBody)

Aggregations

TaskCompletionSource (com.google.android.gms.tasks.TaskCompletionSource)2 Code (com.google.firebase.functions.FirebaseFunctionsException.Code)2 IOException (java.io.IOException)2 InterruptedIOException (java.io.InterruptedIOException)2 MalformedURLException (java.net.MalformedURLException)2 HashMap (java.util.HashMap)2 Call (okhttp3.Call)2 Callback (okhttp3.Callback)2 MediaType (okhttp3.MediaType)2 OkHttpClient (okhttp3.OkHttpClient)2 Request (okhttp3.Request)2 RequestBody (okhttp3.RequestBody)2 Response (okhttp3.Response)2 JSONException (org.json.JSONException)2 JSONObject (org.json.JSONObject)2 URL (java.net.URL)1