2025-07-07 16:36:51 -07:00
# Example Proxy Script
The following is an example of a proxy script that can be used with the `GEMINI_SANDBOX_PROXY_COMMAND` environment variable. This script only allows `HTTPS` connections to `example.com:443` and declines all other requests.
``` javascript
2025-06-10 08:58:37 -07:00
#!/usr/bin/env node
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
2025-06-11 11:31:38 -07:00
// Example proxy server that listens on :::8877 and only allows HTTPS connections to example.com.
2025-06-10 08:58:37 -07:00
// Set `GEMINI_SANDBOX_PROXY_COMMAND=scripts/example-proxy.js` to run proxy alongside sandbox
// Test via `curl https://example.com` inside sandbox (in shell mode or via shell tool)
import http from 'http' ;
import net from 'net' ;
import { URL } from 'url' ;
import console from 'console' ;
const PROXY _PORT = 8877 ;
const ALLOWED _DOMAINS = [ 'example.com' , 'googleapis.com' ] ;
const ALLOWED _PORT = '443' ;
const server = http . createServer ( ( req , res ) => {
// Deny all requests other than CONNECT for HTTPS
console . log (
` [PROXY] Denying non-CONNECT request for: ${ req . method } ${ req . url } ` ,
) ;
res . writeHead ( 405 , { 'Content-Type' : 'text/plain' } ) ;
res . end ( 'Method Not Allowed' ) ;
} ) ;
server . on ( 'connect' , ( req , clientSocket , head ) => {
// req.url will be in the format "hostname:port" for a CONNECT request.
const { port , hostname } = new URL ( ` http:// ${ req . url } ` ) ;
console . log ( ` [PROXY] Intercepted CONNECT request for: ${ hostname } : ${ port } ` ) ;
if (
ALLOWED _DOMAINS . some (
( domain ) => hostname == domain || hostname . endsWith ( ` . ${ domain } ` ) ,
) &&
port === ALLOWED _PORT
) {
console . log ( ` [PROXY] Allowing connection to ${ hostname } : ${ port } ` ) ;
// Establish a TCP connection to the original destination.
const serverSocket = net . connect ( port , hostname , ( ) => {
clientSocket . write ( 'HTTP/1.1 200 Connection Established\r\n\r\n' ) ;
// Create a tunnel by piping data between the client and the destination server.
serverSocket . write ( head ) ;
serverSocket . pipe ( clientSocket ) ;
clientSocket . pipe ( serverSocket ) ;
} ) ;
serverSocket . on ( 'error' , ( err ) => {
console . error ( ` [PROXY] Error connecting to destination: ${ err . message } ` ) ;
clientSocket . end ( ` HTTP/1.1 502 Bad Gateway \r \n \r \n ` ) ;
} ) ;
} else {
console . log ( ` [PROXY] Denying connection to ${ hostname } : ${ port } ` ) ;
clientSocket . end ( 'HTTP/1.1 403 Forbidden\r\n\r\n' ) ;
}
clientSocket . on ( 'error' , ( err ) => {
// This can happen if the client hangs up.
console . error ( ` [PROXY] Client socket error: ${ err . message } ` ) ;
} ) ;
} ) ;
2025-06-11 11:31:38 -07:00
server . listen ( PROXY _PORT , ( ) => {
const address = server . address ( ) ;
console . log ( ` [PROXY] Proxy listening on ${ address . address } : ${ address . port } ` ) ;
2025-06-10 08:58:37 -07:00
console . log (
` [PROXY] Allowing HTTPS connections to domains: ${ ALLOWED _DOMAINS . join ( ', ' ) } ` ,
) ;
} ) ;
2025-07-07 16:36:51 -07:00
```