/*
* Copyright (c) 2012 - 2016 Jadler contributors
* This program is made available under the terms of the MIT License.
*/
package net.jadler.matchers;
import java.util.List;
import net.jadler.Request;
import org.apache.commons.lang.Validate;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
/**
* A {@link RequestMatcher} used for matching a request header.
*/
public class HeaderRequestMatcher extends RequestMatcher<List<String>> {
private final String headerName;
private final String desc;
/**
* Protected constructor useful only when subtyping. For creating instances of this class use
* {@link #requestHeader(java.lang.String, org.hamcrest.Matcher)} instead.
* @param pred a predicate to be applied on the given request header
* @param headerName name of a request header (case insensitive)
*/
protected HeaderRequestMatcher(final Matcher<? super List<String>> pred, final String headerName) {
super(pred);
Validate.notEmpty(headerName, "headerName cannot be empty");
this.headerName = headerName;
this.desc = "header \"" + headerName + "\" is";
}
/**
* Retrieves a header (defined in {@link #HeaderRequestMatcher(org.hamcrest.Matcher, java.lang.String)})
* of the given request.
* @param req request to retrieve the header from
* @return the request header as a list of values or {@code null} if there is no such a header in the request
*/
@Override
protected List<String> retrieveValue(final Request req) {
return req.getHeaders().getValues(this.headerName);
}
/**
* {@inheritDoc}
*/
@Override
protected String provideDescription() {
return this.desc;
}
/**
* Factory method to create new instance of this matcher.
* @param headerName name of a request header
* @param pred a predicate to be applied on the request header
* @return new instance of this matcher
*/
@Factory
public static HeaderRequestMatcher requestHeader(final String headerName,
final Matcher<? super List<String>> pred) {
return new HeaderRequestMatcher(pred, headerName);
}
}