# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.

addDefaultCharset.unsupportedCharset=Specified character set [{0}] is not supported
corsFilter.invalidPreflightMaxAge=Unable to parse preflightMaxAge
corsFilter.nullRequest=HttpServletRequest object is null
corsFilter.nullRequestType=CORSRequestType object is null
corsFilter.onlyHttp=CORS doesn't support non-HTTP request or response
corsFilter.wrongType1=Expects a HttpServletRequest object of type [{0}]
corsFilter.wrongType2=Expects a HttpServletRequest object of type [{0}] or [{1}]
csrfPrevention.invalidRandomClass=Unable to create Random source using class [{0}]
filterbase.noSuchProperty=The property "{0}" is not defined for filters of type "{1}"

http.403=Access to the specified resource ({0}) has been forbidden.

expiresFilter.noExpirationConfigured=Request "{0}" with response status "{1}" content-type "{2}", no expiration configured
expiresFilter.setExpirationDate=Request "{0}" with response status "{1}" content-type "{2}", set expiration date {3}
expiresFilter.startingPointNotFound=Starting point (access|now|modification|a<seconds>|m<seconds>) not found in directive "{0}"
expiresFilter.startingPointInvalid=Invalid starting point (access|now|modification|a<seconds>|m<seconds>) "{0}" in directive "{1}"
expiresFilter.responseAlreadyCommited=Request "{0}", can not apply ExpiresFilter on already committed response.
expiresFilter.noExpirationConfiguredForContentType=No Expires configuration found for content-type "{0}"
expiresFilter.useMatchingConfiguration=Use {0} matching "{1}" for content-type "{2}" returns {3}
expiresFilter.useDefaultConfiguration=Use default {0} for content-type "{1}" returns {2}
expiresFilter.noDurationFound=Duration not found in directive "{0}"
expiresFilter.noDurationUnitAfterAmount=Duration unit not found after amount "{0}" in directive "{1}"
expiresFilter.unsupportedStartingPoint=Unsupported startingPoint "{0}"
expiresFilter.unknownParameterIgnored=Unknown parameter "{0}" with value "{1}" is ignored !
expiresFilter.exceptionProcessingParameter=Exception processing configuration parameter "{0}":"{1}"
expiresFilter.filterInitialized=Filter initialized with configuration {0}
expiresFilter.expirationHeaderAlreadyDefined=Request "{0}" with response status "{1}" content-type "{2}", expiration header already defined
expiresFilter.skippedStatusCode=Request "{0}" with response status "{1}" content-type "{1}", skip expiration header generation for given status
expiresFilter.invalidDurationNumber=Invalid duration (number) "{0}" in directive "{1}"
expiresFilter.invalidDurationUnit=Invalid duration unit (years|months|weeks|days|hours|minutes|seconds) "{0}" in directive "{1}"

httpHeaderSecurityFilter.committed=Unable to add HTTP headers since response is already committed on entry to the HTTP header security Filter
httpHeaderSecurityFilter.clickjack.invalid=An invalid value [{0}] was specified for the anti click-jacking header

remoteIpFilter.invalidLocation=Failed to modify the rewrite location [{0}] to use scheme [{1}] and port [{2}]
restCsrfPreventionFilter.invalidNonce=CSRF nonce validation failed