/*
* Copyright 2015 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.apiman.plugins.simpleheaderpolicy;
import io.apiman.gateway.engine.beans.ApiRequest;
import io.apiman.gateway.engine.beans.ApiResponse;
import io.apiman.gateway.engine.beans.util.HeaderMap;
import io.apiman.gateway.engine.policies.AbstractMappedPolicy;
import io.apiman.gateway.engine.policy.IPolicyChain;
import io.apiman.gateway.engine.policy.IPolicyContext;
import io.apiman.plugins.simpleheaderpolicy.beans.AddHeaderBean;
import io.apiman.plugins.simpleheaderpolicy.beans.AddHeaderBean.ApplyTo;
import io.apiman.plugins.simpleheaderpolicy.beans.SimpleHeaderPolicyDefBean;
import java.util.Map;
/**
* Set, overwrite and/or delete headers on request, response or both, with pattern matching available.
*
* @author Marc Savy {@literal <msavy@redhat.com>}
*/
public class SimpleHeaderPolicy extends AbstractMappedPolicy<SimpleHeaderPolicyDefBean> {
@Override
protected Class<SimpleHeaderPolicyDefBean> getConfigurationClass() {
return SimpleHeaderPolicyDefBean.class;
}
@Override
protected void doApply(ApiRequest request, IPolicyContext context, SimpleHeaderPolicyDefBean config,
IPolicyChain<ApiRequest> chain) {
setHeaders(request.getHeaders(), config, ApplyTo.REQUEST);
stripHeaders(request.getHeaders(), config, ApplyTo.REQUEST);
chain.doApply(request);
}
@Override
protected void doApply(ApiResponse response, IPolicyContext context,
SimpleHeaderPolicyDefBean config, IPolicyChain<ApiResponse> chain) {
setHeaders(response.getHeaders(), config, ApplyTo.RESPONSE);
stripHeaders(response.getHeaders(), config, ApplyTo.RESPONSE);
chain.doApply(response);
}
private void setHeaders(HeaderMap headers, SimpleHeaderPolicyDefBean config, ApplyTo applyTo) {
for (AddHeaderBean header : config.getAddHeaders()) {
if ((header.getApplyTo() == applyTo || header.getApplyTo() == ApplyTo.BOTH)) {
if (header.getOverwrite() || !headers.containsKey(header.getHeaderName())) {
headers.put(header.getHeaderName(), header.getResolvedHeaderValue());
}
}
}
}
private void stripHeaders(HeaderMap headers, SimpleHeaderPolicyDefBean config, ApplyTo applyTo) {
for (Map.Entry<String, String> header : headers) {
if (config.getKeyRegex(applyTo).matcher(header.getKey()).matches()) {
headers.remove(header.getKey());
}
if (config.getValueRegex(applyTo).matcher(header.getValue()).matches()) {
headers.remove(header.getKey());
}
}
}
}