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}