String urlStr = url.toString();
log.debug("Start : sample " + urlStr);
log.debug("method " + method);
HttpMethodBase httpMethod = null;
HTTPSampleResult res = new HTTPSampleResult();
res.setMonitor(isMonitor());
res.setSampleLabel(urlStr); // May be replaced later
res.setHTTPMethod(method);
res.setURL(url);
res.sampleStart(); // Count the retries as well in the time
try {
// May generate IllegalArgumentException
if (method.equals(POST)) {
httpMethod = new PostMethod(urlStr);
} else if (method.equals(PUT)){
httpMethod = new PutMethod(urlStr);
} else if (method.equals(HEAD)){
httpMethod = new HeadMethod(urlStr);
} else if (method.equals(TRACE)){
httpMethod = new TraceMethod(urlStr);
} else if (method.equals(OPTIONS)){
httpMethod = new OptionsMethod(urlStr);
} else if (method.equals(DELETE)){
httpMethod = new DeleteMethod(urlStr);
} else if (method.equals(GET)){
httpMethod = new GetMethod(urlStr);
} else {
throw new IllegalArgumentException("Unexpected method: "+method);
}
final CacheManager cacheManager = getCacheManager();
if (cacheManager != null && GET.equalsIgnoreCase(method)) {
if (cacheManager.inCache(url)) {
res.sampleEnd();
res.setResponseNoContent();
res.setSuccessful(true);
return res;
}
}
// Set any default request headers
setDefaultRequestHeaders(httpMethod);
// Setup connection
HttpClient client = setupConnection(url, httpMethod, res);
savedClient = client;
// Handle the various methods
if (method.equals(POST)) {
String postBody = sendPostData((PostMethod)httpMethod);
res.setQueryString(postBody);
} else if (method.equals(PUT)) {
String putBody = sendPutData((PutMethod)httpMethod);
res.setQueryString(putBody);
}
int statusCode = client.executeMethod(httpMethod);
// Needs to be done after execute to pick up all the headers
res.setRequestHeaders(getConnectionHeaders(httpMethod));
// Request sent. Now get the response:
InputStream instream = httpMethod.getResponseBodyAsStream();
if (instream != null) {// will be null for HEAD
instream = new CountingInputStream(instream);
try {
Header responseHeader = httpMethod.getResponseHeader(HEADER_CONTENT_ENCODING);
if (responseHeader!= null && ENCODING_GZIP.equals(responseHeader.getValue())) {
InputStream tmpInput = new GZIPInputStream(instream); // tmp inputstream needs to have a good counting
res.setResponseData(readResponse(res, tmpInput, (int) httpMethod.getResponseContentLength()));
} else {
res.setResponseData(readResponse(res, instream, (int) httpMethod.getResponseContentLength()));
}
} finally {
JOrphanUtils.closeQuietly(instream);
}
}
res.sampleEnd();
// Done with the sampling proper.
// Now collect the results into the HTTPSampleResult:
res.setSampleLabel(httpMethod.getURI().toString());
// Pick up Actual path (after redirects)
res.setResponseCode(Integer.toString(statusCode));
res.setSuccessful(isSuccessCode(statusCode));
res.setResponseMessage(httpMethod.getStatusText());
String ct = null;
Header h = httpMethod.getResponseHeader(HEADER_CONTENT_TYPE);
if (h != null)// Can be missing, e.g. on redirect
{
ct = h.getValue();
res.setContentType(ct);// e.g. text/html; charset=ISO-8859-1
res.setEncodingAndType(ct);
}
res.setResponseHeaders(getResponseHeaders(httpMethod));
if (res.isRedirect()) {
final Header headerLocation = httpMethod.getResponseHeader(HEADER_LOCATION);
if (headerLocation == null) { // HTTP protocol violation, but avoids NPE
throw new IllegalArgumentException("Missing location header");
}
res.setRedirectLocation(headerLocation.getValue());
}
// record some sizes to allow HTTPSampleResult.getBytes() with different options
if (instream != null) {
res.setBodySize(((CountingInputStream) instream).getCount());
}
res.setHeadersSize(calculateHeadersSize(httpMethod));
if (log.isDebugEnabled()) {
log.debug("Response headersSize=" + res.getHeadersSize() + " bodySize=" + res.getBodySize()
+ " Total=" + (res.getHeadersSize() + res.getBodySize()));
}
// If we redirected automatically, the URL may have changed
if (getAutoRedirects()){
res.setURL(new URL(httpMethod.getURI().toString()));
}
// Store any cookies received in the cookie manager:
saveConnectionCookies(httpMethod, res.getURL(), getCookieManager());
// Save cache information
if (cacheManager != null){
cacheManager.saveDetails(httpMethod, res);
}
// Follow redirects and download page resources if appropriate:
res = resultProcessing(areFollowingRedirect, frameDepth, res);
log.debug("End : sample");
return res;
} catch (IllegalArgumentException e)// e.g. some kinds of invalid URL
{
res.sampleEnd();
HTTPSampleResult err = errorResult(e, res);
err.setSampleLabel("Error: " + url.toString());
return err;
} catch (IOException e) {
res.sampleEnd();
HTTPSampleResult err = errorResult(e, res);
err.setSampleLabel("Error: " + url.toString());
return err;
} finally {
savedClient = null;
if (httpMethod != null) {
httpMethod.releaseConnection();
}
}
}