| #!/bin/bash |
| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # $1 = hostname, $2 = port |
| # |
| # Use socat to connect to the specified host and port via one of the proxies |
| # defined in the environment, if the target host does not appear in the |
| # no_proxy environment variable. |
| |
| DEST_HOST="$1" |
| DEST_PORT="$2" |
| |
| # Determine whether the destination host is in the "no_proxy" list. |
| use_proxy="true" |
| GLOBIGNORE="*" |
| for a_host in ${no_proxy//,/ } ; do |
| case "${a_host}" in |
| "*") # A "*" matches all hosts. |
| use_proxy="false" |
| break |
| ;; |
| .*) # Items of the form ".some.fqdn" imply match-at-end. |
| if [[ "${DEST_HOST}" == *"${a_host}" ]]; then |
| use_proxy="false" |
| break |
| fi |
| ;; |
| ${DEST_HOST}) # Items of the form "some.fqdn" imply exact-match. |
| use_proxy="false" |
| break |
| ;; |
| esac |
| done |
| |
| if [[ -n "${all_proxy}" ]]; then |
| PROXY="${all_proxy}" |
| TYPE=SOCKS4 |
| PORT_ATTR=socksport |
| elif [[ -n "${https_proxy}" ]]; then |
| PROXY="${https_proxy}" |
| TYPE=PROXY |
| PORT_ATTR=proxyport |
| elif [[ -n "${http_proxy}" ]]; then |
| PROXY="${http_proxy}" |
| TYPE=PROXY |
| PORT_ATTR=proxyport |
| else |
| use_proxy="false" |
| fi |
| |
| if [[ "${use_proxy}" == "true" ]]; then |
| PROXY="${PROXY#*://}" |
| PROXY="${PROXY%%/*}" |
| PROXY_HOST="${PROXY%%:*}" |
| PROXY_PORT="${PROXY##*:}" |
| PARMS="${PROXY_HOST}:${DEST_HOST}:${DEST_PORT},${PORT_ATTR}=${PROXY_PORT}" |
| socat_args=( "${TYPE}:${PARMS}" ) |
| else |
| socat_args=( TCP:"${DEST_HOST}":"${DEST_PORT}" ) |
| fi |
| exec socat STDIO "${socat_args[@]}" |