CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-seleniumhq-selenium--selenium-http

HTTP client and server abstractions for Selenium WebDriver communication

Pending
Overview
Eval results
Files

client-config.mddocs/

Client Configuration

Flexible client configuration system with builder pattern for setting timeouts, authentication, proxies, SSL context, and filter chains for HTTP clients.

Capabilities

ClientConfig Class

Immutable configuration class using builder pattern for HTTP client setup with comprehensive options for network settings, security, and request processing.

/**
 * Immutable HTTP client configuration using builder pattern
 * Provides comprehensive settings for timeouts, security, filtering, and network
 */
public class ClientConfig {
    /**
     * Creates default configuration with system property overrides
     * Connection timeout: 10 seconds (webdriver.httpclient.connectionTimeout)
     * Read timeout: 180 seconds (webdriver.httpclient.readTimeout)
     * Default filter: AddSeleniumUserAgent
     * HTTP version: System property (webdriver.httpclient.version)
     * @return Default ClientConfig instance
     */
    public static ClientConfig defaultConfig();
    
    /**
     * Sets base URI for all requests
     * @param baseUri Base URI for HTTP client
     * @return New ClientConfig instance with updated base URI
     */
    public ClientConfig baseUri(URI baseUri);
    
    /**
     * Sets base URL for all requests (converts to URI)
     * @param baseUrl Base URL for HTTP client
     * @return New ClientConfig instance with updated base URL
     * @throws RuntimeException if URL cannot be converted to URI
     */
    public ClientConfig baseUrl(URL baseUrl);
    
    /**
     * Gets configured base URI
     * @return Base URI or null if not set
     */
    public URI baseUri();
    
    /**
     * Gets configured base URL (converts from URI)
     * @return Base URL
     * @throws UncheckedIOException if URI cannot be converted to URL
     */
    public URL baseUrl();
    
    /**
     * Sets connection timeout duration
     * @param timeout Connection timeout (must be non-negative)
     * @return New ClientConfig instance with updated timeout
     */
    public ClientConfig connectionTimeout(Duration timeout);
    
    /**
     * Gets connection timeout duration
     * @return Connection timeout duration
     */
    public Duration connectionTimeout();
    
    /**
     * Sets read timeout duration
     * @param timeout Read timeout (must be non-negative)
     * @return New ClientConfig instance with updated timeout
     */
    public ClientConfig readTimeout(Duration timeout);
    
    /**
     * Gets read timeout duration
     * @return Read timeout duration
     */
    public Duration readTimeout();
    
    /**
     * Adds custom filter to filter chain
     * Filter is added before default AddSeleniumUserAgent filter
     * @param filter Custom filter to add
     * @return New ClientConfig instance with additional filter
     */
    public ClientConfig withFilter(Filter filter);
    
    /**
     * Enables automatic retry filter for failed requests
     * Adds RetryRequest filter to handle connection failures and server errors
     * @return New ClientConfig instance with retry support
     */
    public ClientConfig withRetries();
    
    /**
     * Gets current filter chain
     * @return Combined filter chain
     */
    public Filter filter();
    
    /**
     * Sets HTTP proxy for requests
     * @param proxy Proxy configuration
     * @return New ClientConfig instance with proxy settings
     */
    public ClientConfig proxy(Proxy proxy);
    
    /**
     * Gets configured proxy
     * @return Proxy configuration or null if not set
     */
    public Proxy proxy();
    
    /**
     * Sets authentication credentials
     * @param credentials Authentication credentials
     * @return New ClientConfig instance with authentication
     */
    public ClientConfig authenticateAs(Credentials credentials);
    
    /**
     * Gets authentication credentials
     * @return Credentials or null if not set
     */
    public Credentials credentials();
    
    /**
     * Sets custom SSL context for HTTPS connections
     * @param sslContext SSL context configuration
     * @return New ClientConfig instance with SSL settings
     */
    public ClientConfig sslContext(SSLContext sslContext);
    
    /**
     * Gets SSL context
     * @return SSL context or null if using default
     */
    public SSLContext sslContext();
    
    /**
     * Sets HTTP protocol version
     * @param version HTTP version string
     * @return New ClientConfig instance with version setting
     */
    public ClientConfig version(String version);
    
    /**
     * Gets HTTP protocol version
     * @return HTTP version string or null if using default
     */
    public String version();
    
    /**
     * String representation of configuration
     * @return String showing all configuration values
     */
    public String toString();
}

Usage Examples:

import org.openqa.selenium.remote.http.*;
import java.net.URL;
import java.net.Proxy;
import java.net.InetSocketAddress;
import java.time.Duration;
import javax.net.ssl.SSLContext;

// Basic configuration
ClientConfig basicConfig = ClientConfig.defaultConfig()
    .baseUrl(new URL("https://api.example.com"))
    .connectionTimeout(Duration.ofSeconds(30))
    .readTimeout(Duration.ofMinutes(2));

// Configuration with proxy
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.company.com", 8080));
ClientConfig proxyConfig = ClientConfig.defaultConfig()
    .baseUrl(new URL("https://api.example.com"))
    .proxy(proxy);

// Configuration with authentication
Credentials credentials = new UsernamePasswordCredentials("username", "password");
ClientConfig authConfig = ClientConfig.defaultConfig()
    .baseUrl(new URL("https://api.example.com"))
    .authenticateAs(credentials);

// Configuration with custom SSL context
SSLContext sslContext = SSLContext.getInstance("TLS");
// ... configure SSL context
ClientConfig sslConfig = ClientConfig.defaultConfig()
    .baseUrl(new URL("https://api.example.com"))
    .sslContext(sslContext);

// Configuration with retries and custom filter
Filter loggingFilter = new DumpHttpExchangeFilter();
ClientConfig advancedConfig = ClientConfig.defaultConfig()
    .baseUrl(new URL("https://api.example.com"))
    .connectionTimeout(Duration.ofSeconds(45))
    .readTimeout(Duration.ofMinutes(3))
    .withFilter(loggingFilter)
    .withRetries()
    .version("HTTP/2");

// Create HTTP client with configuration
HttpClient client = HttpClient.Factory.createDefault().createClient(advancedConfig);

// Configuration is immutable - each method returns new instance
ClientConfig config1 = ClientConfig.defaultConfig();
ClientConfig config2 = config1.connectionTimeout(Duration.ofSeconds(30));
// config1 still has original timeout, config2 has new timeout

System.out.println("Config details: " + advancedConfig.toString());

System Property Configuration

Default configuration can be influenced by system properties:

// Connection timeout (default: 10 seconds)
System.setProperty("webdriver.httpclient.connectionTimeout", "30");

// Read timeout (default: 180 seconds)  
System.setProperty("webdriver.httpclient.readTimeout", "300");

// HTTP client version
System.setProperty("webdriver.httpclient.version", "HTTP/2");

// HTTP client implementation (used by Factory.createDefault())
System.setProperty("webdriver.http.factory", "my-custom-client");

// Create client with system property defaults
ClientConfig config = ClientConfig.defaultConfig();

Configuration Chaining

All configuration methods return new instances, enabling fluent method chaining:

import org.openqa.selenium.remote.http.*;
import java.net.URL;
import java.time.Duration;

// Chain multiple configuration options
ClientConfig config = ClientConfig.defaultConfig()
    .baseUrl(new URL("https://api.example.com"))
    .connectionTimeout(Duration.ofSeconds(30))
    .readTimeout(Duration.ofMinutes(5))
    .withRetries()
    .withFilter(new DumpHttpExchangeFilter())
    .proxy(new Proxy(Proxy.Type.HTTP, 
           new InetSocketAddress("proxy.example.com", 8080)))
    .authenticateAs(new UsernamePasswordCredentials("user", "pass"))
    .version("HTTP/1.1");

// Create client with comprehensive configuration
HttpClient client = HttpClient.Factory.createDefault().createClient(config);

// Execute request with all configured settings
HttpRequest request = new HttpRequest(HttpMethod.GET, "/users");
HttpResponse response = client.execute(request);

System.out.println("Response from " + response.getTargetHost() + 
                   ": " + response.getStatus());

Configuration Validation

The ClientConfig class performs validation on configuration values:

import java.time.Duration;

try {
    // Negative timeouts are rejected
    ClientConfig.defaultConfig()
        .connectionTimeout(Duration.ofSeconds(-1)); // Throws exception
} catch (IllegalArgumentException e) {
    System.err.println("Invalid timeout: " + e.getMessage());
}

try {
    // Null values are rejected where appropriate
    ClientConfig.defaultConfig()
        .baseUri(null); // Throws exception
} catch (NullPointerException e) {
    System.err.println("Null URI not allowed");
}

// Valid configurations
ClientConfig validConfig = ClientConfig.defaultConfig()
    .connectionTimeout(Duration.ZERO) // Zero timeout is allowed
    .readTimeout(Duration.ofDays(1));  // Very long timeout is allowed

Built-in Filters

The ClientConfig includes several built-in filters that are automatically applied:

AddSeleniumUserAgent Filter

Automatically applied to all configurations, adds Selenium user agent header:

// Default configuration includes AddSeleniumUserAgent filter
ClientConfig config = ClientConfig.defaultConfig();
// User-Agent header will be automatically added to all requests

// The User-Agent format includes Selenium version and Java platform info
// Example: "selenium/4.33.0 (java mac)"

RetryRequest Filter

Optional filter for automatic retry of failed requests:

// Enable retry filter
ClientConfig configWithRetries = ClientConfig.defaultConfig()
    .withRetries();

// The retry filter automatically retries:
// - Connection failures (ConnectionFailedException)
// - Server errors (5xx status codes)
// - With exponential backoff strategy

Install with Tessl CLI

npx tessl i tessl/maven-org-seleniumhq-selenium--selenium-http

docs

client-config.md

content-handling.md

filtering.md

http-client.md

index.md

request-response.md

routing.md

websocket.md

tile.json