blob: b24d740e530898001e0a102a1235fc9c81b5964f [file] [log] [blame]
/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
*/
#pragma once
#include "android/utils/compiler.h"
#include "android/utils/sockets.h"
ANDROID_BEGIN_HEADER
// Common interface function for the transparent proxy engine.
//
// Usage is the following:
//
// - Register the remote proxy server using the appropriate function. For
// example, use proxy_http_setup() (declared in proxy_http.h) to tell the
// engine to use a specific HTTP/HTTPS proxy.
//
// - For each new connection to a remote server, call proxy_manager_add()
// passing the server's address and desired socket type. The function
// tries to connect to the remote address asynchronously through the
// configured proxy server, and may return immediately.
//
// - The callback passed to proxy_managed_add() will be called when the
// connection succeeds or fails. In case of success, a socket file descriptor
// is also passed, and should be used by the client to communicate with the
// remote server through the proxy.
//
// Note that this happens within the thread's current looper's event loop.
//
// - Call proxy_manager_del() to force-fully remove a proxified socket
// connection. Closing the socket will also work.
/* types and definitions used by all proxy connections */
// Connection attempt result.
typedef enum {
PROXY_EVENT_NONE,
PROXY_EVENT_CONNECTED,
PROXY_EVENT_CONNECTION_REFUSED,
PROXY_EVENT_SERVER_ERROR
} ProxyEvent;
// This function is called to report the result of an asynchronous
// connection attempt started by proxy_managed_add() below.
// |opaque| is a unique client-provided pointer, that comes from the
// initial proxy_manager_add() call, and can also be used to call
// proxy_manager_del(). |fd| is the socket descriptor to use from the
// client, in case of success. |event| indicates whether the connection
// succeeded or not. It cannot be PROXY_EVENT_NONE.
typedef void (*ProxyEventFunc)( void* opaque, int fd, ProxyEvent event );
// Set |mode| to non-0 value to enable proxy logs.
extern void proxy_set_verbose(int mode);
// List of proxy option types.
// PROXY_OPTION_AUTH_USERNAME: value is proxy username.
// PROXY_OPTION_AUTH_PASSWORD: value is proxy password.
// PROXY_OPTION_HTTP_NOCACHE: force HTTP No-Cache option.
// PROXY_OPTION_HTTP_KEEPALIVE:
// PROXY_OPTION_HTTP_USER_AGENT:
// PROXY_OPTION_TYPE: if present, forces the type of proxy to use. Valid
// values are "http" and "https". This is used during unit-testing. Otherwise
// the type is auto-detected based on the current configuration and target
// server address' port (80 for "http", anything else for "https").
typedef enum {
PROXY_OPTION_AUTH_USERNAME = 1,
PROXY_OPTION_AUTH_PASSWORD,
PROXY_OPTION_HTTP_NOCACHE = 100,
PROXY_OPTION_HTTP_KEEPALIVE,
PROXY_OPTION_HTTP_USER_AGENT,
PROXY_OPTION_TYPE,
PROXY_OPTION_MAX // Must be last.
} ProxyOptionType;
// Proxy option key/value pair.
typedef struct {
ProxyOptionType type;
const char* string;
int string_len;
} ProxyOption;
// Start a new connection attempt to the target server's |address|.
// |sock_type| determines the type of socket to use. |ev_func| and |ev_opaque|
// specify a callback function and parameter that will be called when the
// connection is established or fails.
//
// Note that the callback can be invoked before this function returns
// (e.g. if the connection immediately succeeds, or if there is a problem
// with the server's address). Otherwise, it will be invoked later during the
// current thread's main loop processing.
//
// Returns 0 on success, or -1 if there is no proxy service for this type of
// connection.
extern int proxy_manager_add( const SockAddress* address,
SocketType sock_type,
ProxyEventFunc ev_func,
void* ev_opaque );
// Remove a pending proxified socket connection from the manager's list.
// this is only necessary when the socket connection must be canceled before
// the connection accept/refusal occured. |ev_opaque| must be the same value
// that was passed to proxy_manager_add().
extern void proxy_manager_del( void* ev_opaque );
// This function checks that one can connect to a given proxy. It will simply
// try to connect() to it, for a specified timeout, in milliseconds, then close
// the connection.
//
// returns 0 in case of success, and -1 in case of error. errno will be set
// to ETIMEOUT in case of timeout, or ECONNREFUSED if the connection is
// refused.
extern int proxy_check_connection( const char* proxyname,
int proxyname_len,
int proxyport,
int timeout_ms );
ANDROID_END_HEADER