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 */
017package org.apache.commons.vfs2.provider.http;
018
019import java.time.Duration;
020
021import org.apache.commons.httpclient.Cookie;
022import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
023import org.apache.commons.httpclient.params.HttpConnectionParams;
024import org.apache.commons.vfs2.FileSystem;
025import org.apache.commons.vfs2.FileSystemConfigBuilder;
026import org.apache.commons.vfs2.FileSystemOptions;
027import org.apache.commons.vfs2.UserAuthenticator;
028
029/**
030 * Configuration options for HTTP.
031 *
032 * @deprecated Use {@link org.apache.commons.vfs2.provider.http5}.
033 */
034@Deprecated
035public class HttpFileSystemConfigBuilder extends FileSystemConfigBuilder {
036
037    /**
038     * Keys for FileSystemOptions.
039     */
040    protected static final String KEY_FOLLOW_REDIRECT = "followRedirect";
041
042    /**
043     * Keys for FileSystemOptions.
044     */
045    protected static final String KEY_USER_AGENT = "userAgent";
046
047    private static final HttpFileSystemConfigBuilder BUILDER = new HttpFileSystemConfigBuilder();
048
049    private static final int DEFAULT_MAX_HOST_CONNECTIONS = 5;
050
051    private static final int DEFAULT_MAX_CONNECTIONS = 50;
052
053    private static final Duration DEFAULT_CONNECTION_TIMEOUT = Duration.ZERO;
054
055    private static final Duration DEFAULT_SO_TIMEOUT = Duration.ZERO;
056
057    private static final boolean DEFAULT_FOLLOW_REDIRECT = true;
058
059    private static final String DEFAULT_USER_AGENT = "Jakarta-Commons-VFS";
060
061    private static final String KEY_PREEMPTIVE_AUTHENTICATION = "preemptiveAuth";
062
063    /**
064     * Gets the singleton builder.
065     *
066     * @return the singleton builder.
067     */
068    public static HttpFileSystemConfigBuilder getInstance() {
069        return BUILDER;
070    }
071
072    private HttpFileSystemConfigBuilder() {
073        super("http.");
074    }
075
076    /**
077     * Creates new config builder.
078     *
079     * @param prefix String for properties of this file system.
080     * @since 2.0
081     */
082    protected HttpFileSystemConfigBuilder(final String prefix) {
083        super(prefix);
084    }
085
086    @Override
087    protected Class<? extends FileSystem> getConfigClass() {
088        return HttpFileSystem.class;
089    }
090
091    /**
092     * Gets the connection timeout.
093     *
094     * @param opts The FileSystem options.
095     * @return The connection timeout.
096     * @since 2.1
097     * @deprecated Use {@link #getConnectionTimeoutDuration(FileSystemOptions)}.
098     */
099    @Deprecated
100    public int getConnectionTimeout(final FileSystemOptions opts) {
101        return getDurationInteger(opts, HttpConnectionParams.CONNECTION_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT);
102    }
103
104    /**
105     * Gets the connection timeout.
106     *
107     * @param opts The FileSystem options.
108     * @return The connection timeout.
109     * @since 2.8.0
110     */
111    public Duration getConnectionTimeoutDuration(final FileSystemOptions opts) {
112        return getDuration(opts, HttpConnectionParams.CONNECTION_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT);
113    }
114
115    /**
116     * Gets the cookies to add to the request.
117     *
118     * @param opts The FileSystem options.
119     * @return the Cookie array.
120     */
121    public Cookie[] getCookies(final FileSystemOptions opts) {
122        return getParam(opts, "cookies");
123    }
124
125    /**
126     * Gets whether to follow redirects for the connection.
127     *
128     * @param opts The FileSystem options.
129     * @return {@code true} to follow redirects, {@code false} not to.
130     * @see #setFollowRedirect
131     * @since 2.1
132     */
133    public boolean getFollowRedirect(final FileSystemOptions opts) {
134        return getBoolean(opts, KEY_FOLLOW_REDIRECT, DEFAULT_FOLLOW_REDIRECT);
135    }
136
137    /**
138     * Gets the maximum number of connections allowed per host.
139     *
140     * @param opts The FileSystemOptions.
141     * @return The maximum number of connections allowed per host.
142     * @since 2.0
143     */
144    public int getMaxConnectionsPerHost(final FileSystemOptions opts) {
145        return getInteger(opts, HttpConnectionManagerParams.MAX_HOST_CONNECTIONS, DEFAULT_MAX_HOST_CONNECTIONS);
146    }
147
148    /**
149     * Gets the maximum number of connections allowed.
150     *
151     * @param opts The FileSystemOptions.
152     * @return The maximum number of connections allowed.
153     * @since 2.0
154     */
155    public int getMaxTotalConnections(final FileSystemOptions opts) {
156        return getInteger(opts, HttpConnectionManagerParams.MAX_TOTAL_CONNECTIONS, DEFAULT_MAX_CONNECTIONS);
157    }
158
159    /**
160     * Gets the proxy authenticator where the system should get the credentials from.
161     *
162     * @param opts The FileSystem options.
163     * @return The UserAuthenticator.
164     */
165    public UserAuthenticator getProxyAuthenticator(final FileSystemOptions opts) {
166        return getParam(opts, "proxyAuthenticator");
167    }
168
169    /**
170     * Gets the proxy to use for http connection. You have to set the ProxyPort too if you would like to have the proxy
171     * really used.
172     *
173     * @param opts The FileSystem options.
174     * @return proxyHost
175     * @see #setProxyPort
176     */
177    public String getProxyHost(final FileSystemOptions opts) {
178        return getString(opts, "proxyHost");
179    }
180
181    /**
182     * Gets the proxy-port to use for http the connection. You have to set the ProxyHost too if you would like to have
183     * the proxy really used.
184     *
185     * @param opts The FileSystem options.
186     * @return proxyPort: the port number or 0 if it is not set
187     * @see #setProxyHost
188     */
189    public int getProxyPort(final FileSystemOptions opts) {
190        return getInteger(opts, "proxyPort", 0);
191    }
192
193    /**
194     * Gets the socket timeout.
195     *
196     * @param opts The FileSystemOptions.
197     * @return The socket timeout.
198     * @since 2.1
199     * @deprecated Use {@link #getSoTimeoutDuration(FileSystemOptions)}.
200     */
201    @Deprecated
202    public int getSoTimeout(final FileSystemOptions opts) {
203        return getDurationInteger(opts, HttpConnectionParams.SO_TIMEOUT, DEFAULT_SO_TIMEOUT);
204    }
205
206    /**
207     * Gets the socket timeout.
208     *
209     * @param opts The FileSystemOptions.
210     * @return The socket timeout.
211     * @since 2.8.0
212     */
213    public Duration getSoTimeoutDuration(final FileSystemOptions opts) {
214        return getDuration(opts, HttpConnectionParams.SO_TIMEOUT, DEFAULT_SO_TIMEOUT);
215    }
216
217    /**
218     * Gets the charset used for url encoding.
219     *
220     * @param opts The FileSystem options.
221     * @return the charset name.
222     */
223    public String getUrlCharset(final FileSystemOptions opts) {
224        return getString(opts, "urlCharset");
225    }
226
227    /**
228     * Gets the user agent string.
229     *
230     * @param opts the file system options to modify
231     * @return User provided User-Agent string, otherwise default of: Commons-VFS
232     */
233    public String getUserAgent(final FileSystemOptions opts) {
234        final String userAgent = getParam(opts, KEY_USER_AGENT);
235        return userAgent != null ? userAgent : DEFAULT_USER_AGENT;
236    }
237
238    /**
239     * Determines if the FileSystemOptions indicate that preemptive authentication is requested.
240     *
241     * @param opts The FileSystemOptions.
242     * @return true if preemptiveAuth is requested.
243     * @since 2.0
244     */
245    public boolean isPreemptiveAuth(final FileSystemOptions opts) {
246        return getBoolean(opts, KEY_PREEMPTIVE_AUTHENTICATION, Boolean.FALSE).booleanValue();
247    }
248
249    /**
250     * The connection timeout.
251     *
252     * @param opts The FileSystem options.
253     * @param timeout The connection timeout.
254     * @since 2.8.0
255     */
256    public void setConnectionTimeout(final FileSystemOptions opts, final Duration timeout) {
257        setParam(opts, HttpConnectionParams.CONNECTION_TIMEOUT, timeout);
258    }
259
260    /**
261     * The connection timeout.
262     *
263     * @param opts The FileSystem options.
264     * @param timeout The connection timeout.
265     * @since 2.1
266     * @deprecated Use {@link #setConnectionTimeout(FileSystemOptions, Duration)}.
267     */
268    @Deprecated
269    public void setConnectionTimeout(final FileSystemOptions opts, final int timeout) {
270        setConnectionTimeout(opts, Duration.ofMillis(timeout));
271    }
272
273    /**
274     * The cookies to add to the request.
275     *
276     * @param opts The FileSystem options.
277     * @param cookies An array of Cookies.
278     */
279    public void setCookies(final FileSystemOptions opts, final Cookie[] cookies) {
280        setParam(opts, "cookies", cookies);
281    }
282
283    /**
284     * Sets whether to follow redirects for the connection.
285     *
286     * @param opts The FileSystem options.
287     * @param redirect {@code true} to follow redirects, {@code false} not to.
288     * @see #setFollowRedirect
289     * @since 2.1
290     */
291    public void setFollowRedirect(final FileSystemOptions opts, final boolean redirect) {
292        setParam(opts, KEY_FOLLOW_REDIRECT, redirect);
293    }
294
295    /**
296     * Sets the maximum number of connections allowed to any host.
297     *
298     * @param opts The FileSystem options.
299     * @param maxHostConnections The maximum number of connections to a host.
300     * @since 2.0
301     */
302    public void setMaxConnectionsPerHost(final FileSystemOptions opts, final int maxHostConnections) {
303        setParam(opts, HttpConnectionManagerParams.MAX_HOST_CONNECTIONS, Integer.valueOf(maxHostConnections));
304    }
305
306    /**
307     * Sets the maximum number of connections allowed.
308     *
309     * @param opts The FileSystem options.
310     * @param maxTotalConnections The maximum number of connections.
311     * @since 2.0
312     */
313    public void setMaxTotalConnections(final FileSystemOptions opts, final int maxTotalConnections) {
314        setParam(opts, HttpConnectionManagerParams.MAX_TOTAL_CONNECTIONS, Integer.valueOf(maxTotalConnections));
315    }
316
317    /**
318     * Sets the given value for preemptive HTTP authentication (using BASIC) on the given FileSystemOptions object.
319     * Defaults to false if not set. It may be appropriate to set to true in cases when the resulting chattiness of the
320     * conversation outweighs any architectural desire to use a stronger authentication scheme than basic/preemptive.
321     *
322     * @param opts The FileSystemOptions.
323     * @param preemptiveAuth the desired setting; true=enabled and false=disabled.
324     */
325    public void setPreemptiveAuth(final FileSystemOptions opts, final boolean preemptiveAuth) {
326        setParam(opts, KEY_PREEMPTIVE_AUTHENTICATION, Boolean.valueOf(preemptiveAuth));
327    }
328
329    /**
330     * Sets the proxy authenticator where the system should get the credentials from.
331     *
332     * @param opts The FileSystem options.
333     * @param authenticator The UserAuthenticator.
334     */
335    public void setProxyAuthenticator(final FileSystemOptions opts, final UserAuthenticator authenticator) {
336        setParam(opts, "proxyAuthenticator", authenticator);
337    }
338
339    /**
340     * Sets the proxy to use for http connection.
341     * <p>
342     * You have to set the ProxyPort too if you would like to have the proxy really used.
343     * </p>
344     *
345     * @param opts The FileSystem options.
346     * @param proxyHost the host
347     * @see #setProxyPort
348     */
349    public void setProxyHost(final FileSystemOptions opts, final String proxyHost) {
350        setParam(opts, "proxyHost", proxyHost);
351    }
352
353    /**
354     * Sets the proxy-port to use for http connection. You have to set the ProxyHost too if you would like to have the
355     * proxy really used.
356     *
357     * @param opts The FileSystem options.
358     * @param proxyPort the port
359     * @see #setProxyHost
360     */
361    public void setProxyPort(final FileSystemOptions opts, final int proxyPort) {
362        setParam(opts, "proxyPort", Integer.valueOf(proxyPort));
363    }
364
365    /**
366     * The socket timeout.
367     *
368     * @param opts The FileSystem options.
369     * @param timeout socket timeout.
370     * @since 2.8.0
371     */
372    public void setSoTimeout(final FileSystemOptions opts, final Duration timeout) {
373        setParam(opts, HttpConnectionParams.SO_TIMEOUT, timeout);
374    }
375
376    /**
377     * The socket timeout.
378     *
379     * @param opts The FileSystem options.
380     * @param timeout socket timeout.
381     * @since 2.1
382     * @deprecated Use {@link #setSoTimeout(FileSystemOptions, Duration)}.
383     */
384    @Deprecated
385    public void setSoTimeout(final FileSystemOptions opts, final int timeout) {
386        setSoTimeout(opts, Duration.ofMillis(timeout));
387    }
388
389    /**
390     * Sets the charset used for url encoding.
391     *
392     * @param opts The FileSystem options.
393     * @param charset the charset name.
394     */
395    public void setUrlCharset(final FileSystemOptions opts, final String charset) {
396        setParam(opts, "urlCharset", charset);
397    }
398
399    /**
400     * Sets the user agent to attach to the outgoing http methods.
401     *
402     * @param opts the file system options to modify
403     * @param userAgent User Agent String
404     */
405    public void setUserAgent(final FileSystemOptions opts, final String userAgent) {
406        setParam(opts, "userAgent", userAgent);
407    }
408}