package com.uaihebert.uaimockserver.validator;
import com.uaihebert.uaimockserver.facade.RequestValidatorFacade;
import com.uaihebert.uaimockserver.log.backend.Log;
import com.uaihebert.uaimockserver.model.UaiHeader;
import com.uaihebert.uaimockserver.model.UaiRequest;
import io.undertow.server.HttpServerExchange;
import io.undertow.util.HeaderMap;
import io.undertow.util.HeaderValues;
public class OptionalHeaderValidator implements RequestDataValidator{
private static final String WILD_CARD_USED = "The header [%s] is using the wildcard. Its content will not be checked.";
private static final String OPTIONAL_HEADER_NOT_FOUND = "The optional header [%s] was not found in the request. This route will not be used.";
private static final String HEADER_VALUE_NOT_FOUND_MESSAGE = "%nThe required value %s was not found in the header [%s]";
@Override
public void validate(final UaiRequest uaiRequest, final HttpServerExchange exchange, final RequestValidatorFacade.RequestAnalysisResult result) {
for (UaiHeader uaiHeader : uaiRequest.getOptionalHeaderList()) {
final HeaderMap requestHeaderMap = exchange.getRequestHeaders();
validateHeader(uaiHeader, requestHeaderMap, result);
}
}
private void validateHeader(final UaiHeader uaiHeader, final HeaderMap requestHeaderMap, final RequestValidatorFacade.RequestAnalysisResult result) {
final HeaderValues headerValueList = requestHeaderMap.get(uaiHeader.getName());
if (headerValueList == null) {
Log.infoFormatted(OPTIONAL_HEADER_NOT_FOUND, uaiHeader.getName());
result.setInvalid();
return;
}
if (uaiHeader.isUsingWildCard()) {
Log.infoFormatted(WILD_CARD_USED, uaiHeader.getName());
return;
}
if (!headerValueList.containsAll(uaiHeader.getValueList())) {
Log.warnFormatted(HEADER_VALUE_NOT_FOUND_MESSAGE, uaiHeader.getValueList(), uaiHeader.getName());
result.abortTheRequest();
}
}
}