morgand 02/01/18 12:22:45 Modified: latka/src/java/org/apache/commons/latka/http Request.java RequestImpl.java SessionImpl.java latka/src/java/org/apache/commons/latka/xml ParameterHandler.java RequestHandler.java RequestHeaderHandler.java Log: fixed some inaccurate method names, fixed Latka's handling of referers following redirects, and added support for following 301 or 302 redirects to other servers (HttpClient workaround) Revision Changes Path 1.10 +54 -4 jakarta-commons/latka/src/java/org/apache/commons/latka/http/Request.java Index: Request.java =================================================================== RCS file: /home/cvs/jakarta-commons/latka/src/java/org/apache/commons/latka/http/Request.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- Request.java 10 Oct 2001 20:57:16 -0000 1.9 +++ Request.java 18 Jan 2002 20:22:44 -0000 1.10 @@ -115,17 +115,50 @@ * @param name the name of the parameter * @param name the value of the parameter * - * @throws java.lang.IllegalArgumentException if a parameter is null or not a String */ - public void setParameter(String name, String value); + public void addParameter(String name, String value); /** + * Set all the parameters for the request. Overrides + * any parameters that have been already set by addParameter(); + * + * @param parameters + * all parameters for this request + */ + public void setParameters(Parameters parameters); + + /** + * Get the parameters for the request, so that they can + * be copied to another request if necessary. + * + * @return parameters for this request + */ + public Parameters getParameters(); + + /** * Sets a request header. * * @param headerName header name * @param headerValue header value or null for a null header */ - public void setHeader(String headerName, String headerValue); + public void addHeader(String headerName, String headerValue); + + /** + * Set all the headers for the request. Overrides + * any headers that have been already set by addHeader(); + * + * @param requestHeaders + * all headers for this request + */ + public void setHeaders(RequestHeaders requestHeaders); + + /** + * Get the headers for the request, so that they can + * be copied to another request if necessary. + * + * @return headers for this request + */ + public RequestHeaders getHeaders(); // getHeader method purposely ommitted. HttpClient does not retain // header information after the request is submitted. @@ -153,5 +186,22 @@ * @param userName user name * @param password user's password */ - public void setCredentials(String userName, String password); + public void setCredentials(Credentials credentials); + + /** + * Whether or not this request will instruct HttpClient + * to follow local redirects automatically. + * + * @return true if HttpClient will redirect a 301 or 302 response + */ + public boolean followRedirects(); + + /** + * Return the constant representing the HTTP method + * to use in this request + * + * @return HTTP method for this request + */ + public int getMethod(); + } 1.16 +63 -7 jakarta-commons/latka/src/java/org/apache/commons/latka/http/RequestImpl.java Index: RequestImpl.java =================================================================== RCS file: /home/cvs/jakarta-commons/latka/src/java/org/apache/commons/latka/http/RequestImpl.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- RequestImpl.java 16 Jan 2002 22:17:17 -0000 1.15 +++ RequestImpl.java 18 Jan 2002 20:22:44 -0000 1.16 @@ -64,6 +64,7 @@ import java.util.Map; import java.util.Date; import java.util.Iterator; +import java.util.List; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.HttpClient; @@ -90,8 +91,9 @@ /** Standard HTTPS Port */ public static final int HTTPS_PORT = 443; - protected String _host = null; - protected int _port = -1; + protected String _host = null; + protected int _port = -1; + protected int _method = -1; protected SessionImpl _session = null; protected HttpMethod _httpMethod = null; @@ -100,6 +102,10 @@ protected long _requestTiming = -1; protected String _label = null; + protected RequestHeaders _requestHeaders = new RequestHeadersImpl(); + protected Parameters _parameters = new ParametersImpl(); + protected boolean _followRedirects = true; + protected HttpClient _httpClient = new HttpClient(); protected static final Category _log = Category.getInstance(RequestImpl.class); @@ -118,6 +124,8 @@ */ protected RequestImpl(String label, URL url, int httpMethod, HttpState state, SessionImpl session, boolean followRedirects) { + _followRedirects = followRedirects; + _method = httpMethod; _httpClient.setState(state); _label = label; @@ -160,18 +168,51 @@ return _httpMethod; } + // defined in interface + public RequestHeaders getHeaders() { + return _requestHeaders; + } + + // defined in interface + public void setHeaders(RequestHeaders requestHeaders) { + _requestHeaders = requestHeaders; + } + + // defined in the interface + public Parameters getParameters() { + return _parameters; + } + + public void setParameters(Parameters parameters) { + _parameters = parameters; + } + /////////////////////////////// // Request Interface Methods // /////////////////////////////// // defined in the interface - public void setCredentials(String userName, String password) { + public void setCredentials(Credentials credentials) { // null implies that this credential is the default (vs. specifying a realm) - _session._state.setCredentials(null, new UsernamePasswordCredentials(userName,password)); + _session._state.setCredentials(null, new UsernamePasswordCredentials(credentials.getUserName(),credentials.getPassword())); } // defined in the interface public Response execute() throws IOException { + + // set the request headers in HTTPClient + List headers = _requestHeaders.getHeaders(); + for (int i = 0; i < headers.size(); ++i) { + String[] header = (String[]) headers.get(i); + _httpMethod.addRequestHeader(header[0],header[1]); + } + + List parameters = _parameters.getParameters(); + for (int i = 0; i < parameters.size(); ++i) { + String[] parameter = (String[]) parameters.get(i); + addHttpClientParameter(parameter[0],parameter[1]); + } + // for timing Date startDate = new Date(); @@ -226,6 +267,11 @@ return _label; } + // defined in the interface + public void addParameter(String name, String value) { + _parameters.addParameter(name,value); + } + /** * Associate a parameter with this request. * @@ -234,7 +280,7 @@ * * @throws java.lang.IllegalArgumentException if a parameter is null */ - public void setParameter(String name, String value) { + protected void addHttpClientParameter(String name, String value) { _log.info("adding parameter, name:"); _log.info(name); @@ -275,8 +321,8 @@ * @param headerName name of any HTTP request header * @param headerValue value of that header */ - public void setHeader(String headerName, String headerValue) { - _httpMethod.addRequestHeader(headerName,headerValue); + public void addHeader(String headerName, String headerValue) { + _requestHeaders.addHeader(headerName,headerValue); } /** @@ -342,6 +388,16 @@ _log.debug("closing connection"); _httpClient.endSession(); _log.debug("connection closed"); + } + + // defined in the interface + public boolean followRedirects() { + return _followRedirects; + } + + // defined in interface + public int getMethod() { + return _method; } } 1.9 +1 -1 jakarta-commons/latka/src/java/org/apache/commons/latka/http/SessionImpl.java Index: SessionImpl.java =================================================================== RCS file: /home/cvs/jakarta-commons/latka/src/java/org/apache/commons/latka/http/SessionImpl.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SessionImpl.java 16 Jan 2002 22:17:17 -0000 1.8 +++ SessionImpl.java 18 Jan 2002 20:22:44 -0000 1.9 @@ -126,7 +126,7 @@ URL referer = getReferer(); if (referer != null) { - request.setHeader("Referer", referer.toString()); + request.addHeader("Referer", referer.toString()); } return request; 1.7 +1 -1 jakarta-commons/latka/src/java/org/apache/commons/latka/xml/ParameterHandler.java Index: ParameterHandler.java =================================================================== RCS file: /home/cvs/jakarta-commons/latka/src/java/org/apache/commons/latka/xml/ParameterHandler.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- ParameterHandler.java 23 Aug 2001 16:24:27 -0000 1.6 +++ ParameterHandler.java 18 Jan 2002 20:22:44 -0000 1.7 @@ -114,7 +114,7 @@ _tagName = _lastTagName; if (localName.equals("paramValue")) { - _request.setParameter(_paramName.toString(),_paramValue.toString()); + _request.addParameter(_paramName.toString(),_paramValue.toString()); _tagName = null; } else if (!localName.startsWith("param")) { release(namespaceURI,localName,rawName); 1.15 +50 -3 jakarta-commons/latka/src/java/org/apache/commons/latka/xml/RequestHandler.java Index: RequestHandler.java =================================================================== RCS file: /home/cvs/jakarta-commons/latka/src/java/org/apache/commons/latka/xml/RequestHandler.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- RequestHandler.java 17 Jan 2002 20:30:24 -0000 1.14 +++ RequestHandler.java 18 Jan 2002 20:22:44 -0000 1.15 @@ -64,6 +64,8 @@ import java.net.MalformedURLException; import java.net.URL; +import java.util.LinkedList; +import java.util.List; import java.util.Properties; import org.apache.commons.latka.LatkaProperties; @@ -71,7 +73,11 @@ import org.apache.commons.latka.event.*; +import org.apache.commons.latka.http.Credentials; +import org.apache.commons.latka.http.CredentialsImpl; import org.apache.commons.latka.http.Request; +import org.apache.commons.latka.http.RequestHeaders; +import org.apache.commons.latka.http.RequestHeadersImpl; import org.apache.commons.latka.http.Response; import org.apache.commons.latka.http.Session; import org.apache.commons.latka.http.SessionImpl; @@ -100,6 +106,9 @@ protected Request _request = null; protected Response _response = null; protected boolean _requestExecuted = false; + protected Credentials _credentials = null; + + protected List _visitedURLs = new LinkedList(); protected static final Category _log = Category.getInstance(RequestHandler.class); @@ -157,7 +166,8 @@ _log.info("request skipped"); } } else if (localName.equals("credentials")) { - _request.setCredentials(atts.getValue("userName"),atts.getValue("password")); + _credentials = new CredentialsImpl(atts.getValue("userName"),atts.getValue("password")); + _request.setCredentials(_credentials); } else if (localName.equals("requestHeader")) { _log.info("adding request headers"); RequestHeaderHandler headerHandler = new RequestHeaderHandler(_reader,_request); @@ -173,7 +183,7 @@ if (!_skipped) { try { - _response = _request.execute(); + _response = executeRequest(); _log.debug("request executed and response obtained"); ValidationReflectionHandler handler = new ValidationReflectionHandler(_reader,_response,_listener); @@ -194,7 +204,7 @@ if (localName.equals("request")) { if (_requestExecuted == false && !_skipped) { try { - _request.execute(); + executeRequest(); _listener.requestSucceeded(new RequestSucceededEvent(_request,_response)); } catch (IOException e) { _listener.requestError(new RequestErrorEvent(_request,_response,e)); @@ -206,6 +216,43 @@ release(); } + } + + + /** + * Executes the request. In the event of a 301 or 302, + * this method may reassign the _request variable to + * a different value. + */ + protected Response executeRequest() throws IOException { + Response response = _request.execute(); + + if (_request.followRedirects() == false) { + return response; + } + + // execute the request until either we get a non-redirect response, or + // we visit a URL we have already visited + while (response.getStatusCode() == 301 || response.getStatusCode() == 302) { + // follow the redirect + URL url = new URL(response.getHeader("location")); + + if (_visitedURLs.contains(url.toString())) { + return response; + } + + Request request = _session.createRequest(_request.getLabel(),url,_request.getMethod(),true); + request.setParameters(_request.getParameters()); + request.setHeaders(_request.getHeaders()); + if (_credentials != null) { + request.setCredentials(_credentials); + } + _request = request; + response = _request.execute(); + _visitedURLs.add(url.toString()); + } + + return response; } protected Request buildRequest(Attributes atts) 1.4 +1 -1 jakarta-commons/latka/src/java/org/apache/commons/latka/xml/RequestHeaderHandler.java Index: RequestHeaderHandler.java =================================================================== RCS file: /home/cvs/jakarta-commons/latka/src/java/org/apache/commons/latka/xml/RequestHeaderHandler.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- RequestHeaderHandler.java 23 Aug 2001 16:24:27 -0000 1.3 +++ RequestHeaderHandler.java 18 Jan 2002 20:22:44 -0000 1.4 @@ -88,7 +88,7 @@ if (localName.equals("requestHeader")) { log.info("adding header"); - _request.setHeader(atts.getValue("headerName"), + _request.addHeader(atts.getValue("headerName"), atts.getValue("headerValue")); } else { // release as soon as all the headers are processed
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>