private int getHttpResponseStatus(boolean isSuccess, Request request, ErrorMessage mainError, List<ErrorMessage> errors) { if (isBenchmarking(request)) return VespaHeaders.getEagerErrorStatus(mainError,errors.iterator()); return VespaHeaders.getStatus(isSuccess, mainError, errors.iterator()); }
/** * Returns 5xx or 4xx if there is any error present in the result, 200 otherwise * * @param mainError The main error of the response. * @param allErrors All the errors of the response, if any. * @return The error status code of the given response. */ public static int getEagerErrorStatus(ErrorMessage mainError, Iterator<? extends ErrorMessage> allErrors) { if (mainError == null ) return Response.Status.OK; // Iterate over all errors if (allErrors != null && allErrors.hasNext()) { for (; allErrors.hasNext();) { ErrorMessage error = allErrors.next(); Tuple2<Boolean, Integer> status = chooseStatusFromError(error); if (status.first) { return status.second; } } } else { Tuple2<Boolean, Integer> status = chooseStatusFromError(mainError); if (status.first) { return status.second; } } // Default return code for errors return Response.Status.INTERNAL_SERVER_ERROR; }
private static Tuple2<Boolean, Integer> webServiceCodes(ErrorMessage mainError, Iterator<? extends ErrorMessage> allErrors) { if (mainError == null) return NO_MATCH; Iterator<? extends ErrorMessage> errorIterator = allErrors; if (errorIterator != null && errorIterator.hasNext()) { for (; errorIterator.hasNext();) { ErrorMessage error = errorIterator.next(); Tuple2<Boolean, Integer> status = chooseWebServiceStatus(error); if (status.first) { return status; } } } else { Tuple2<Boolean, Integer> status = chooseWebServiceStatus(mainError); if (status.first) { return status; } } return NO_MATCH; }
/** * (during normal execution) return 200 unless this is not a success or a 4xx error is requested. * * @param isSuccess Whether or not the response represents a success. * @param mainError The main error of the response, if any. * @param allErrors All the errors of the response, if any. * @return The status code of the given response. */ public static int getStatus(boolean isSuccess, ErrorMessage mainError, Iterator<? extends ErrorMessage> allErrors) { // Do note, SearchResponse has its own implementation of isSuccess() if (isSuccess) { Tuple2<Boolean, Integer> status = webServiceCodes(mainError, allErrors); if (status.first) { return status.second; } else { return Response.Status.OK; } } return getEagerErrorStatus(mainError, allErrors); }
private int getHttpResponseStatus(com.yahoo.container.jdisc.HttpRequest httpRequest, Result result) { boolean benchmarkOutput = VespaHeaders.benchmarkOutput(httpRequest); if (benchmarkOutput) { return VespaHeaders.getEagerErrorStatus(result.hits().getError(), SearchResponse.getErrorIterator(result.hits().getErrorHit())); } else { return VespaHeaders.getStatus(SearchResponse.isSuccess(result), result.hits().getError(), SearchResponse.getErrorIterator(result.hits().getErrorHit())); } }
boolean benchmarking = VespaHeaders.benchmarkOutput(request); boolean benchmarkCoverage = VespaHeaders.benchmarkCoverage(benchmarking, request.getJDiscRequest().headers()); VespaHeaders.benchmarkOutput(response.headers(), benchmarkCoverage, response.getTiming(), response.getHitCounts(), getErrors(result), response.getCoverage());
private boolean isBenchmarking(Request request) { com.yahoo.container.jdisc.HttpRequest httpRequest = (com.yahoo.container.jdisc.HttpRequest)request.properties().get(Request.JDISC_REQUEST); if (httpRequest == null) return false; return VespaHeaders.benchmarkOutput(httpRequest); }
private static Tuple2<Boolean, Integer> chooseWebServiceStatus(ErrorMessage error) { if (isHttpStatusCode(error.getCode())) return new Tuple2<>(true, error.getCode()); if (error.getCode() == FORBIDDEN.code) return new Tuple2<>(true, Response.Status.FORBIDDEN); if (error.getCode() == UNAUTHORIZED.code) return new Tuple2<>(true, Response.Status.UNAUTHORIZED); if (error.getCode() == NOT_FOUND.code) return new Tuple2<>(true, Response.Status.NOT_FOUND); if (error.getCode() == BAD_REQUEST.code) return new Tuple2<>(true, Response.Status.BAD_REQUEST); if (error.getCode() == INTERNAL_SERVER_ERROR.code) return new Tuple2<>(true, Response.Status.INTERNAL_SERVER_ERROR); if (error.getCode() == INSUFFICIENT_STORAGE.code) return new Tuple2<>(true, Response.Status.INSUFFICIENT_STORAGE); return NO_MATCH; }
private static Tuple2<Boolean, Integer> chooseStatusFromError(ErrorMessage error) { Tuple2<Boolean, Integer> webServiceStatus = chooseWebServiceStatus(error); if (webServiceStatus.first) { return webServiceStatus; } if (error.getCode() == NO_BACKENDS_IN_SERVICE.code) return new Tuple2<>(true, Response.Status.SERVICE_UNAVAILABLE); if (error.getCode() == TIMEOUT.code) return new Tuple2<>(true, Response.Status.GATEWAY_TIMEOUT); if (error.getCode() == BACKEND_COMMUNICATION_ERROR.code) return new Tuple2<>(true, Response.Status.SERVICE_UNAVAILABLE); if (error.getCode() == ILLEGAL_QUERY.code) return new Tuple2<>(true, Response.Status.BAD_REQUEST); if (error.getCode() == INVALID_QUERY_PARAMETER.code) return new Tuple2<>(true, Response.Status.BAD_REQUEST); return NO_MATCH; }