All Downloads are FREE. Search and download functionalities are using the official Maven repository.

co.elastic.support.rest.RestResult Maven / Gradle / Ivy

/*
 * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
 *  or more contributor license agreements. Licensed under the Elastic License
 *  2.0; you may not use this file except in compliance with the Elastic License
 *  2.0.
 */
package co.elastic.support.rest;

import co.elastic.support.util.SystemProperties;
import co.elastic.support.Constants;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.util.EntityUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class RestResult implements Cloneable {

    private static final Logger logger = LogManager.getLogger(RestResult.class);

    String responseString = "Undetermined error = check logs";
    int status = -1;
    String reason;
    boolean isRetryable;
    String url = "";

    // Sending in a response object to be processed implicitly
    // closes the response as a result. The body is either streamed directly
    // to disk or the body is stored as a string and the status retained as well.
    public RestResult(HttpResponse response, String url) {
        this.url = url;
        try {
            processCodes(response);
            responseString = EntityUtils.toString(response.getEntity());
        } catch (Exception e) {
            logger.error("Error Processing Response", e);
            throw new RuntimeException();
        } finally {
            HttpClientUtils.closeQuietly(response);
        }
    }

    public RestResult(HttpResponse response, String fileName, String url) {

        this.url = url;

        // If the query got a success status stream the result immediately to the target
        // file.
        // If not, the result should be small and contain diagnostic info so stgre it in
        // the response string.
        File output = new File(fileName);
        if (output.exists()) {
            FileUtils.deleteQuietly(output);
        }

        try (OutputStream out = new FileOutputStream(fileName)) {
            processCodes(response);
            response.getEntity().writeTo(out);
        } catch (Exception e) {
            logger.error("Error Streaming Response To OutputStream", e);
            throw new RuntimeException();
        } finally {
            HttpClientUtils.closeQuietly(response);
        }
    }

    private void processCodes(HttpResponse response) {
        status = response.getStatusLine().getStatusCode();
        if (status == 400) {
            reason = "Bad Request. Rejected";
            isRetryable = true;
        } else if (status == 401) {
            reason = "Authentication failure. Invalid login credentials.";
            isRetryable = false;
        } else if (status == 403) {
            reason = "Authorization failure or invalid license.";
            isRetryable = false;
        } else if (status == 404) {
            reason = "Endpoint does not exist.";
            isRetryable = true;
        } else {
            reason = response.getStatusLine().getReasonPhrase();
            isRetryable = true;
        }
    }

    public String formatStatusMessage(String msg) {

        if (StringUtils.isNotEmpty(msg)) {
            msg = msg + " ";
        }

        return String.format("%sStatus: %d  Reason: %s",
                msg,
                status,
                reason);
    }

    public int getStatus() {
        return status;
    }

    public String getReason() {
        return reason;
    }

    public String toString() {
        return responseString;
    }

    public void toFile(String fileName) {
        File output = new File(fileName);
        if (output.exists()) {
            FileUtils.deleteQuietly(output);
        }

        try (FileOutputStream fs = new FileOutputStream(output)) {
            IOUtils.write(reason + SystemProperties.lineSeparator + responseString, fs, Constants.UTF_8);
        } catch (Exception e) {
            logger.error("Error writing Response To OutputStream", e);
        }
    }

    public boolean isRetryable() {
        return isRetryable;
    }

    public boolean isValid() {
        if (status == 200) {
            return true;
        }
        return false;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy