Author: olegk Date: Fri Mar 24 12:36:22 2006 New Revision: 388628 URL: http://svn.apache.org/viewcvs?rev=388628&view=rev Log: A simple HTTP benchmark tool based on HttpClient, which implements a subset of AB (Apache Benchmark) interface Backported from Jakarta HttpComponents HttpCore
Added: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/ - copied from r388545, jakarta/httpcomponents/trunk/http-core/src/contrib/org/apache/http/contrib/benchmark/ jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/FileRequestEntity.java (with props) Modified: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/BenchmarkWorker.java jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/HttpBenchmark.java jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/Stats.java Modified: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/BenchmarkWorker.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/BenchmarkWorker.java?rev=388628&r1=388545&r2=388628&view=diff ============================================================================== --- jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/BenchmarkWorker.java (original) +++ jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/BenchmarkWorker.java Fri Mar 24 12:36:22 2006 @@ -26,87 +26,75 @@ * <http://www.apache.org/>. * */ -package org.apache.http.contrib.benchmark; +package org.apache.commons.httpclient.contrib.benchmark; import java.io.IOException; import java.io.InputStream; -import org.apache.http.ConnectionReuseStrategy; -import org.apache.http.Header; -import org.apache.http.HttpClientConnection; -import org.apache.http.HttpEntity; -import org.apache.http.HttpException; -import org.apache.http.HttpRequest; -import org.apache.http.HttpResponse; -import org.apache.http.impl.DefaultConnectionReuseStrategy; -import org.apache.http.protocol.HttpRequestExecutor; +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HostConfiguration; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.HttpMethod; /** - * <p> - * </p> + * <p>Benchmark worker that can execute an HTTP method given number of times</p> + * * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> * * @version $Revision$ - * - * @since 4.0 */ public class BenchmarkWorker { private byte[] buffer = new byte[4096]; private final int verbosity; - private final HttpRequestExecutor httpexecutor; - private final ConnectionReuseStrategy connstrategy; + private final HttpClient httpexecutor; - public BenchmarkWorker(final HttpRequestExecutor httpexecutor, int verbosity) { + public BenchmarkWorker(final HttpClient httpexecutor, int verbosity) { super(); this.httpexecutor = httpexecutor; - this.connstrategy = new DefaultConnectionReuseStrategy(); this.verbosity = verbosity; } public Stats execute( - final HttpRequest request, - final HttpClientConnection conn, + final HostConfiguration hostconf, + final HttpMethod method, int count, boolean keepalive) throws HttpException { - HttpResponse response = null; Stats stats = new Stats(); stats.start(); for (int i = 0; i < count; i++) { try { - response = this.httpexecutor.execute(request, conn); + this.httpexecutor.executeMethod(hostconf, method); if (this.verbosity >= 4) { - System.out.println(">> " + request.getRequestLine().toString()); - Header[] headers = request.getAllHeaders(); + System.out.println(">> " + method.getName() + " " + + method.getURI() + " " + method.getParams().getVersion()); + Header[] headers = method.getRequestHeaders(); for (int h = 0; h < headers.length; h++) { - System.out.println(">> " + headers[h].toString()); + System.out.print(">> " + headers[h].toString()); } System.out.println(); } if (this.verbosity >= 3) { - System.out.println(response.getStatusLine().getStatusCode()); + System.out.println(method.getStatusLine().getStatusCode()); } if (this.verbosity >= 4) { - System.out.println("<< " + response.getStatusLine().toString()); - Header[] headers = response.getAllHeaders(); + System.out.println("<< " + method.getStatusLine().toString()); + Header[] headers = method.getResponseHeaders(); for (int h = 0; h < headers.length; h++) { - System.out.println("<< " + headers[h].toString()); + System.out.print("<< " + headers[h].toString()); } System.out.println(); } - HttpEntity entity = response.getEntity(); + InputStream instream = method.getResponseBodyAsStream(); long contentlen = 0; - if (entity != null) { - InputStream instream = entity.getContent(); + if (instream != null) { int l = 0; while ((l = instream.read(this.buffer)) != -1) { stats.incTotal(l); contentlen += l; } } - if (!keepalive || !this.connstrategy.keepAlive(response)) { - conn.close(); - } stats.setContentLength(contentlen); stats.incSuccessCount(); } catch (IOException ex) { @@ -114,14 +102,17 @@ if (this.verbosity >= 2) { System.err.println("I/O error: " + ex.getMessage()); } + } finally { + method.releaseConnection(); + } + if (!keepalive) { + this.httpexecutor.getHttpConnectionManager().closeIdleConnections(0); } } stats.finish(); - if (response != null) { - Header header = response.getFirstHeader("Server"); - if (header != null) { - stats.setServerName(header.getValue()); - } + Header header = method.getResponseHeader("Server"); + if (header != null) { + stats.setServerName(header.getValue()); } return stats; } Added: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/FileRequestEntity.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/FileRequestEntity.java?rev=388628&view=auto ============================================================================== --- jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/FileRequestEntity.java (added) +++ jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/FileRequestEntity.java Fri Mar 24 12:36:22 2006 @@ -0,0 +1,73 @@ +/* + * $HeadURL$ + * $Revision$ + * $Date$ + * + * ==================================================================== + * + * Copyright 1999-2006 The Apache Software 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + * + */ +package org.apache.commons.httpclient.contrib.benchmark; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import org.apache.commons.httpclient.methods.RequestEntity; + +public class FileRequestEntity implements RequestEntity { + + final File file; + final String contentType; + + public FileRequestEntity(final File file, final String contentType) { + super(); + if (file == null) { + throw new IllegalArgumentException("File may not be null"); + } + this.file = file; + this.contentType = contentType; + } + public long getContentLength() { + return this.file.length(); + } + + public String getContentType() { + return this.contentType; + } + + public boolean isRepeatable() { + return true; + } + + public void writeRequest(final OutputStream out) throws IOException { + byte[] tmp = new byte[4096]; + int i = 0; + InputStream instream = new FileInputStream(this.file); + while ((i = instream.read(tmp)) >= 0) { + out.write(tmp, 0, i); + } + } + +} Propchange: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/FileRequestEntity.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/FileRequestEntity.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/FileRequestEntity.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/HttpBenchmark.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/HttpBenchmark.java?rev=388628&r1=388545&r2=388628&view=diff ============================================================================== --- jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/HttpBenchmark.java (original) +++ jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/HttpBenchmark.java Fri Mar 24 12:36:22 2006 @@ -26,7 +26,7 @@ * <http://www.apache.org/>. * */ -package org.apache.http.contrib.benchmark; +package org.apache.commons.httpclient.contrib.benchmark; import java.io.File; import java.net.URL; @@ -37,57 +37,30 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.http.HttpHost; -import org.apache.http.HttpRequest; -import org.apache.http.HttpVersion; -import org.apache.http.Scheme; -import org.apache.http.entity.FileEntity; -import org.apache.http.impl.DefaultHttpClientConnection; -import org.apache.http.impl.DefaultHttpParams; -import org.apache.http.impl.io.PlainSocketFactory; -import org.apache.http.impl.io.SSLSocketFactory; -import org.apache.http.message.HttpGet; -import org.apache.http.message.HttpHead; -import org.apache.http.message.HttpPost; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpParams; -import org.apache.http.params.HttpProtocolParams; -import org.apache.http.protocol.HttpRequestExecutor; -import org.apache.http.protocol.RequestConnControl; -import org.apache.http.protocol.RequestContent; -import org.apache.http.protocol.RequestExpectContinue; -import org.apache.http.protocol.RequestTargetHost; -import org.apache.http.protocol.RequestUserAgent; +import org.apache.commons.httpclient.HostConfiguration; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.HttpVersion; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.HeadMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.params.HttpMethodParams; /** - * <p> - * </p> + * <p>A simple HTTP benchmark tool, which implements a subset of AB (Apache Benchmark) interface</p> + * * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> * * @version $Revision$ - * - * @since 4.0 */ public class HttpBenchmark { - private static HttpRequestExecutor createRequestExecutor() { - HttpParams params = new DefaultHttpParams(null); - params.setParameter(HttpProtocolParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_1) - .setParameter(HttpProtocolParams.USER_AGENT, "Jakarta HttpComponents") - .setBooleanParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false) - .setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK, false); - - HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); - httpexecutor.setParams(params); - - // Required request interceptors - httpexecutor.addInterceptor(new RequestContent()); - httpexecutor.addInterceptor(new RequestTargetHost()); - // Recommended request interceptors - httpexecutor.addInterceptor(new RequestConnControl()); - httpexecutor.addInterceptor(new RequestUserAgent()); - httpexecutor.addInterceptor(new RequestExpectContinue()); - return httpexecutor; + private static HttpClient createRequestExecutor() { + HttpClient httpclient = new HttpClient(); + httpclient.getParams().setVersion(HttpVersion.HTTP_1_1); + httpclient.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, false); + httpclient.getHttpConnectionManager().getParams().setStaleCheckingEnabled(false); + return httpclient; } public static void main(String[] args) throws Exception { @@ -183,22 +156,17 @@ // Parse the target url URL url = new URL(args[0]); - // Register standard protocol schemes - Scheme.registerScheme("http", - new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); - Scheme.registerScheme("https", - new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); - - // Prepare connection - HttpHost host = new HttpHost( + // Prepare host configuration + HostConfiguration hostconf = new HostConfiguration(); + hostconf.setHost( url.getHost(), url.getPort(), - Scheme.getScheme(url.getProtocol())); - DefaultHttpClientConnection conn = new DefaultHttpClientConnection(host); + url.getProtocol()); // Prepare request - HttpRequest request = null; + HttpMethod method = null; if (cmd.hasOption('p')) { + PostMethod httppost = new PostMethod(url.getPath()); File file = new File(cmd.getOptionValue('p')); if (!file.exists()) { System.err.println("File not found: " + file); @@ -208,32 +176,29 @@ if (cmd.hasOption('T')) { contenttype = cmd.getOptionValue('T'); } - FileEntity entity = new FileEntity(file, contenttype); + FileRequestEntity entity = new FileRequestEntity(file, contenttype); + httppost.setRequestEntity(entity); if (file.length() > 100000) { - entity.setChunked(true); + httppost.setContentChunked(true); } - HttpPost httppost = new HttpPost(url.getPath()); - httppost.setEntity(entity); - request = httppost; + method = httppost; } else if (cmd.hasOption('i')) { - HttpHead httphead = new HttpHead(url.getPath()); - request = httphead; + HeadMethod httphead = new HeadMethod(url.getPath()); + method = httphead; } else { - HttpGet httpget = new HttpGet(url.getPath()); - request = httpget; + GetMethod httpget = new GetMethod(url.getPath()); + method = httpget; + } + if (!keepAlive) { + method.addRequestHeader("Connection", "close"); } // Prepare request executor - HttpRequestExecutor executor = createRequestExecutor(); + HttpClient executor = createRequestExecutor(); BenchmarkWorker worker = new BenchmarkWorker(executor, verbosity); // Execute - Stats stats = null; - try { - stats = worker.execute(request, conn, num, keepAlive); - } finally { - conn.close(); - } + Stats stats = worker.execute(hostconf, method, num, keepAlive); // Show the results float totalTimeSec = (float)stats.getDuration() / 1000; @@ -243,16 +208,16 @@ System.out.print("Server Software:\t"); System.out.println(stats.getServerName()); System.out.print("Server Hostname:\t"); - System.out.println(host.getHostName()); + System.out.println(hostconf.getHost()); System.out.print("Server Port:\t\t"); - if (host.getPort() > 0) { - System.out.println(host.getPort()); + if (hostconf.getPort() > 0) { + System.out.println(hostconf.getPort()); } else { - System.out.println(host.getScheme().getDefaultPort()); + System.out.println(hostconf.getProtocol().getDefaultPort()); } System.out.println(); System.out.print("Document Path:\t\t"); - System.out.println(request.getRequestLine().getUri()); + System.out.println(method.getURI()); System.out.print("Document Length:\t"); System.out.print(stats.getContentLength()); System.out.println(" bytes"); Modified: jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/Stats.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/Stats.java?rev=388628&r1=388545&r2=388628&view=diff ============================================================================== --- jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/Stats.java (original) +++ jakarta/commons/proper/httpclient/trunk/src/contrib/org/apache/commons/httpclient/contrib/benchmark/Stats.java Fri Mar 24 12:36:22 2006 @@ -26,16 +26,14 @@ * <http://www.apache.org/>. * */ -package org.apache.http.contrib.benchmark; +package org.apache.commons.httpclient.contrib.benchmark; /** - * <p> - * </p> + * <p>Benchmark statistics</p> + * * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> * * @version $Revision$ - * - * @since 4.0 */ public class Stats { --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]