package com.googlecode.jsonrpc4j; import java.net.HttpURLConnection; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.BULK_ERROR; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.CUSTOM_SERVER_ERROR_LOWER; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.CUSTOM_SERVER_ERROR_UPPER; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.ERROR_NOT_HANDLED; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.INTERNAL_ERROR; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.INVALID_REQUEST; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.METHOD_NOT_FOUND; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.METHOD_PARAMS_INVALID; import static com.googlecode.jsonrpc4j.ErrorResolver.JsonError.PARSE_ERROR; /** * This default implementation of a {@link HttpStatusCodeProvider} follows the rules defined in the * <a href="http://www.jsonrpc.org/historical/json-rpc-over-http.html">JSON-RPC over HTTP</a> document. */ @SuppressWarnings("WeakerAccess") public enum DefaultHttpStatusCodeProvider implements HttpStatusCodeProvider { INSTANCE; final Map<Integer, ErrorResolver.JsonError> httpStatus2JsonError = new HashMap<Integer, ErrorResolver.JsonError>(); private DefaultHttpStatusCodeProvider() { httpStatus2JsonError.put(HttpURLConnection.HTTP_INTERNAL_ERROR, INTERNAL_ERROR); httpStatus2JsonError.put(HttpURLConnection.HTTP_NOT_FOUND, METHOD_NOT_FOUND); httpStatus2JsonError.put(HttpURLConnection.HTTP_BAD_REQUEST, PARSE_ERROR); } @Override public int getHttpStatusCode(int resultCode) { if (resultCode == 0) return HttpURLConnection.HTTP_OK; // Toha: pure java constants if (isErrorCode(resultCode)) { return HttpURLConnection.HTTP_INTERNAL_ERROR; } else if (resultCode == INVALID_REQUEST.code || resultCode == PARSE_ERROR.code) { return HttpURLConnection.HTTP_BAD_REQUEST; } else if (resultCode == METHOD_NOT_FOUND.code) { return HttpURLConnection.HTTP_NOT_FOUND; } return HttpURLConnection.HTTP_OK; } private boolean isErrorCode(int result) { for (ErrorResolver.JsonError error : Arrays.asList(INTERNAL_ERROR, METHOD_PARAMS_INVALID, ERROR_NOT_HANDLED, BULK_ERROR)) { if (error.code == result) return true; } return CUSTOM_SERVER_ERROR_UPPER >= result && result >= CUSTOM_SERVER_ERROR_LOWER; } @Override public Integer getJsonRpcCode(int httpStatusCode) { return httpStatus2JsonError.containsKey(httpStatusCode) ? httpStatus2JsonError.get(httpStatusCode).getCode() : null; } }