pub const ext = @import("ext.zig");
const libproxy = @This();

const std = @import("std");
const compat = @import("compat");
const gio = @import("gio2");
const gobject = @import("gobject2");
const glib = @import("glib2");
const gmodule = @import("gmodule2");
pub const ProxyFactory = opaque {
    /// Frees the proxy array returned by `px_proxy_factory_get_proxies` when no
    /// longer used.
    ///
    /// `since` 0.4.16
    extern fn px_proxy_factory_free_proxies(p_proxies: [*][*:0]u8) void;
    pub const freeProxies = px_proxy_factory_free_proxies;

    /// Creates a new `pxProxyFactory` instance.
    ///
    /// This instance should be kept around as long as possible as it contains
    /// cached data to increase performance.  Memory usage should be minimal
    /// (cache is small) and the cache lifespan is handled automatically.
    extern fn px_proxy_factory_new() *libproxy.ProxyFactory;
    pub const new = px_proxy_factory_new;

    /// Frees the `pxProxyFactory`.
    extern fn px_proxy_factory_free(p_self: *ProxyFactory) void;
    pub const free = px_proxy_factory_free;

    /// Get which proxies to use for the specified `URL`.
    ///
    /// A `NULL`-terminated array of proxy strings is returned.
    /// If the first proxy fails, the second should be tried, etc...
    /// Don't forget to free the strings/array when you are done.
    /// If an unrecoverable error occurs, this function returns `NULL`.
    ///
    /// Regarding performance: this method always blocks and may be called
    /// in a separate thread (is thread-safe).  In most cases, the time
    /// required to complete this function call is simply the time required
    /// to read the configuration (i.e. from gconf, kconfig, etc).
    ///
    /// In the case of PAC, if no valid PAC is found in the cache (i.e.
    /// configuration has changed, cache is invalid, etc), the PAC file is
    /// downloaded and inserted into the cache. This is the most expensive
    /// operation as the PAC is retrieved over the network. Once a PAC exists
    /// in the cache, it is merely a javascript invocation to evaluate the PAC.
    /// One should note that DNS can be called from within a PAC during
    /// javascript invocation.
    ///
    /// In the case of WPAD, WPAD is used to automatically locate a PAC on the
    /// network.  Currently, we only use DNS for this, but other methods may
    /// be implemented in the future.  Once the PAC is located, normal PAC
    /// performance (described above) applies.
    ///
    /// The format of the returned proxy strings are as follows:
    ///
    ///   - http://[username:password@]proxy:port
    ///
    ///   - socks://[username:password@]proxy:port
    ///
    ///   - socks5://[username:password@]proxy:port
    ///
    ///   - socks4://[username:password@]proxy:port
    ///
    ///   - <procotol>://[username:password@]proxy:port
    ///
    ///   - direct://
    ///
    /// Please note that the username and password in the above URLs are optional
    /// and should be use to authenticate the connection if present.
    ///
    /// For SOCKS proxies, when the protocol version is specified (socks4:// or
    /// socks5://), it is expected that only this version is used. When only
    /// socks:// is set, the client MUST try SOCKS version 5 protocol and, on
    /// connection failure, fallback to SOCKS version 4.
    ///
    /// Other proxying protocols may exist. It is expected that the returned
    /// configuration scheme shall match the network service name of the
    /// proxy protocol or the service name of the protocol being proxied if the
    /// previous does not exist. As an example, on Mac OS X you can configure a
    /// RTSP streaming proxy. The expected returned configuration would be:
    ///
    ///   - rtsp://[username:password@]proxy:port
    ///
    /// To free the returned value, call `px_proxy_factory_free_proxies`.
    extern fn px_proxy_factory_get_proxies(p_self: *ProxyFactory, p_url: [*:0]const u8) [*][*:0]u8;
    pub const getProxies = px_proxy_factory_get_proxies;

    extern fn px_proxy_factory_get_type() usize;
    pub const getGObjectType = px_proxy_factory_get_type;

    test {
        @setEvalBranchQuota(100_000);
        std.testing.refAllDecls(@This());
    }
};

test {
    @setEvalBranchQuota(100_000);
    std.testing.refAllDecls(@This());
    std.testing.refAllDecls(ext);
}
