Commit f6ab1548 authored by Emmanuel Bourg's avatar Emmanuel Bourg

New upstream version 9.0.22

parent b799ff58
......@@ -25,9 +25,6 @@ Items carried over from the 9.0.x list:
2. Reduce instances of setters and getters for the same property existing on an
object and its parent. This may require new objects to be exposed via JMX.
3. Consider wrapping the SocketWrapper with a facade to detect / prevent
components retaining references longer than they should.
New items for 10.0.x onwards:
1. Remove APR connector.
......@@ -61,3 +58,6 @@ New items for 10.0.x onwards:
9. BZ 56966. Refactor internal request timing to use System.nanoTime()
10. BZ 63286. Make behaviour of %D and %T consistent with httpd.
11. Refactor DefaultServlet to use Ranges in parseRanges()
......@@ -228,7 +228,7 @@ fi
# Bugzilla 37848: When no TTY is available, don't output to console
have_tty=0
if [ -t 1 ]; then
if [ -t 0 ]; then
have_tty=1
fi
......
......@@ -25,7 +25,7 @@
# ----- Version Control Flags -----
version.major=9
version.minor=0
version.build=21
version.build=22
version.patch=0
version.suffix=
......@@ -123,17 +123,17 @@ wsdl4j-lib.jar=${wsdl4j-lib.home}/wsdl4j-${wsdl4j-lib.version}.jar
wsdl4j-lib.loc=${base-maven.loc}/wsdl4j/wsdl4j/${wsdl4j-lib.version}/wsdl4j-${wsdl4j-lib.version}.jar
# ----- Eclipse JDT, version 4.7 or later -----#
# See https://wiki.apache.org/tomcat/JDTCoreBatchCompiler before updating
# See https://cwiki.apache.org/confluence/display/TOMCAT/Managing+Tomcat%27s+Dependency+on+the+Eclipse+JDT+Core+Batch+Compiler
#
# Checksum is from "SHA512 Checksums for 4.10" link at
# http://download.eclipse.org/eclipse/downloads/drops4/R-4.10-201812060815/
# http://download.eclipse.org/eclipse/downloads/drops4/R-4.10-201812060815/checksum/eclipse-4.10-SUMSSHA512
#
jdt.version=4.10
jdt.release=R-4.10-201812060815
jdt.version=4.12
jdt.release=R-4.12-201906051800/
jdt.checksum.enabled=true
jdt.checksum.algorithm=SHA-512
jdt.checksum.value=6528d1933d752f909e61456f1a3cbb3ae3999d263701a459e6f4fc33f97f793ec0cfbe7a6408b02bd67deb8ec9371659d54e33216d8075f779579df614465753
jdt.checksum.value=7d38921ae374a5112e7ed5596d85955b608ddf74849373d7a74b199961514807e749d8c8cad89871fa1fdd5e14bc6ec471665546a9f8d313da5c963589c307b0
jdt.home=${base.path}/ecj-${jdt.version}
jdt.jar=${jdt.home}/ecj-${jdt.version}.jar
# The download will be moved to the archive area eventually. We are taking care of that in advance.
......@@ -141,19 +141,19 @@ jdt.loc.1=http://archive.eclipse.org/eclipse/downloads/drops4/${jdt.release}/ecj
jdt.loc.2=http://download.eclipse.org/eclipse/downloads/drops4/${jdt.release}/ecj-${jdt.version}.jar
# ----- Tomcat native library -----
tomcat-native.version=1.2.21
tomcat-native.version=1.2.23
tomcat-native.src.checksum.enabled=true
tomcat-native.src.checksum.algorithm=SHA-512
tomcat-native.src.checksum.value=7f43f815785e5bc3e43f5b2e9ad1c90576a3c1528d57230328b7175bf475eb5f4e1f91b66fae74ad32cd76f044d7705f98a79109f6f84e5af75dc32bc8830b29
tomcat-native.src.checksum.value=89a0363961d322a87f4e752f4727f54f28ac6e4ad10fa21b6b7390c62b041d4068672d95495d9233c1cad7d6c1dc3c85fbd0186894085b3b94e476876af160ee
tomcat-native.win.checksum.enabled=true
tomcat-native.win.checksum.algorithm=SHA-512
tomcat-native.win.checksum.value=bd5e7bb6584cba635d780216b87d453ecca5034235f018ba8a7429b82d653aa58cf26b89520c60271e10f242bd8a10fce401f362ecfe0fab597c7b6983ad97ce
tomcat-native.win.checksum.value=b5d91d709241fea5f18fbaf2eb1dbad3c3014309ac72dfc10c0eb7c2f926a8e37a4c326ce251552bbd2b1f15b86c84ae72c33a259cc051765ab4322c91b5721b
tomcat-native.home=${base.path}/tomcat-native-${tomcat-native.version}
tomcat-native.tar.gz=${tomcat-native.home}/tomcat-native.tar.gz
tomcat-native.loc.1=${base-tomcat.loc.1}/tomcat-connectors/native/${tomcat-native.version}/source/tomcat-native-${tomcat-native.version}-src.tar.gz
tomcat-native.loc.2=${base-tomcat.loc.2}/tomcat-connectors/native/${tomcat-native.version}/source/tomcat-native-${tomcat-native.version}-src.tar.gz
tomcat-native.win.1=${base-tomcat.loc.1}/tomcat-connectors/native/${tomcat-native.version}/binaries/tomcat-native-${tomcat-native.version}-openssl-1.1.1a-win32-bin.zip
tomcat-native.win.2=${base-tomcat.loc.2}/tomcat-connectors/native/${tomcat-native.version}/binaries/tomcat-native-${tomcat-native.version}-openssl-1.1.1a-win32-bin.zip
tomcat-native.win.1=${base-tomcat.loc.1}/tomcat-connectors/native/${tomcat-native.version}/binaries/tomcat-native-${tomcat-native.version}-openssl-1.1.1c-win32-bin.zip
tomcat-native.win.2=${base-tomcat.loc.2}/tomcat-connectors/native/${tomcat-native.version}/binaries/tomcat-native-${tomcat-native.version}-openssl-1.1.1c-win32-bin.zip
# ----- NSIS, version 3.0 or later -----
nsis.version=3.04
......
......@@ -1607,6 +1607,7 @@
<sysproperty key="tomcat.test.openssl.unimplemented" value="${test.openssl.unimplemented}" />
<sysproperty key="tomcat.test.relaxTiming" value="${test.relaxTiming}" />
<sysproperty key="tomcat.test.sslImplementation" value="${test.sslImplementation}" />
<sysproperty key="tomcat.test.http2.loopCount" value="${test.http2.loopCount}" />
<!-- File for Cobertura to write coverage results to -->
<sysproperty key="net.sourceforge.cobertura.datafile" file="${cobertura.datafile}" />
......
......@@ -104,6 +104,11 @@
<!-- showServerInfo Should server information be presented in the -->
<!-- response sent to clients when directory -->
<!-- listings is enabled? [true] -->
<!-- -->
<!-- allowPartialPut Should the server treat an HTTP PUT request -->
<!-- with a Range header as a partial PUT? Note -->
<!-- that RFC 7233 clarified that Range headers are -->
<!-- only valid for GET requests. [true] -->
<servlet>
<servlet-name>default</servlet-name>
......
......@@ -48,7 +48,7 @@ public abstract class ELContext {
}
/**
* Mark the given property as resolved and notfy any interested listeners.
* Mark the given property as resolved and notify any interested listeners.
*
* @param base The base object on which the property was found
* @param property The property that was resolved
......
......@@ -549,8 +549,8 @@ public abstract class AuthenticatorBase extends ValveBase
request.getCoyoteRequest().getMimeHeaders().getValue("authorization") != null;
}
if (!authRequired && context.getPreemptiveAuthentication()
&& HttpServletRequest.CLIENT_CERT_AUTH.equals(getAuthMethod())) {
if (!authRequired && context.getPreemptiveAuthentication() &&
HttpServletRequest.CLIENT_CERT_AUTH.equals(getAuthMethod())) {
X509Certificate[] certs = getRequestCertificates(request);
authRequired = certs != null && certs.length > 0;
}
......@@ -1064,8 +1064,8 @@ public abstract class AuthenticatorBase extends ValveBase
// Configure httpOnly on SSO cookie using same rules as session
// cookies
if (request.getServletContext().getSessionCookieConfig().isHttpOnly()
|| request.getContext().getUseHttpOnly()) {
if (request.getServletContext().getSessionCookieConfig().isHttpOnly() ||
request.getContext().getUseHttpOnly()) {
cookie.setHttpOnly(true);
}
......@@ -1259,4 +1259,4 @@ public abstract class AuthenticatorBase extends ValveBase
public MessageInfo messageInfo = null;
public ServerAuthContext serverAuthContext = null;
}
}
\ No newline at end of file
}
......@@ -14,11 +14,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.catalina.authenticator;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
......@@ -34,8 +31,6 @@ import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.buf.MessageBytes;
import org.apache.tomcat.util.codec.binary.Base64;
/**
* An <b>Authenticator</b> and <b>Valve</b> implementation of HTTP BASIC
* Authentication, as outlined in RFC 2617: "HTTP Authentication: Basic
......
......@@ -609,7 +609,6 @@ public class CoyoteAdapter implements Adapter {
if (connector.getAllowTrace()) {
allow.append(", TRACE");
}
// Always allow options
res.setHeader("Allow", allow.toString());
// Access log entry as processing won't reach AccessLogValve
connector.getService().getContainer().logAccess(request, response, 0, true);
......@@ -638,13 +637,14 @@ public class CoyoteAdapter implements Adapter {
response.sendError(400, "Invalid URI: " + ioe.getMessage());
}
// Normalization
if (!normalize(req.decodedURI())) {
response.sendError(400, "Invalid URI");
}
// Character decoding
convertURI(decodedURI, request);
// Check that the URI is still normalized
if (!checkNormalize(req.decodedURI())) {
if (normalize(req.decodedURI())) {
// Character decoding
convertURI(decodedURI, request);
// Check that the URI is still normalized
if (!checkNormalize(req.decodedURI())) {
response.sendError(400, "Invalid URI");
}
} else {
response.sendError(400, "Invalid URI");
}
} else {
......
......@@ -68,7 +68,7 @@ public class AprLifecycleListener
protected static final int TCN_REQUIRED_MINOR = 2;
protected static final int TCN_REQUIRED_PATCH = 14;
protected static final int TCN_RECOMMENDED_MINOR = 2;
protected static final int TCN_RECOMMENDED_PV = 21;
protected static final int TCN_RECOMMENDED_PV = 23;
// ---------------------------------------------- Properties
......
......@@ -80,6 +80,8 @@ import org.apache.catalina.util.URLEncoder;
import org.apache.catalina.webresources.CachedResource;
import org.apache.tomcat.util.buf.B2CConverter;
import org.apache.tomcat.util.http.ResponseUtil;
import org.apache.tomcat.util.http.parser.ContentRange;
import org.apache.tomcat.util.http.parser.Ranges;
import org.apache.tomcat.util.res.StringManager;
import org.apache.tomcat.util.security.Escape;
import org.apache.tomcat.util.security.PrivilegedGetTccl;
......@@ -150,6 +152,8 @@ public class DefaultServlet extends HttpServlet {
*/
protected static final ArrayList<Range> FULL = new ArrayList<>();
private static final Range IGNORE = new Range();
/**
* MIME multipart separation string
*/
......@@ -270,6 +274,12 @@ public class DefaultServlet extends HttpServlet {
*/
protected transient SortManager sortManager;
/**
* Flag that indicates whether partial PUTs are permitted.
*/
private boolean allowPartialPut = true;
// --------------------------------------------------------- Public Methods
/**
......@@ -370,6 +380,10 @@ public class DefaultServlet extends HttpServlet {
sortManager = new SortManager(sortDirectoriesFirst);
}
}
if (getServletConfig().getInitParameter("allowPartialPut") != null) {
allowPartialPut = Boolean.parseBoolean(getServletConfig().getInitParameter("allowPartialPut"));
}
}
private CompressionFormat[] parseCompressionFormats(String precompressed, String gzip) {
......@@ -601,6 +615,11 @@ public class DefaultServlet extends HttpServlet {
Range range = parseContentRange(req, resp);
if (range == null) {
// Processing error. parseContentRange() set the error code
return;
}
InputStream resourceInputStream = null;
try {
......@@ -608,11 +627,11 @@ public class DefaultServlet extends HttpServlet {
// resource - create a temp. file on the local filesystem to
// perform this operation
// Assume just one range is specified for now
if (range != null) {
if (range == IGNORE) {
resourceInputStream = req.getInputStream();
} else {
File contentFile = executePartialPut(req, range, path);
resourceInputStream = new FileInputStream(contentFile);
} else {
resourceInputStream = req.getInputStream();
}
if (resources.write(path, resourceInputStream, true)) {
......@@ -908,7 +927,7 @@ public class DefaultServlet extends HttpServlet {
}
}
ArrayList<Range> ranges = null;
ArrayList<Range> ranges = FULL;
long contentLength = -1L;
if (resource.isDirectory()) {
......@@ -934,6 +953,9 @@ public class DefaultServlet extends HttpServlet {
// Parse range specifier
ranges = parseRange(request, response, resource);
if (ranges == null) {
return;
}
// ETag header
response.setHeader("ETag", eTag);
......@@ -1012,12 +1034,7 @@ public class DefaultServlet extends HttpServlet {
conversionRequired = false;
}
if (resource.isDirectory() ||
isError ||
( (ranges == null || ranges.isEmpty())
&& request.getHeader("Range") == null ) ||
ranges == FULL ) {
if (resource.isDirectory() || isError || ranges == FULL ) {
// Set the appropriate output headers
if (contentType != null) {
if (debug > 0)
......@@ -1214,7 +1231,7 @@ public class DefaultServlet extends HttpServlet {
return StandardCharsets.UTF_16BE;
}
// Delay the UTF_16LE check if there are more that 2 bytes since it
// overlaps with UTF32-LE.
// overlaps with UTF-32LE.
if (count == 2 && b0 == 0xFF && b1 == 0xFE) {
skip(is, 2);
return StandardCharsets.UTF_16LE;
......@@ -1241,10 +1258,10 @@ public class DefaultServlet extends HttpServlet {
// Look for 4-byte BOMs
int b3 = bom[3] & 0xFF;
if (b0 == 0x00 && b1 == 0x00 && b2 == 0xFE && b3 == 0xFF) {
return Charset.forName("UTF32-BE");
return Charset.forName("UTF-32BE");
}
if (b0 == 0xFF && b1 == 0xFE && b2 == 0x00 && b3 == 0x00) {
return Charset.forName("UTF32-LE");
return Charset.forName("UTF-32LE");
}
// Now we can check for UTF16-LE. There is an assumption here that we
......@@ -1372,9 +1389,11 @@ public class DefaultServlet extends HttpServlet {
/**
* Parse the content-range header.
*
* @param request The servlet request we a)re processing
* @param request The servlet request we are processing
* @param response The servlet response we are creating
* @return the range object
* @return the partial content-range, {@code null} if the content-range
* header was invalid or {@code #IGNORE} if there is no header to
* process
* @throws IOException an IO error occurred
*/
protected Range parseContentRange(HttpServletRequest request,
......@@ -1382,44 +1401,37 @@ public class DefaultServlet extends HttpServlet {
throws IOException {
// Retrieving the content-range header (if any is specified
String rangeHeader = request.getHeader("Content-Range");
String contentRangeHeader = request.getHeader("Content-Range");
if (rangeHeader == null)
return null;
if (contentRangeHeader == null) {
return IGNORE;
}
// bytes is the only range unit supported
if (!rangeHeader.startsWith("bytes")) {
if (!allowPartialPut) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return null;
}
rangeHeader = rangeHeader.substring(6).trim();
int dashPos = rangeHeader.indexOf('-');
int slashPos = rangeHeader.indexOf('/');
ContentRange contentRange = ContentRange.parse(new StringReader(contentRangeHeader));
if (dashPos == -1) {
if (contentRange == null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return null;
}
if (slashPos == -1) {
// bytes is the only range unit supported
if (!contentRange.getUnits().equals("bytes")) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return null;
}
// TODO: Remove the internal representation and use Ranges
// Convert to internal representation
Range range = new Range();
try {
range.start = Long.parseLong(rangeHeader.substring(0, dashPos));
range.end =
Long.parseLong(rangeHeader.substring(dashPos + 1, slashPos));
range.length = Long.parseLong
(rangeHeader.substring(slashPos + 1, rangeHeader.length()));
} catch (NumberFormatException e) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return null;
}
range.start = contentRange.getStart();
range.end = contentRange.getEnd();
range.length = contentRange.getLength();
if (!range.validate()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
......@@ -1427,7 +1439,6 @@ public class DefaultServlet extends HttpServlet {
}
return range;
}
......@@ -1437,13 +1448,18 @@ public class DefaultServlet extends HttpServlet {
* @param request The servlet request we are processing
* @param response The servlet response we are creating
* @param resource The resource
* @return a list of ranges
* @return a list of ranges, {@code null} if the range header was invalid or
* {@code #FULL} if the Range header should be ignored.
* @throws IOException an IO error occurred
*/
protected ArrayList<Range> parseRange(HttpServletRequest request,
HttpServletResponse response,
WebResource resource) throws IOException {
// Range headers are only valid on GET requests. That implies they are
// also valid on HEAD requests. This method is only called by doGet()
// and doHead() so no need to check the request method.
// Checking If-Range
String headerValue = request.getHeader("If-Range");
......@@ -1460,107 +1476,81 @@ public class DefaultServlet extends HttpServlet {
long lastModified = resource.getLastModified();
if (headerValueTime == (-1L)) {
// If the ETag the client gave does not match the entity
// etag, then the entire entity is returned.
if (!eTag.equals(headerValue.trim()))
if (!eTag.equals(headerValue.trim())) {
return FULL;
}
} else {
// If the timestamp of the entity the client got is older than
// If the timestamp of the entity the client got differs from
// the last modification date of the entity, the entire entity
// is returned.
if (lastModified > (headerValueTime + 1000))
if (Math.abs(lastModified -headerValueTime) > 1000) {
return FULL;
}
}
}
long fileLength = resource.getContentLength();
if (fileLength == 0)
return null;
if (fileLength == 0) {
// Range header makes no sense for a zero length resource. Tomcat
// therefore opts to ignore it.
return FULL;
}
// Retrieving the range header (if any is specified
String rangeHeader = request.getHeader("Range");
if (rangeHeader == null)
return null;
// bytes is the only range unit supported (and I don't see the point
// of adding new ones).
if (!rangeHeader.startsWith("bytes")) {
if (rangeHeader == null) {
// No Range header is the same as ignoring any Range header
return FULL;
}
Ranges ranges = Ranges.parse(new StringReader(rangeHeader));
if (ranges == null) {
// The Range header is present but not formatted correctly.
// Could argue for a 400 response but 416 is more specific.
// There is also the option to ignore the (invalid) Range header.
// RFC7233#4.4 notes that many servers do ignore the Range header in
// these circumstances but Tomcat has always returned a 416.
response.addHeader("Content-Range", "bytes */" + fileLength);
response.sendError
(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
return null;
}
rangeHeader = rangeHeader.substring(6);
// bytes is the only range unit supported (and I don't see the point
// of adding new ones).
if (!ranges.getUnits().equals("bytes")) {
// RFC7233#3.1 Servers must ignore range units they don't understand
return FULL;
}
// Collection which will contain all the ranges which are successfully
// parsed.
// TODO: Remove the internal representation and use Ranges
// Convert to internal representation
ArrayList<Range> result = new ArrayList<>();
StringTokenizer commaTokenizer = new StringTokenizer(rangeHeader, ",");
// Parsing the range list
while (commaTokenizer.hasMoreTokens()) {
String rangeDefinition = commaTokenizer.nextToken().trim();
for (Ranges.Entry entry : ranges.getEntries()) {
Range currentRange = new Range();
currentRange.length = fileLength;
int dashPos = rangeDefinition.indexOf('-');
if (dashPos == -1) {
response.addHeader("Content-Range", "bytes */" + fileLength);
response.sendError
(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
return null;
}
if (dashPos == 0) {
try {
long offset = Long.parseLong(rangeDefinition);
currentRange.start = fileLength + offset;
currentRange.end = fileLength - 1;
} catch (NumberFormatException e) {
response.addHeader("Content-Range",
"bytes */" + fileLength);
response.sendError
(HttpServletResponse
.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
return null;
if (entry.getStart() == -1) {
currentRange.start = fileLength - entry.getEnd();
if (currentRange.start < 0) {
currentRange.start = 0;
}
currentRange.end = fileLength - 1;
} else if (entry.getEnd() == -1) {
currentRange.start = entry.getStart();
currentRange.end = fileLength - 1;
} else {
try {
currentRange.start = Long.parseLong
(rangeDefinition.substring(0, dashPos));
if (dashPos < rangeDefinition.length() - 1)
currentRange.end = Long.parseLong
(rangeDefinition.substring
(dashPos + 1, rangeDefinition.length()));
else
currentRange.end = fileLength - 1;
} catch (NumberFormatException e) {
response.addHeader("Content-Range",
"bytes */" + fileLength);
response.sendError
(HttpServletResponse
.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
return null;
}
currentRange.start = entry.getStart();
currentRange.end = entry.getEnd();
}
currentRange.length = fileLength;
if (!currentRange.validate()) {
response.addHeader("Content-Range", "bytes */" + fileLength);
response.sendError
(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
return null;
}
......@@ -1630,6 +1620,7 @@ public class DefaultServlet extends HttpServlet {
*
* @throws IOException an IO error occurred
* @throws ServletException rendering error
* @deprecated Unused. Will be removed in Tomcat 10
* @deprecated Use {@link #render(HttpServletRequest, String, WebResource, String)} instead
*/
@Deprecated
......@@ -1756,7 +1747,7 @@ public class DefaultServlet extends HttpServlet {
Transformer transformer = tFactory.newTransformer(xsltSource);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
OutputStreamWriter osWriter = new OutputStreamWriter(stream, "UTF8");
OutputStreamWriter osWriter = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
StreamResult out = new StreamResult(osWriter);
transformer.transform(xmlSource, out);
osWriter.flush();
......@@ -1785,6 +1776,7 @@ public class DefaultServlet extends HttpServlet {
*
* @throws IOException an IO error occurred
*
* @deprecated Unused. Will be removed in Tomcat 10
* @deprecated Use {@link #renderHtml(HttpServletRequest, String, WebResource, String)} instead
*/
@Deprecated
......@@ -1811,7 +1803,7 @@ public class DefaultServlet extends HttpServlet {
// Prepare a writer to a buffered area
ByteArrayOutputStream stream = new ByteArrayOutputStream();
OutputStreamWriter osWriter = new OutputStreamWriter(stream, "UTF8");
OutputStreamWriter osWriter = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
PrintWriter writer = new PrintWriter(osWriter);
StringBuilder sb = new StringBuilder();
......@@ -2617,7 +2609,7 @@ public class DefaultServlet extends HttpServlet {
return e;
}
if (skipped < start) {
return new IOException(sm.getString("defaultservlet.skipfail",
return new IOException(sm.getString("defaultServlet.skipfail",
Long.valueOf(skipped), Long.valueOf(start)));
}
......
......@@ -41,10 +41,9 @@ defaultServlet.blockExternalSubset=Blocked access to external subset with name [
defaultServlet.missingResource=The requested resource [{0}] is not available
defaultServlet.noResources=No static resources were found
defaultServlet.readerCloseFailed=Failed to close reader
defaultServlet.skipfail=Read failed because only [{0}] bytes were available but needed to skip [{1}] bytes to reach the start of the requested range
defaultServlet.xslError=XSL transformer error
defaultservlet.skipfail=Read failed because only [{0}] bytes were available but needed to skip [{1}] bytes to reach the start of the requested range
directory.filename=Filename
directory.lastModified=Last Modified
directory.parent=Up To [{0}]
......
......@@ -24,8 +24,7 @@ cgiServlet.runStdErrFail=Problemas de I/O con stderr
defaultServlet.blockExternalSubset=Se bloqueó el acceso al subconjunt externo con nombre [{0}] y URI base [{1}]\n
defaultServlet.missingResource=El recurso requerido [{0}] no se encuentra disponible
defaultservlet.skipfail=Sólo se han saltado [{0}] cuando se requirieron [{1}]
defaultServlet.skipfail=Sólo se han saltado [{0}] cuando se requirieron [{1}]
directory.filename=Nombre de Fichero:
directory.lastModified=Última Modificación
......
......@@ -41,10 +41,9 @@ defaultServlet.blockExternalSubset=L''accès au sous-ensemble externe de nom [{0
defaultServlet.missingResource=La ressource demandée [{0}] n''est pas disponible
defaultServlet.noResources=Pas de ressources statiques
defaultServlet.readerCloseFailed=Impossible de fermer le lecteur
defaultServlet.skipfail=La lecture a échouée parce que seuls [{0}] octets étaient disponibles alors qu''il était nécessaire d''en sauter [{1}] pour atteindre le début de la plage demandée
defaultServlet.xslError=Erreur de transformation XSL
defaultservlet.skipfail=La lecture a échouée parce que seuls [{0}] octets étaient disponibles alors qu''il était nécessaire d''en sauter [{1}] pour atteindre le début de la plage demandée
directory.filename=Nom de fichier
directory.lastModified=Dernière modification
directory.parent=Jusqu''à [{0}]
......
......@@ -39,10 +39,9 @@ defaultServlet.blockExternalSubset=名前[{0}]およびベースURI [{1}]を持
defaultServlet.missingResource=要求されたリソース [{0}] は利用できません。
defaultServlet.noResources=静的リソースが見つかりません。
defaultServlet.readerCloseFailed=readerのクローズに失敗しました
defaultServlet.skipfail=[{0}]バイトしか利用できなかったため、[{1}]バイトをスキップして要求された範囲の先頭に到達する必要があったため、読み取りに失敗しました。
defaultServlet.xslError=XSL変換エラー
defaultservlet.skipfail=[{0}]バイトしか利用できなかったため、[{1}]バイトをスキップして要求された範囲の先頭に到達する必要があったため、読み取りに失敗しました。
directory.filename=ファイル名
directory.lastModified=最終更新
directory.parent=[{0}] に移動
......
......@@ -41,10 +41,9 @@ defaultServlet.blockExternalSubset=이름이 [{0}](이)고 baseURI가 [{1}]인
defaultServlet.missingResource=요청된 리소스 [{0}]은(는) 가용하지 않습니다.
defaultServlet.noResources=정적 리소스들을 찾을 수 없었습니다.
defaultServlet.readerCloseFailed=Reader를 닫지 못했습니다.
defaultServlet.skipfail=단지 [{0}] 바이트들만이 가용하기 때문에, 읽기가 실패했습니다. 요청된 범위의 시작 위치에 도달하기 위하여, [{1}] 바이트들을 건너뛰어야 했습니다.
defaultServlet.xslError=XSL Transformer 오류
defaultservlet.skipfail=단지 [{0}] 바이트들만이 가용하기 때문에, 읽기가 실패했습니다. 요청된 범위의 시작 위치에 도달하기 위하여, [{1}] 바이트들을 건너뛰어야 했습니다.
directory.filename=파일명
directory.lastModified=최종변경시간
directory.parent=상위로: [{0}]
......