/**
- * The servlet context attribute under which we store a temporary
- * working directory (as an object of type File) for use by servlets
- * within this web application.
- */
- public static final String WORK_DIR_ATTR =
- "javax.servlet.context.tempdir";
-
-
- /**
* The master flag which controls strict servlet specification
* compliance.
*/
dir.mkdirs();
// Set the appropriate servlet context attribute
- getServletContext().setAttribute(Globals.WORK_DIR_ATTR, dir);
+ getServletContext().setAttribute(ServletContext.TEMPDIR, dir);
if (getServletContext() instanceof ApplicationContext)
((ApplicationContext) getServletContext()).setAttributeReadOnly
- (Globals.WORK_DIR_ATTR);
+ (ServletContext.TEMPDIR);
}
// Assigning permissions for the work directory
File workDir =
- (File) servletContext.getAttribute(Globals.WORK_DIR_ATTR);
+ (File) servletContext.getAttribute(ServletContext.TEMPDIR);
if (workDir != null) {
try {
String workDirPath = workDir.getCanonicalPath();
loaderRepositories=new ArrayList<String>();
// Loading the work directory
File workDir =
- (File) servletContext.getAttribute(Globals.WORK_DIR_ATTR);
+ (File) servletContext.getAttribute(ServletContext.TEMPDIR);
if (workDir == null) {
log.info("No work dir for " + servletContext);
}
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+
+import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// Get the tempdir
File tempdir = (File) getServletContext().getAttribute
- ("javax.servlet.context.tempdir");
+ (ServletContext.TEMPDIR);
// Set upload parameters
upload.setSizeMax(-1);
upload.setRepositoryPath(tempdir.getCanonicalPath());
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
+import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.UnavailableException;
// Calculate the directory into which we will be deploying applications
versioned = (File) getServletContext().getAttribute
- ("javax.servlet.context.tempdir");
+ (ServletContext.TEMPDIR);
// Identify the appBase of the owning Host of this Context
// (if any)
protected void setupFromContext(ServletContext context) {
this.context = context;
this.webAppRootDir = context.getRealPath("/");
- this.tmpDir = (File) context.getAttribute(Globals.WORK_DIR_ATTR);
+ this.tmpDir = (File) context.getAttribute(ServletContext.TEMPDIR);
}
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
+import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.UnavailableException;
// resource - create a temp. file on the local filesystem to
// perform this operation
File tempDir = (File) getServletContext().getAttribute
- ("javax.servlet.context.tempdir");
+ (ServletContext.TEMPDIR);
// Convert all '/' characters to '.' in resourcePath
String convertedResourcePath = path.replace('/', '.');
File contentFile = new File(tempDir, convertedResourcePath);
ServletContext servletContext =
((Context) container).getServletContext();
File work = (File)
- servletContext.getAttribute(Globals.WORK_DIR_ATTR);
+ servletContext.getAttribute(ServletContext.TEMPDIR);
file = new File(work, this.directory);
} else {
throw new IllegalArgumentException
ServletContext servletContext =
((Context) container).getServletContext();
File tempdir = (File)
- servletContext.getAttribute(Globals.WORK_DIR_ATTR);
+ servletContext.getAttribute(ServletContext.TEMPDIR);
if (tempdir != null)
file = new File(tempdir, pathname);
}
}
// Log this message
- if (writer != null) {
- writer.println(message);
- if (!buffered) {
- writer.flush();
+ synchronized(this) {
+ if (writer != null) {
+ writer.println(message);
+ if (!buffered) {
+ writer.flush();
+ }
}
}
* uses.
*/
public static final String INC_SERVLET_PATH = "javax.servlet.include.servlet_path";
- public static final String TMP_DIR = "javax.servlet.context.tempdir";
// Must be kept in sync with org/apache/catalina/Globals.java
public static final String ALT_DD_ATTR =
scratchDir = new File(dir);
} else {
// First try the Servlet 2.2 javax.servlet.context.tempdir property
- scratchDir = (File) context.getAttribute(Constants.TMP_DIR);
+ scratchDir = (File) context.getAttribute(ServletContext.TEMPDIR);
if (scratchDir == null) {
// Not running in a Servlet 2.2 container.
// Try to get the JDK 1.2 java.io.tmpdir property
docBase = docBase + "-";
permissionCollection.add(new FilePermission(docBase,"read"));
- // Create a file read permission for web app tempdir (work)
- // directory
+ // Spec says apps should have read/write for their temp
+ // directory. This is fine, as no security sensitive files, at
+ // least any that the app doesn't have full control of anyway,
+ // will be written here.
String workDir = options.getScratchDir().toString();
if (!workDir.endsWith(File.separator)){
permissionCollection.add
- (new FilePermission(workDir,"read"));
+ (new FilePermission(workDir,"read,write"));
workDir = workDir + File.separator;
}
workDir = workDir + "-";
- permissionCollection.add(new FilePermission(workDir,"read"));
+ permissionCollection.add(new FilePermission(
+ workDir,"read,write,delete"));
// Allow the JSP to access org.apache.jasper.runtime.HttpJspBase
permissionCollection.add( new RuntimePermission(
Bug37794Client client = new Bug37794Client();
// Edge cases around zero
- client.doRequest(-1); // Unlimited
+ client.doRequest(-1, false); // Unlimited
assertTrue(client.isResponse200());
assertTrue(client.isResponseBodyOK());
client.reset();
- client.doRequest(0); // Unlimited
+ client.doRequest(0, false); // Unlimited
assertTrue(client.isResponse200());
assertTrue(client.isResponseBodyOK());
client.reset();
- client.doRequest(1); // 1 byte - too small should fail
+ client.doRequest(1, false); // 1 byte - too small should fail
assertTrue(client.isResponse500());
client.reset();
// Edge cases around actual content length
client.reset();
- client.doRequest(6); // Too small should fail
+ client.doRequest(6, false); // Too small should fail
assertTrue(client.isResponse500());
client.reset();
- client.doRequest(7); // Just enough should pass
+ client.doRequest(7, false); // Just enough should pass
assertTrue(client.isResponse200());
assertTrue(client.isResponseBodyOK());
client.reset();
- client.doRequest(8); // 1 extra - should pass
+ client.doRequest(8, false); // 1 extra - should pass
assertTrue(client.isResponse200());
assertTrue(client.isResponseBodyOK());
// Much larger
client.reset();
- client.doRequest(8096); // Plenty of space - should pass
+ client.doRequest(8096, false); // Plenty of space - should pass
+ assertTrue(client.isResponse200());
+ assertTrue(client.isResponseBodyOK());
+
+ // Check for case insensitivity
+ client.reset();
+ client.doRequest(8096, true); // Plenty of space - should pass
assertTrue(client.isResponse200());
assertTrue(client.isResponseBodyOK());
}
* Bug 37794 test client.
*/
private static class Bug37794Client extends SimpleHttpClient {
- private Exception doRequest(int postLimit) {
+ private Exception doRequest(int postLimit, boolean ucChunkedHead) {
Tomcat tomcat = new Tomcat();
try {
StandardContext root = tomcat.addContext("", TEMP_DIR);
// Send request in two parts
String[] request = new String[2];
- request[0] =
- "POST http://localhost:8080/test HTTP/1.1" + CRLF +
- "content-type: application/x-www-form-urlencoded" + CRLF +
- "Transfer-Encoding: chunked" + CRLF +
- "Connection: close" + CRLF +
- CRLF +
- "3" + CRLF +
- "a=1" + CRLF;
+ if (ucChunkedHead) {
+ request[0] =
+ "POST http://localhost:8080/test HTTP/1.1" + CRLF +
+ "content-type: application/x-www-form-urlencoded" + CRLF +
+ "Transfer-Encoding: CHUNKED" + CRLF +
+ "Connection: close" + CRLF +
+ CRLF +
+ "3" + CRLF +
+ "a=1" + CRLF;
+ } else {
+ request[0] =
+ "POST http://localhost:8080/test HTTP/1.1" + CRLF +
+ "content-type: application/x-www-form-urlencoded" + CRLF +
+ "Transfer-Encoding: chunked" + CRLF +
+ "Connection: close" + CRLF +
+ CRLF +
+ "3" + CRLF +
+ "a=1" + CRLF;
+ }
request[1] =
"4" + CRLF +
"&b=2" + CRLF +