001package dk.netarkivet.common.utils.service; 002 003import java.net.URI; 004 005import org.apache.http.client.config.RequestConfig; 006import org.apache.http.client.methods.HttpUriRequest; 007import org.apache.http.client.methods.RequestBuilder; 008 009import dk.netarkivet.common.CommonSettings; 010import dk.netarkivet.common.distribute.bitrepository.BitmagUtils; 011import dk.netarkivet.common.utils.Settings; 012 013/** Abstraction layer above the Apache RequestBuilder to use for building requests to interact with cgi-services */ 014public class CGIRequestBuilder { 015 private static final String USER_AGENT = "Mozilla/5.0"; 016 private static final int MILLISECONDS_PER_SECOND = 1000; 017 private static final int timeout = MILLISECONDS_PER_SECOND; 018 private final URI uri; 019 private RequestBuilder requestBuilder; 020 021 /** 022 * Constructor. 023 * @param uri The full URI with a path to a specific service's cgi-script and its parameters/queries. 024 */ 025 public CGIRequestBuilder(URI uri) { 026 this.uri = uri; 027 setUpDefaultRequestBuilder(); 028 } 029 030 /** 031 * Initializes the request builder and sets the default configurations that every request will have. 032 */ 033 private void setUpDefaultRequestBuilder() { 034 String collectionId = BitmagUtils.getDefaultCollectionID(); 035 requestBuilder = RequestBuilder.get() 036 .setUri(uri) 037 .addHeader("User-Agent", USER_AGENT) 038 .addParameter("collectionId", collectionId); 039 } 040 041 /** 042 * Adds the configurations to communicate with the warc record service (WRS) to the request builder 043 * and builds the request. 044 * @param offset The offset in the warc record to read from. 045 * @return A request to execute against WRS. 046 */ 047 public HttpUriRequest buildWRSRequest(long offset) { 048 setWRSTimeoutConfigurations(); 049 requestBuilder.addHeader("Range", "bytes=" + offset + "-"); 050 return buildRequest(uri); 051 } 052 053 /** 054 * Adds the configurations to communicate with the file resolver service to the request builder 055 * and builds the request. 056 * @param exactFilename Boolean specifying whether to resolve the path to an exact filename or default to regex. 057 * @return A request to execute against the file resolver. 058 */ 059 public HttpUriRequest buildFileResolverRequest(boolean exactFilename) { 060 requestBuilder.addParameter("exactfilename", Boolean.toString(exactFilename)); 061 return buildRequest(uri); 062 } 063 064 /** 065 * Builds the request with the specified uri. 066 * @param uri URI of the service to interact with. 067 * @return A request to execute. 068 */ 069 public HttpUriRequest buildRequest(URI uri) { 070 return requestBuilder.setUri(uri).build(); 071 } 072 073 /** 074 * Configures the request builder to set a connection timeout on the request. 075 */ 076 private void setWRSTimeoutConfigurations() { 077 RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); 078 requestConfigBuilder.setConnectTimeout(timeout); 079 requestConfigBuilder.setConnectionRequestTimeout(timeout); 080 RequestConfig requestConfig = requestConfigBuilder.build(); 081 requestBuilder.setConfig(requestConfig); 082 } 083}