// ========================================================================
// Copyright (c) Webtide LLC
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.apache.org/licenses/LICENSE-2.0.txt
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
package org.eclipse.jetty.test.support.rawhttp;
import java.io.IOException;
import javax.servlet.http.Cookie;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpGenerator;
import org.eclipse.jetty.http.HttpHeaders;
import org.eclipse.jetty.http.HttpVersions;
import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.io.Buffer;
import org.eclipse.jetty.io.ByteArrayBuffer;
import org.eclipse.jetty.io.SimpleBuffers;
import org.eclipse.jetty.io.View;
import org.eclipse.jetty.io.bio.StringEndPoint;
/**
* Assist in Generating Proper Raw HTTP Requests. If you want ultimate control
* over the Raw HTTP Request, to test non-standard behavior, or partial HTTP
* Requests, do not use this class.
*
* <pre>
* HttpRequestTester request = new HttpRequestTester();
*
* request.setMethod("GET");
* request.setURI("/uri");
* request.setHost("fakehost");
* request.setConnectionClosed();
*
* String rawRequest = request.generate();
*
* System.out.println("--raw-request--\n" + rawRequest);
* </pre>
*
* <pre>
* --raw-request--
* GET /uri HTTP/1.1
* Host: fakehost
* Connection: close
* </pre>
*/
public class HttpRequestTester
{
private HttpFields fields = new HttpFields();
private String method;
private String uri;
private String version;
private byte[] content;
private String charset;
private String defaultCharset;
private String contentType;
public HttpRequestTester()
{
this("UTF-8");
}
public HttpRequestTester(String defCharset)
{
this.defaultCharset = defCharset;
}
public String getMethod()
{
return method;
}
public void setHost(String host)
{
addHeader("Host",host);
}
public void setMethod(String method)
{
this.method = method;
}
public String getURI()
{
return uri;
}
public void setURI(String uri)
{
this.uri = uri;
}
public String getVersion()
{
return version;
}
public void setVersion(String version)
{
this.version = version;
}
public String getCharset()
{
return charset;
}
public void setCharset(String charset)
{
this.charset = charset;
}
public String getContentType()
{
return contentType;
}
public void setContentType(String contentType)
{
this.contentType = contentType;
}
public void setConnectionClosed()
{
fields.add("Connection","close");
}
/**
* @param name
* @param value
* @throws IllegalArgumentException
* @see org.eclipse.jetty.http.HttpFields#add(java.lang.String,
* java.lang.String)
*/
public void addHeader(String name, String value) throws IllegalArgumentException
{
fields.add(name,value);
}
/**
* @param name
* @param date
* @see org.eclipse.jetty.http.HttpFields#addDateField(java.lang.String,
* long)
*/
public void addDateHeader(String name, long date)
{
fields.addDateField(name,date);
}
/**
* @param name
* @param value
* @see org.eclipse.jetty.http.HttpFields#addLongField(java.lang.String,
* long)
*/
public void addLongHeader(String name, long value)
{
fields.addLongField(name,value);
}
/**
* @param cookie
* @see org.eclipse.jetty.http.HttpFields#addSetCookie(org.eclipse.jetty.http.HttpCookie)
*/
public void addSetCookie(Cookie cookie)
{
fields.addSetCookie(cookie.getName(),cookie.getValue(),cookie.getDomain(),cookie.getPath(),cookie.getMaxAge(),cookie.getComment(),cookie.getSecure(),
false,cookie.getVersion());
}
public String generate() throws IOException
{
charset = defaultCharset;
Buffer contentTypeBuffer = fields.get(HttpHeaders.CONTENT_TYPE_BUFFER);
if (contentTypeBuffer != null)
{
String calcCharset = MimeTypes.getCharsetFromContentType(contentTypeBuffer);
if (calcCharset != null)
{
this.charset = calcCharset;
}
}
Buffer bb = new ByteArrayBuffer(32 * 1024 + (content != null?content.length:0));
Buffer sb = new ByteArrayBuffer(4 * 1024);
StringEndPoint endp = new StringEndPoint(charset);
HttpGenerator generator = new HttpGenerator(new SimpleBuffers(sb,bb),endp);
if (method != null)
{
generator.setRequest(getMethod(),getURI());
if (version == null)
{
generator.setVersion(HttpVersions.HTTP_1_1_ORDINAL);
}
else
{
generator.setVersion(HttpVersions.CACHE.getOrdinal(HttpVersions.CACHE.lookup(version)));
}
generator.completeHeader(fields,false);
if (content != null)
{
generator.addContent(new View(new ByteArrayBuffer(content)),false);
}
}
generator.complete();
generator.flushBuffer();
return endp.getOutput();
}
}