@Nonnull private ValidationReport validatePathParameters(final ApiOperation apiOperation) { ValidationReport validationReport = empty(); final NormalisedPath requestPath = apiOperation.getRequestPath(); for (int i = 0; i < apiOperation.getApiPath().numberOfParts(); i++) { if (!apiOperation.getApiPath().hasParams(i)) { continue; } final ValidationReport pathPartValidation = apiOperation .getApiPath() .paramValues(i, requestPath.part(i)) .entrySet() .stream() .map(param -> validatePathParameter(apiOperation, param.getKey(), param.getValue())) .reduce(empty(), ValidationReport::merge); validationReport = validationReport.merge(pathPartValidation); } return validationReport; }
@Nonnull private ValidationReport validateHeader(final ApiOperation apiOperation, final String headerName, final Header apiHeader, final Collection<String> propertyValues) { if (propertyValues.isEmpty() && TRUE.equals(apiHeader.getRequired())) { return ValidationReport.singleton( messages.get("validation.response.header.missing", headerName, apiOperation.getApiPath().original()) ); } return propertyValues .stream() .map(v -> schemaValidator.validate(v, apiHeader.getSchema(), "response.header")) .reduce(ValidationReport.empty(), ValidationReport::merge); } }
/** * Matches operations that contain the given regular expression in their API path. * <p> * The tested path does not have parameters materialized, but is taken from the API * definition, e.g. "/store/order/{orderId}". */ public static WhitelistRule pathContains(final String regexp) { return new PrintableWhitelistRule( "Api path contains: '" + regexp + "'", (message, operation, request, response) -> operation != null && regexpContain(operation.getApiPath().normalised(), regexp)); }
public Optional<OpenApiOperation> findApiOperation(String method, String path) { String relativePath = UrlUtils.extractPath(path); Request.Method requestMethod = Enum.valueOf(Request.Method.class, method); ApiOperationMatch apiOperation = apiOperationResolver.findApiOperation(relativePath, requestMethod); if (! apiOperation.isPathFound() || ! apiOperation.isOperationAllowed()) { return Optional.empty(); } return Optional.of(new OpenApiOperation(method, combineWithBasePath(apiOperation.getApiOperation().getApiPath().original()))); }
@Nonnull private ValidationReport validateParameter(final ApiOperation apiOperation, final Parameter parameter, final Collection<String> parameterValues, final String missingKey) { final ValidationReport.MessageContext context = ValidationReport.MessageContext.create().withParameter(parameter).build(); if (parameterValues.isEmpty() && TRUE.equals(parameter.getRequired())) { return ValidationReport.singleton( messages.get(missingKey, parameter.getName(), apiOperation.getApiPath().original()) ).withAdditionalContext(context); } return parameterValues .stream() .map(v -> parameterValidator.validate(v, parameter)) .reduce(empty(), ValidationReport::merge); }
return ValidationReport.singleton( messages.get("validation.response.body.missing", apiOperation.getMethod(), apiOperation.getApiPath().original()) );
return ValidationReport.singleton( messages.get("validation.response.status.unknown", response.getStatus(), apiOperation.getApiPath().original()) ).withAdditionalContext(contextBuilder.build());