001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.performance.http;
019
020 import java.util.logging.Logger;
021
022 import org.apache.commons.httpclient.HttpClient;
023 import org.apache.commons.httpclient.HttpException;
024 import org.apache.commons.httpclient.HttpMethod;
025 import org.apache.commons.httpclient.HttpStatus;
026 import org.apache.commons.httpclient.methods.GetMethod;
027 import org.apache.commons.httpclient.methods.PostMethod;
028
029 import org.apache.commons.performance.ClientThread;
030 import org.apache.commons.performance.Statistics;
031
032 /**
033 * Client thread that executes http requests in a loop against a configured
034 * url, with the number of requests, time between requests and
035 * query strings governed by constructor parameters. See
036 * {@link ClientThread ClientThread javadoc} for a description
037 * of how times between requests are computed.
038 *
039 */
040 public class HttpClientThread extends ClientThread {
041
042 private HttpClient httpClient = new HttpClient();
043 private HttpMethod httpMethod = null;
044 private String successKey = null;
045
046 public HttpClientThread(long iterations, long minDelay, long maxDelay,
047 double sigma, String delayType, long rampPeriod,
048 long peakPeriod, long troughPeriod, String cycleType,
049 String rampType, Logger logger,
050 Statistics stats, String url, String method,
051 int socketTimeout, String successKey) {
052
053 super(iterations, minDelay, maxDelay, sigma, delayType, rampPeriod,
054 peakPeriod, troughPeriod, cycleType, rampType, logger,
055 stats);
056
057 httpClient.getParams().setSoTimeout(socketTimeout);
058 if (method.trim().toUpperCase().equals("POST")) {
059 httpMethod = new PostMethod(url);
060 } else {
061 httpMethod = new GetMethod(url);
062 }
063 this.successKey = successKey;
064 }
065
066 /** Nothing to do here at this point */
067 public void setUp() throws Exception {}
068
069 /**
070 * Execute the http method against the target url.
071 * Throws HttpException if something other than 200 status is returned
072 * or if there is a successKey configured and the response does not contain
073 * the specified key.
074 */
075 public void execute() throws Exception {
076 int statusCode = httpClient.executeMethod(httpMethod);
077 if (statusCode != HttpStatus.SC_OK) {
078 throw new HttpException("Request failed with status code: "
079 + statusCode);
080 }
081 // Should use stream here - for now assume body is small
082 String responseBody = httpMethod.getResponseBodyAsString();
083 if (successKey != null && responseBody.indexOf(successKey) < 0 ) {
084 throw new HttpException("Response did not include success key: "
085 + successKey);
086 }
087 }
088
089 /** Release http connection */
090 public void cleanUp() throws Exception {
091 httpMethod.releaseConnection();
092 }
093
094 }