Search in sources :

Example 1 with RestRequestInformation

use of org.javacord.api.util.rest.RestRequestInformation in project Javacord by BtoBastian.

the class RestRequest method executeBlocking.

/**
 * Executes the request blocking.
 *
 * @return The result of the request.
 * @throws Exception If something went wrong while executing the request.
 */
public RestRequestResult executeBlocking() throws Exception {
    api.getGlobalRatelimiter().ifPresent(ratelimiter -> {
        try {
            ratelimiter.requestQuota();
        } catch (InterruptedException e) {
            logger.warn("Encountered unexpected ratelimiter interrupt", e);
        }
    });
    Request.Builder requestBuilder = new Request.Builder();
    HttpUrl.Builder httpUrlBuilder = endpoint.getOkHttpUrl(urlParameters).newBuilder();
    queryParameters.forEach(httpUrlBuilder::addQueryParameter);
    requestBuilder.url(httpUrlBuilder.build());
    RequestBody requestBody;
    if (multipartBody != null) {
        requestBody = multipartBody;
    } else if (body != null) {
        requestBody = RequestBody.create(MediaType.parse("application/json"), body);
    } else {
        requestBody = RequestBody.create(null, new byte[0]);
    }
    switch(method) {
        case GET:
            requestBuilder.get();
            break;
        case POST:
            requestBuilder.post(requestBody);
            break;
        case PUT:
            requestBuilder.put(requestBody);
            break;
        case DELETE:
            requestBuilder.delete(requestBody);
            break;
        case PATCH:
            requestBuilder.patch(requestBody);
            break;
        default:
            throw new IllegalArgumentException("Unsupported http method!");
    }
    if (includeAuthorizationHeader) {
        requestBuilder.addHeader("authorization", api.getPrefixedToken());
    }
    headers.forEach(requestBuilder::addHeader);
    logger.debug("Trying to send {} request to {}{}", method::name, () -> endpoint.getFullUrl(urlParameters), () -> body != null ? " with body " + body : "");
    try (Response response = getApi().getHttpClient().newCall(requestBuilder.build()).execute()) {
        RestRequestResult result = new RestRequestResult(this, response);
        logger.debug("Sent {} request to {} and received status code {} with{} body{}", method::name, () -> endpoint.getFullUrl(urlParameters), response::code, () -> result.getBody().map(b -> "").orElse(" empty"), () -> result.getStringBody().map(s -> " " + s).orElse(""));
        if (response.code() >= 300 || response.code() < 200) {
            RestRequestInformation requestInformation = asRestRequestInformation();
            RestRequestResponseInformation responseInformation = new RestRequestResponseInformationImpl(requestInformation, result);
            Optional<RestRequestHttpResponseCode> responseCode = RestRequestHttpResponseCode.fromCode(response.code());
            // Check if the response body contained a know error code
            if (!result.getJsonBody().isNull() && result.getJsonBody().has("code")) {
                int code = result.getJsonBody().get("code").asInt();
                String message = result.getJsonBody().has("message") ? result.getJsonBody().get("message").asText() : null;
                Optional<? extends DiscordException> discordException = RestRequestResultErrorCode.fromCode(code, responseCode.orElse(null)).flatMap(restRequestResultCode -> restRequestResultCode.getDiscordException(origin, (message == null) ? restRequestResultCode.getMeaning() : message, requestInformation, responseInformation));
                // There's an exception for this specific response code
                if (discordException.isPresent()) {
                    throw discordException.get();
                }
            }
            switch(response.code()) {
                case 429:
                    // A 429 will be handled in the RatelimitManager class
                    return result;
                default:
                    // There are specific exceptions for specific response codes (e.g. NotFoundException for 404)
                    Optional<? extends DiscordException> discordException = responseCode.flatMap(restRequestHttpResponseCode -> restRequestHttpResponseCode.getDiscordException(origin, "Received a " + response.code() + " response from Discord with" + (result.getBody().isPresent() ? "" : " empty") + " body" + result.getStringBody().map(s -> " " + s).orElse("") + "!", requestInformation, responseInformation));
                    if (discordException.isPresent()) {
                        throw discordException.get();
                    } else {
                        // No specific exception was defined for the response code, so throw a "normal"
                        throw new DiscordException(origin, "Received a " + response.code() + " response from Discord with" + (result.getBody().isPresent() ? "" : " empty") + " body" + result.getStringBody().map(s -> " " + s).orElse("") + "!", requestInformation, responseInformation);
                    }
            }
        }
        return result;
    }
}
Also used : DiscordException(org.javacord.api.exception.DiscordException) Request(okhttp3.Request) RestRequestResponseInformation(org.javacord.api.util.rest.RestRequestResponseInformation) MalformedURLException(java.net.MalformedURLException) URL(java.net.URL) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) DiscordApiImpl(org.javacord.core.DiscordApiImpl) Function(java.util.function.Function) RequestBody(okhttp3.RequestBody) LoggerUtil(org.javacord.core.util.logging.LoggerUtil) Logger(org.apache.logging.log4j.Logger) MultipartBody(okhttp3.MultipartBody) DiscordApi(org.javacord.api.DiscordApi) Map(java.util.Map) Response(okhttp3.Response) Optional(java.util.Optional) JsonNode(com.fasterxml.jackson.databind.JsonNode) HttpUrl(okhttp3.HttpUrl) MediaType(okhttp3.MediaType) RestRequestInformation(org.javacord.api.util.rest.RestRequestInformation) Request(okhttp3.Request) RestRequestInformation(org.javacord.api.util.rest.RestRequestInformation) HttpUrl(okhttp3.HttpUrl) Response(okhttp3.Response) DiscordException(org.javacord.api.exception.DiscordException) RestRequestResponseInformation(org.javacord.api.util.rest.RestRequestResponseInformation) RequestBody(okhttp3.RequestBody)

Aggregations

JsonNode (com.fasterxml.jackson.databind.JsonNode)1 MalformedURLException (java.net.MalformedURLException)1 URL (java.net.URL)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Optional (java.util.Optional)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 Function (java.util.function.Function)1 HttpUrl (okhttp3.HttpUrl)1 MediaType (okhttp3.MediaType)1 MultipartBody (okhttp3.MultipartBody)1 Request (okhttp3.Request)1 RequestBody (okhttp3.RequestBody)1 Response (okhttp3.Response)1 Logger (org.apache.logging.log4j.Logger)1 DiscordApi (org.javacord.api.DiscordApi)1 DiscordException (org.javacord.api.exception.DiscordException)1 RestRequestInformation (org.javacord.api.util.rest.RestRequestInformation)1 RestRequestResponseInformation (org.javacord.api.util.rest.RestRequestResponseInformation)1 DiscordApiImpl (org.javacord.core.DiscordApiImpl)1