You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ol...@apache.org on 2004/02/27 20:01:34 UTC
cvs commit: jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server ErrorResponse.java HttpRequestHandler.java HttpRequestHandlerChain.java ProxyAuthRequestHandler.java ProxyRequestHandler.java SimpleHttpServer.java SimpleHttpServerConnection.java TransparentProxyRequestHandler.java GenericResponse.java
olegk 2004/02/27 11:01:34
Modified: httpclient/src/test/org/apache/commons/httpclient
HttpClientTestBase.java TestAuthenticator.java
TestBadContentLength.java TestNoHost.java
httpclient/src/test/org/apache/commons/httpclient/server
ErrorResponse.java HttpRequestHandler.java
HttpRequestHandlerChain.java
ProxyAuthRequestHandler.java
ProxyRequestHandler.java SimpleHttpServer.java
SimpleHttpServerConnection.java
TransparentProxyRequestHandler.java
Removed: httpclient/src/test/org/apache/commons/httpclient/server
GenericResponse.java
Log:
Changelog
* SimpleRequest and SimpleResponse classes factored out
* Interface HttpService can be used instead of HttpRequestHandler to implement test cases in a way very similar to writing servlets.
* Basic authentication test cases ported to the new testing framework
Contributed by Oleg Kalnichevski
Revision Changes Path
1.2 +4 -37 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/HttpClientTestBase.java
Index: HttpClientTestBase.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/HttpClientTestBase.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- HttpClientTestBase.java 25 Feb 2004 22:33:58 -0000 1.1
+++ HttpClientTestBase.java 27 Feb 2004 19:01:33 -0000 1.2
@@ -37,10 +37,7 @@
import junit.framework.TestSuite;
import org.apache.commons.httpclient.protocol.Protocol;
-import org.apache.commons.httpclient.server.RequestLine;
-import org.apache.commons.httpclient.server.ResponseWriter;
import org.apache.commons.httpclient.server.SimpleHttpServer;
-import org.apache.commons.httpclient.server.SimpleHttpServerConnection;
/**
* Base class for test cases using
@@ -92,35 +89,5 @@
this.client = null;
this.server.destroy();
this.server = null;
- }
-
- protected static void respondNotImplemented(SimpleHttpServerConnection conn)
- throws IOException
- {
- RequestLine requestLine = conn.getRequestLine();
- ResponseWriter out = conn.getWriter();
- String content = requestLine.getMethod() + " method not supported";
- out.println("HTTP/1.1 501 Not implemented");
- out.println("Content-Type: text/plain");
- out.println("Content-Length: " + content.length());
- out.println("Connection: close");
- out.println();
- out.println(content);
- out.flush();
- }
-
- protected static void respondNotFound(SimpleHttpServerConnection conn)
- throws IOException
- {
- RequestLine requestLine = conn.getRequestLine();
- ResponseWriter out = conn.getWriter();
- String content = requestLine.getUri() + " not found";
- out.println("HTTP/1.1 404 Not found");
- out.println("Content-Type: text/plain");
- out.println("Content-Length: " + content.length());
- out.println("Connection: close");
- out.println();
- out.println(content);
- out.flush();
}
}
1.41 +7 -154 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestAuthenticator.java
Index: TestAuthenticator.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestAuthenticator.java,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- TestAuthenticator.java 22 Feb 2004 18:08:49 -0000 1.40
+++ TestAuthenticator.java 27 Feb 2004 19:01:33 -0000 1.41
@@ -35,16 +35,13 @@
import junit.framework.Test;
import junit.framework.TestSuite;
-import org.apache.commons.codec.binary.Base64;
import org.apache.commons.httpclient.auth.AuthChallengeParser;
import org.apache.commons.httpclient.auth.AuthScheme;
import org.apache.commons.httpclient.auth.AuthenticationException;
-import org.apache.commons.httpclient.auth.BasicScheme;
import org.apache.commons.httpclient.auth.CredentialsNotAvailableException;
import org.apache.commons.httpclient.auth.DigestScheme;
import org.apache.commons.httpclient.auth.MalformedChallengeException;
import org.apache.commons.httpclient.auth.NTLMScheme;
-import org.apache.commons.httpclient.util.EncodingUtil;
/**
* Unit tests for {@link Authenticator}.
@@ -138,7 +135,7 @@
) throws AuthenticationException {
return doAuthenticate(authscheme, method, conn, state, true);
}
- // ---------------------------------- Test Methods for BasicScheme Authentication
+
public void testCredentialConstructors() {
try {
@@ -166,153 +163,9 @@
assertNotNull(creds.getHost());
}
+ // ---------------------------------- Test Methods for BasicScheme Authentication
- public void testBasicAuthenticationWithNoCreds() {
- String challenge = "Basic realm=\"realm1\"";
- HttpState state = new HttpState();
- HttpMethod method = new SimpleHttpMethod(new Header("WWW-Authenticate", challenge));
- try {
- AuthScheme authscheme = new BasicScheme();
- authscheme.processChallenge(challenge);
- authenticate(authscheme, method, null, state);
- fail("Should have thrown HttpException");
- } catch(HttpException e) {
- // expected
- }
- }
-
- public void testBasicAuthenticationWithNoRealm() {
- String challenge = "Basic";
- HttpState state = new HttpState();
- HttpMethod method = new SimpleHttpMethod(new Header("WWW-Authenticate", challenge));
- try {
- AuthScheme authscheme = new BasicScheme();
- authscheme.processChallenge(challenge);
- authenticate(authscheme, method, null, state);
- fail("Should have thrown HttpException");
- } catch(HttpException e) {
- // expected
- }
- }
-
- public void testBasicAuthenticationWithNoRealm2() {
- String challenge = "Basic ";
- HttpState state = new HttpState();
- HttpMethod method = new SimpleHttpMethod(new Header("WWW-Authenticate", challenge));
- try {
- AuthScheme authscheme = new BasicScheme();
- authscheme.processChallenge(challenge);
- authenticate(authscheme, method, null, state);
- fail("Should have thrown HttpException");
- } catch(HttpException e) {
- // expected
- }
- }
-
- public void testBasicAuthenticationWithNullHttpState() throws Exception {
- String challenge = "Basic realm=\"realm1\"";
- HttpMethod method = new SimpleHttpMethod(new Header("WWW-Authenticate", challenge));
- try {
- AuthScheme authscheme = new BasicScheme();
- authscheme.processChallenge(challenge);
- authenticate(authscheme, method, null, null);
- fail("Should have thrown IllegalArgumentException");
- } catch(IllegalArgumentException e) {
- // expected
- }
- }
-
- public void testBasicAuthenticationCaseInsensitivity() throws Exception {
- String challenge = "bAsIc ReAlM=\"realm1\"";
- HttpState state = new HttpState();
- state.setCredentials(null, null, new UsernamePasswordCredentials("username","password"));
- HttpMethod method = new SimpleHttpMethod(new Header("WwW-AuThEnTiCaTe", challenge));
- AuthScheme authscheme = new BasicScheme();
- authscheme.processChallenge(challenge);
- assertTrue(authenticate(authscheme, method, null, state));
- assertTrue(null != method.getRequestHeader("Authorization"));
- String expected = "Basic " + EncodingUtil.getAsciiString(
- Base64.encodeBase64(EncodingUtil.getAsciiBytes("username:password")));
- assertEquals(expected,method.getRequestHeader("Authorization").getValue());
- }
-
-
- public void testBasicAuthenticationWithDefaultCreds() throws Exception {
- HttpState state = new HttpState();
- state.setCredentials(null, null, new UsernamePasswordCredentials("username","password"));
- HttpMethod method = new SimpleHttpMethod(new Header("WWW-Authenticate","Basic realm=\"realm1\""));
- assertTrue(authenticate(new BasicScheme(), method, null, state));
- assertTrue(null != method.getRequestHeader("Authorization"));
- String expected = "Basic " + EncodingUtil.getAsciiString(
- Base64.encodeBase64(EncodingUtil.getAsciiBytes("username:password")));
- assertEquals(expected,method.getRequestHeader("Authorization").getValue());
- }
-
- public void testBasicAuthentication() throws Exception {
- String challenge = "Basic realm=\"realm\"";
- HttpState state = new HttpState();
- state.setCredentials("realm", null, new UsernamePasswordCredentials("username","password"));
- HttpMethod method = new SimpleHttpMethod(new Header("WWW-Authenticate", challenge));
- AuthScheme authscheme = new BasicScheme();
- authscheme.processChallenge(challenge);
- assertTrue(authenticate(authscheme, method, null, state));
- assertTrue(null != method.getRequestHeader("Authorization"));
- String expected = "Basic " + EncodingUtil.getAsciiString(
- Base64.encodeBase64(EncodingUtil.getAsciiBytes("username:password")));
- assertEquals(expected,method.getRequestHeader("Authorization").getValue());
- }
-
- public void testBasicAuthenticationWith88591Chars() throws Exception {
- int[] germanChars = { 0xE4, 0x2D, 0xF6, 0x2D, 0xFc };
- StringBuffer buffer = new StringBuffer();
- for (int i = 0; i < germanChars.length; i++) {
- buffer.append((char)germanChars[i]);
- }
-
- UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("dh", buffer.toString());
- assertEquals("Basic ZGg65C32Lfw=",
- BasicScheme.authenticate(credentials, "ISO-8859-1"));
- }
-
- public void testBasicAuthenticationWithMutlipleRealms() throws Exception {
- String challenge1 = "Basic realm=\"realm1\"";
- String challenge2 = "Basic realm=\"realm2\"";
- HttpState state = new HttpState();
- state.setCredentials("realm1", null, new UsernamePasswordCredentials("username","password"));
- state.setCredentials("realm2", null, new UsernamePasswordCredentials("uname2","password2"));
- AuthScheme authscheme1 = new BasicScheme();
- authscheme1.processChallenge(challenge1);
- AuthScheme authscheme2 = new BasicScheme();
- authscheme2.processChallenge(challenge2);
- {
- HttpMethod method = new SimpleHttpMethod(new Header("WWW-Authenticate",challenge1));
- assertTrue(authenticate(authscheme1, method, null, state));
- assertTrue(null != method.getRequestHeader("Authorization"));
- String expected = "Basic " + EncodingUtil.getAsciiString(
- Base64.encodeBase64(EncodingUtil.getAsciiBytes("username:password")));
- assertEquals(expected,method.getRequestHeader("Authorization").getValue());
- }
- {
- HttpMethod method = new SimpleHttpMethod(new Header("WWW-Authenticate", challenge2));
- assertTrue(authenticate(authscheme2, method, null, state));
- assertTrue(null != method.getRequestHeader("Authorization"));
- String expected = "Basic " + EncodingUtil.getAsciiString(
- Base64.encodeBase64(EncodingUtil.getAsciiBytes("uname2:password2")));
- assertEquals(expected,method.getRequestHeader("Authorization").getValue());
- }
- }
-
- public void testPreemptiveAuthorizationTrueWithCreds() throws Exception {
- HttpState state = new HttpState();
- HttpMethod method = new SimpleHttpMethod();
- state.setCredentials(null, null, new UsernamePasswordCredentials("username","password"));
-
- assertTrue(authenticate(new BasicScheme(), method, null, state));
- assertTrue(null != method.getRequestHeader("Authorization"));
- String expected = "Basic " + EncodingUtil.getAsciiString(
- Base64.encodeBase64(EncodingUtil.getAsciiBytes("username:password")));
- assertEquals(expected, method.getRequestHeader("Authorization").getValue());
- }
+ // Moved to a separate test case based on a new testing framework
// --------------------------------- Test Methods for DigestScheme Authentication
1.6 +10 -6 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestBadContentLength.java
Index: TestBadContentLength.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestBadContentLength.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TestBadContentLength.java 22 Feb 2004 18:08:49 -0000 1.5
+++ TestBadContentLength.java 27 Feb 2004 19:01:33 -0000 1.6
@@ -41,6 +41,7 @@
import org.apache.commons.httpclient.server.ResponseWriter;
import org.apache.commons.httpclient.server.SimpleHttpServer;
import org.apache.commons.httpclient.server.SimpleHttpServerConnection;
+import org.apache.commons.httpclient.server.SimpleRequest;
/**
* Tests HttpClient's behaviour when receiving more response data than expected.
@@ -166,8 +167,11 @@
private class MyHttpRequestHandler implements HttpRequestHandler {
private int requestNo = 0;
- public boolean processRequest(SimpleHttpServerConnection conn) throws IOException {
- RequestLine requestLine = conn.getRequestLine();
+ public boolean processRequest(
+ final SimpleHttpServerConnection conn,
+ final SimpleRequest request) throws IOException
+ {
+ RequestLine requestLine = request.getRequestLine();
ResponseWriter out = conn.getWriter();
if ("GET".equals(requestLine.getMethod())
&& "/".equals(requestLine.getUri())) {
1.32 +10 -5 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestNoHost.java
Index: TestNoHost.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestNoHost.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- TestNoHost.java 22 Feb 2004 18:08:49 -0000 1.31
+++ TestNoHost.java 27 Feb 2004 19:01:33 -0000 1.32
@@ -30,7 +30,11 @@
package org.apache.commons.httpclient;
-import junit.framework.*;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.commons.httpclient.auth.TestBasicAuth;
/**
* Tests that don't require any external host.
@@ -58,6 +62,7 @@
suite.addTest(TestHeaderElement.suite());
suite.addTest(TestChallengeParser.suite());
suite.addTest(TestAuthenticator.suite());
+ suite.addTest(TestBasicAuth.suite());
suite.addTest(TestHttpUrlMethod.suite());
suite.addTest(TestURI.suite());
suite.addTest(TestURIUtil.suite());
1.4 +24 -19 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/ErrorResponse.java
Index: ErrorResponse.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/ErrorResponse.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ErrorResponse.java 22 Feb 2004 18:08:52 -0000 1.3
+++ ErrorResponse.java 27 Feb 2004 19:01:33 -0000 1.4
@@ -52,28 +52,33 @@
private final HashMap responses = new HashMap();
private ErrorResponse() {
+ super();
}
- public void setResponse(int statusCode, GenericResponse r) {
+ public void setResponse(int statusCode, SimpleResponse response) {
Integer code = new Integer(statusCode);
- responses.put(code, r);
+ responses.put(code, response);
}
- public GenericResponse getResponse(int statusCode) {
+ public SimpleResponse getResponse(int statusCode) {
Integer code = new Integer(statusCode);
- GenericResponse r = (GenericResponse)responses.get(code);
- if(r == null) {
- String text = statusCode+" "+HttpStatus.getStatusText(statusCode);
- r = new GenericResponse("HTTP/1.0 "+text,
- "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
- + "<html>\n<head>"
- + "<title>"+text+"</title>"
- + "</head>\n<body>"
- + "<h1>"+text+"</h1></body>\n</html>\n",
- "text/html");
-
- responses.put(code, r);
+ SimpleResponse response = (SimpleResponse)responses.get(code);
+ if (response == null) {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append(statusCode);
+ String s = HttpStatus.getStatusText(statusCode);
+ if (s != null) {
+ buffer.append(' ');
+ buffer.append(s);
+ }
+ response = new SimpleResponse(buffer.toString());
+ response.setContentType("text/plain");
+ if (s == null) {
+ s = "Error " + code;
+ }
+ response.setBodyString(s);
+ responses.put(code, response);
}
- return r;
+ return response;
}
}
1.4 +8 -4 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/HttpRequestHandler.java
Index: HttpRequestHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/HttpRequestHandler.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- HttpRequestHandler.java 22 Feb 2004 18:08:52 -0000 1.3
+++ HttpRequestHandler.java 27 Feb 2004 19:01:33 -0000 1.4
@@ -37,6 +37,7 @@
* Defines an HTTP request handler for the SimpleHttpServer
*
* @author Christian Kohlschuetter
+ * @author Oleg Kalnichevski
*/
public interface HttpRequestHandler {
/**
@@ -53,9 +54,12 @@
* {@link HttpRequestHandlerChain} structures).
*
* @param conn The Connection object to which this request belongs to.
+ * @param request The request object.
* @return true if this handler handled the request and no other handlers in the
* chain should be called, false otherwise.
* @throws IOException
*/
- public boolean processRequest(SimpleHttpServerConnection conn) throws IOException;
+ public boolean processRequest(
+ final SimpleHttpServerConnection conn,
+ final SimpleRequest request) throws IOException;
}
1.4 +8 -6 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/HttpRequestHandlerChain.java
Index: HttpRequestHandlerChain.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/HttpRequestHandlerChain.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- HttpRequestHandlerChain.java 22 Feb 2004 18:08:52 -0000 1.3
+++ HttpRequestHandlerChain.java 27 Feb 2004 19:01:34 -0000 1.4
@@ -62,11 +62,13 @@
subhandlers.add(handler);
}
- public synchronized boolean processRequest(SimpleHttpServerConnection conn) throws IOException {
-
+ public synchronized boolean processRequest(
+ final SimpleHttpServerConnection conn,
+ final SimpleRequest request) throws IOException
+ {
for(Iterator it=subhandlers.iterator();it.hasNext();) {
HttpRequestHandler h = (HttpRequestHandler)it.next();
- boolean stop = h.processRequest(conn);
+ boolean stop = h.processRequest(conn, request);
if (stop) {
return true;
}
1.9 +8 -15 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/ProxyAuthRequestHandler.java
Index: ProxyAuthRequestHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/ProxyAuthRequestHandler.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ProxyAuthRequestHandler.java 22 Feb 2004 18:08:52 -0000 1.8
+++ ProxyAuthRequestHandler.java 27 Feb 2004 19:01:34 -0000 1.9
@@ -71,9 +71,11 @@
this.credentials = creds;
}
- public boolean processRequest(SimpleHttpServerConnection conn) throws IOException {
- Header[] headers = conn.getHeaders();
- Header clientAuth = findHeader(headers, PROXY_AUTH_RESP);
+ public boolean processRequest(
+ final SimpleHttpServerConnection conn,
+ final SimpleRequest request) throws IOException
+ {
+ Header clientAuth = request.getFirstHeader(PROXY_AUTH_RESP);
if (clientAuth != null) {
boolean ok = checkAuthorization(clientAuth);
if (ok)
@@ -124,15 +126,6 @@
(UsernamePasswordCredentials)credentials,
"ISO-8859-1");
return expectedAuthString.equals(clientAuth.getValue());
- }
-
- private Header findHeader(Header[] headers, String name) {
- for (int i = 0; i < headers.length; i++) {
- Header header = headers[i];
- if (header.getName().equalsIgnoreCase(name))
- return header;
- }
- return null;
}
}
1.4 +16 -9 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/ProxyRequestHandler.java
Index: ProxyRequestHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/ProxyRequestHandler.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ProxyRequestHandler.java 22 Feb 2004 18:08:52 -0000 1.3
+++ ProxyRequestHandler.java 27 Feb 2004 19:01:34 -0000 1.4
@@ -55,22 +55,29 @@
/**
* @see org.apache.commons.httpclient.server.HttpRequestHandler#processRequest(org.apache.commons.httpclient.server.SimpleHttpServerConnection)
*/
- public boolean processRequest(SimpleHttpServerConnection conn) throws IOException {
- RequestLine line = conn.getRequestLine();
+ public boolean processRequest(
+ final SimpleHttpServerConnection conn,
+ final SimpleRequest request) throws IOException
+ {
+ RequestLine line = request.getRequestLine();
String method = line.getMethod();
//TODO add POST method handling
if (!"GET".equalsIgnoreCase(method)) return false;
- URI url = new HttpURL(line.getUri());
- httpProxy(conn, url);
+ httpProxy(conn, request);
return true;
}
/**
* @param conn
*/
- private void httpProxy(SimpleHttpServerConnection conn, URI url) throws IOException {
+ private void httpProxy(
+ final SimpleHttpServerConnection conn,
+ final SimpleRequest request) throws IOException
+ {
Log wireLog = LogFactory.getLog("httpclient.wire");
+ URI url = new HttpURL(request.getRequestLine().getUri());
+
HttpClient client = new HttpClient();
HostConfiguration hc = new HostConfiguration();
hc.setHost(url);
@@ -78,7 +85,7 @@
//TODO support other methods
HttpMethod method = new GetMethod(url.getPathQuery());
- Header[] headers = conn.getHeaders();
+ Header[] headers = request.getHeaders();
for (int i=0; i<headers.length; i++) {
method.addRequestHeader(headers[i]);
}
1.5 +80 -10 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServer.java
Index: SimpleHttpServer.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SimpleHttpServer.java 22 Feb 2004 18:08:52 -0000 1.4
+++ SimpleHttpServer.java 27 Feb 2004 19:01:34 -0000 1.5
@@ -40,6 +40,7 @@
import java.util.Iterator;
import java.util.Set;
+import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -48,6 +49,7 @@
* A simple, but extensible HTTP server, mostly for testing purposes.
*
* @author Christian Kohlschuetter
+ * @author Oleg Kalnichevski
*/
public class SimpleHttpServer implements Runnable {
private static final Log LOG = LogFactory.getLog(SimpleHttpServer.class);
@@ -60,6 +62,7 @@
private Set connections = new HashSet();
private HttpRequestHandler requestHandler = null;
+ private HttpService serivce = null;
/**
* Creates a new HTTP server instance, using an arbitrary free TCP port
@@ -171,24 +174,91 @@
* @param rh Request handler to be used, or null to disable.
*/
public void setRequestHandler(HttpRequestHandler rh) {
- requestHandler = rh;
+ this.requestHandler = rh;
+ }
+
+ public void setHttpService(HttpService service) {
+ this.serivce = service;
}
public void removeConnection(SimpleHttpServerConnection conn) {
connections.remove(conn);
}
- public void processRequest(SimpleHttpServerConnection conn)
- throws IOException {
-
+ public void processRequest(
+ final SimpleHttpServerConnection conn,
+ final SimpleRequest request) throws IOException
+ {
+ if (conn == null) {
+ throw new IllegalArgumentException("Connection may not be null");
+ }
+ if (request == null) {
+ throw new IllegalArgumentException("Request may not be null");
+ }
boolean complete = false;
- if (requestHandler != null) {
- complete = requestHandler.processRequest(conn);
+ if (this.requestHandler != null) {
+ complete = requestHandler.processRequest(conn, request);
+ if (complete) {
+ return;
+ }
+ }
+ SimpleResponse response = null;
+ if (this.serivce != null) {
+ response = new SimpleResponse();
+ complete = this.serivce.process(request, response);
}
if (!complete) {
+ response = ErrorResponse.getInstance().
+ getResponse(HttpStatus.SC_SERVICE_UNAVAILABLE);
conn.connectionClose();
- ErrorResponse.getInstance().getResponse(HttpStatus.SC_SERVICE_UNAVAILABLE).processRequest(conn);
}
+ writeResponse(conn, response);
+ }
+
+ public void writeResponse(
+ final SimpleHttpServerConnection conn,
+ final SimpleResponse response) throws IOException
+ {
+ if (response == null) {
+ return;
+ }
+ ResponseWriter out = conn.getWriter();
+ if (!response.containsHeader("Content-Length")) {
+ int len = 0;
+ if (response.getBodyString() != null) {
+ len = response.getBodyString().length();
+ }
+ response.addHeader(
+ new Header("Content-Length", Integer.toString(len), true));
+ }
+ if (!response.containsHeader("Content-Type")) {
+ StringBuffer buffer = new StringBuffer();
+ if (response.getContentType() != null) {
+ buffer.append(response.getContentType());
+ if (out.getEncoding() != null) {
+ buffer.append("; charset=");
+ buffer.append(out.getEncoding());
+ }
+ }
+ response.addHeader(
+ new Header("Content-Type", buffer.toString(), true));
+ }
+ // @TODO implement HTTP/1.1 persistent connections
+ if (!conn.isKeepAlive()) {
+ response.setHeader(
+ new Header("Connection", "close", true));
+ }
+ out.println(response.getStatusLine());
+ Iterator item = response.getHeaderIterator();
+ while (item.hasNext()) {
+ Header header = (Header) item.next();
+ out.print(header.toExternalForm());
+ }
+ out.println();
+ if (response.getBodyString() != null) {
+ out.print(response.getBodyString());
+ }
+ out.flush();
}
public void run() {
1.7 +18 -35 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServerConnection.java
Index: SimpleHttpServerConnection.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServerConnection.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- SimpleHttpServerConnection.java 25 Feb 2004 22:33:59 -0000 1.6
+++ SimpleHttpServerConnection.java 27 Feb 2004 19:01:34 -0000 1.7
@@ -38,7 +38,6 @@
import java.net.Socket;
import java.net.SocketException;
-import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpParser;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.logging.Log;
@@ -63,10 +62,6 @@
private boolean keepAlive = false;
- private RequestLine requestLine;
-
- private Header[] headers;
-
public SimpleHttpServerConnection(SimpleHttpServer server, Socket socket) throws IOException {
this.server = server;
this.socket = socket;
@@ -157,41 +152,23 @@
return;
}
+ SimpleRequest request = null;
try {
- requestLine = RequestLine.parseLine(line);
- headers = HttpParser.parseHeaders(in, HTTP_ELEMENT_CHARSET);
+ request = new SimpleRequest(
+ RequestLine.parseLine(line),
+ HttpParser.parseHeaders(in, HTTP_ELEMENT_CHARSET),
+ null);
} catch (IOException e) {
connectionClose();
- ErrorResponse.getInstance().getResponse(HttpStatus.SC_BAD_REQUEST).processRequest(this);
+ SimpleResponse response = ErrorResponse.getInstance().
+ getResponse(HttpStatus.SC_BAD_REQUEST);
+ server.writeResponse(this, response);
return;
}
- server.processRequest(this);
+ server.processRequest(this, request);
out.flush();
}
- public Header[] getHeaders() {
- Header[] copy = new Header[headers.length];
- System.arraycopy(headers, 0, copy, 0, headers.length);
- return copy;
- }
-
- public Header getHeader(final String name) {
- if (name == null) {
- throw new IllegalArgumentException("Header name may not be null");
- }
- for (int i = 0; i < this.headers.length; i++) {
- Header header = this.headers[i];
- if (name.equalsIgnoreCase(header.getName())) {
- return header;
- }
- }
- return null;
- }
-
- public RequestLine getRequestLine() {
- return requestLine;
- }
-
public InputStream getInputStream() {
return in;
}
@@ -199,4 +176,10 @@
public OutputStream getOutputStream() {
return out;
}
+
+ public boolean isKeepAlive() {
+ return this.keepAlive;
+ }
+
}
+
\ No newline at end of file
1.6 +8 -5 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/TransparentProxyRequestHandler.java
Index: TransparentProxyRequestHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/TransparentProxyRequestHandler.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TransparentProxyRequestHandler.java 22 Feb 2004 18:08:52 -0000 1.5
+++ TransparentProxyRequestHandler.java 27 Feb 2004 19:01:34 -0000 1.6
@@ -56,8 +56,11 @@
*
* @see org.apache.commons.httpclient.server.HttpRequestHandler#processRequest(org.apache.commons.httpclient.server.SimpleHttpServerConnection)
*/
- public boolean processRequest(SimpleHttpServerConnection conn) throws IOException {
- RequestLine line = conn.getRequestLine();
+ public boolean processRequest(
+ final SimpleHttpServerConnection conn,
+ final SimpleRequest request) throws IOException
+ {
+ RequestLine line = request.getRequestLine();
String method = line.getMethod();
if (!"CONNECT".equalsIgnoreCase(method))
return false;
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org