|
What this is
Other links
The source code
/*
* Copyright 1999-2004 The Apache Sofware Foundation.
*
* Licensed 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.
*/
package org.apache.tomcat.util.test;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.tomcat.util.buf.Base64;
/**
* Part of GTest - defines a Http request. This tool gives a lot
* of control over the request, and is usable with ant ( testing
* is also a part of the build process :-) or other xml-tools
* using similar patterns.
*
*
*/
public class HttpRequest {
// Defaults
static String defaultHost="localhost";
static int defaultPort=8080;
static int defaultDebug=0;
static String defaultProtocol="HTTP/1.0";
String id;
String host=null;
int port=-1;
String method="GET";
String protocol=null;
String path;
String requestLine;
Vector headerVector=new Vector();
Vector paramsV=new Vector();
String user;
String password;
Body body;
// Request body as it'll be sent
String fullRequest;
int debug=defaultDebug;
HttpClient client=null;
HttpResponse response=null;
public HttpRequest() {
}
/** Associated response, set after executing the request
*/
public void setHttpResponse(HttpResponse r) {
response=r;
}
public HttpResponse getHttpResponse() {
return response;
}
public void setHttpClient( HttpClient c ) {
client=c;
}
public HttpClient getHttpClient() {
return client;
}
/** Set an unique id to this request. This allows it to be
* referenced later, for complex tests/matchers that look
* at multiple requests.
*/
public void setId(String id) {
this.id=id;
}
/** Server that will receive the request
*/
public void setHost(String h) {
this.host=h;
}
public String getHost() {
if( host==null ) host=defaultHost;
return host;
}
/**
*/
public void setMethod(String h) {
this.method=h;
}
/** The port used to send the request
*/
public void setPort(String portS) {
this.port=Integer.valueOf( portS).intValue();
}
/** Set the port as int - different name to avoid confusing introspection
*/
public void setPortInt(int i) {
this.port=i;
}
public int getPort() {
if( port==-1) port=defaultPort;
return port;
}
public void setUser( String u ) {
this.user=u;
}
public void setPassword( String p ) {
password=p;
}
/** Do a POST with the specified content.
*/
public void setContent(String s) {
body=new Body( s );
}
/** Add content to the request, for POST ( alternate method )
*/
public void addBody( Body b ) {
body=b;
}
public void setProtocol( String s ) {
protocol=s;
}
public void setPath( String s ) {
path=s;
}
public void addHeader( String n, String v ) {
headerVector.addElement( new Header( n, v) );
}
/** Add a header to the request
*/
public void addHeader( Header rh ) {
headerVector.addElement( rh );
}
/** Add headers - string representation, will be parsed
* The value is a "|" separated list of headers to expect.
* It's preferable to use the other 2 methods.
*/
public void setHeaders( String s ) {
Header.parseHeadersAsString( s, headerVector );
}
/** Add a parameter to the request
*/
public void addParam( Parameter rp ) {
paramsV.addElement( rp );
}
/** Display debug info
*/
public void setDebug( int d ) {
debug=d;
}
/** Verbose request line - including method and protocol
*/
public void setRequestLine( String s ) {
this.requestLine=s;
}
public String getRequestLine( ) {
if( requestLine==null ) {
prepareRequest();
int idx=fullRequest.indexOf("\r");
if( idx<0 )
requestLine=fullRequest;
else
requestLine=fullRequest.substring(0, idx );
}
return requestLine;
}
/** Allow sending a verbose request
*/
public void setFullRequest( String s ) {
fullRequest=s;
}
public String getFullRequest() {
return fullRequest;
}
/** Add content to the request, for POST ( alternate method )
*/
public void addVerbose( Body b ) {
fullRequest=b.getBody();
}
/** Alternate method for sending a verbose request
*/
public void addText(String s ) {
// set if text isn't just whitespace
if (null != s && s.trim().length() > 0)
{
fullRequest=s;
}
}
// -------------------- Execute the request --------------------
public void execute() {
prepareRequest();
}
boolean prepared=false;
static String CRLF="\r\n";
/**
*/
public void prepareRequest()
{
if( prepared ) return;
if( host==null ) host=defaultHost;
if( port==-1) port=defaultPort;
if( protocol==null ) protocol=defaultProtocol;
prepared=true;
if( id==null ) {
id="Req" + getId();
}
registerHttpRequest( id, this );
// explicitely set - the rest doesn't matter
if( fullRequest != null ) return;
// use the existing info to compose what will be sent to the
// server
StringBuffer sb=new StringBuffer();
if( requestLine != null )
sb.append(requestLine); // explicitely set
else {
sb.append( method ).append(" ").append(path);
// all GET parameters
boolean first=true;
for( int i=0; i< paramsV.size(); i++ ) {
Parameter p=(Parameter)paramsV.elementAt(i);
if( "GET".equals( p.getType( method ) )) {
if( first && (path.indexOf("?") <0) ) {
sb.append("?");
first=false;
} else {
sb.append( "&" );
}
// not null? Encode ?
sb.append(p.getName());
sb.append("=");
String v=p.getValue();
if( v!=null) sb.append(v);
}
}
// sb.append(" ").append(protocol);
sb.append(" ").append("HTTP/1.0"); // only http1.0 for now on request
requestLine=sb.toString();
}
sb.append(CRLF);
// We may test HTTP0.9 behavior. If it's post 1.0, it needs
// a LF
if( requestLine.indexOf( "HTTP/1." ) <0 ) {
fullRequest=sb.toString();
return; // nothing to add
}
String contentL=null;
String hostHeader=null;
String contentType=null;
String authorization=null;
Enumeration headersE=headerVector.elements();
while( headersE.hasMoreElements() ) {
Header h=(Header)headersE.nextElement();
sb.append(h.getName()).append(": ");
sb.append(h.getValue()).append( CRLF );
if( "Content-Type".equals( h.getName() ))
contentType=h.getValue();
if( "Content-Length".equals( h.getName() ))
contentL=h.getValue();
if( "Host".equals( h.getName() ))
hostHeader=h.getValue();
if( "Authorization".equals( h.getName() ))
authorization=h.getValue();
}
if( hostHeader == null && host!=null && ! "".equals(host) ) {
sb.append("Host: ").append( host ).append(':').append(port).append( CRLF );
}
// If we are in a POST and Parameters are specified -
// add the header and prepare the body
if( body==null && "POST".equals( method ) ) {
// we may have POST parameters.
StringBuffer bodySB=new StringBuffer();
boolean first=true;
for( int i=0; i< paramsV.size(); i++ ) {
Parameter p=(Parameter)paramsV.elementAt(i);
if( "POST".equals( p.getType( "POST") )) {
if( ! first ) {
bodySB.append( "&" );
}
first=false;
// not null? Encode ?
bodySB.append(p.getName());
bodySB.append("=");
String v=p.getValue();
if( v!=null) bodySB.append(v);
}
}
if( ! first ) {
// we had a post param and we constructed the body
if( contentType==null ) {
sb.append( "Content-Type: ");
sb.append( "application/x-www-form-urlencoded");
sb.append(CRLF);
}
body= new Body( bodySB.toString());
}
}
// Deal with authorization
if( authorization == null &&
user!=null && password !=null ) {
sb.append( "Authorization: Basic " );
String token=user + ":" + password;
sb.append( Base64.encode( token.getBytes() ));
sb.append( CRLF );
}
// If we have a body
if( body != null) {
// If set explicitely ( maybe we're testing bad POSTs )
if( contentL==null ) {
sb.append("Content-Length: ").append( body.getBody().length());
sb.append(CRLF).append( CRLF);
}
sb.append(body.getBody());
// no /n at the end -see HTTP specs!
// If we want to test bad POST - set Content-Length
// explicitely.
} else {
sb.append( CRLF );
}
// set the fullRequest
fullRequest=sb.toString();
}
/** Return a URI (guessed) from the requestLine/fullRequest
*/
public String getURI() {
String toExtract=getRequestLine();
if( fullRequest==null ) toExtract=requestLine;
if( toExtract==null ) return null;
// if( ! toExtract.startsWith("GET")) return null;
try {
StringTokenizer st=new StringTokenizer( toExtract," " );
st.nextToken(); // GET
return st.nextToken();
} catch( Exception ex ) {
return "";
}
}
// -------------------- Repository for requet definitions ----------
static int idCounter=0;
static Hashtable allRequests=new Hashtable();
public static synchronized int getId() {
return idCounter++;
}
/** Return one of the "named" clients that have been executed so far.
*/
public static Hashtable getAllRequests() {
return allRequests;
}
public static void registerHttpRequest( String id, HttpRequest req ) {
allRequests.put( id, req );
}
public static HttpRequest getHttpRequest( String id ) {
return (HttpRequest)allRequests.get(id);
}
public static Enumeration getHttpRequests() {
return allRequests.keys();
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.