diff options
Diffstat (limited to 'packages')
-rw-r--r-- | packages/bun-types/bun.d.ts | 33 | ||||
-rw-r--r-- | packages/bun-usockets/src/libusockets.h | 1 | ||||
-rw-r--r-- | packages/bun-usockets/src/socket.c | 22 | ||||
-rw-r--r-- | packages/bun-uws/capi/libuwebsockets.h | 1 |
4 files changed, 57 insertions, 0 deletions
diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts index bd8b75023..a2ccebd8a 100644 --- a/packages/bun-types/bun.d.ts +++ b/packages/bun-types/bun.d.ts @@ -2196,6 +2196,21 @@ declare module "bun" { tls?: TLSOptions; } + export interface SocketAddress { + /** + * The IP address of the client. + */ + address: string; + /** + * The port of the client. + */ + port: number; + /** + * The IP family ("IPv4" or "IPv6"). + */ + family: "IPv4" | "IPv6"; + } + /** * HTTP & HTTPS Server * @@ -2344,6 +2359,24 @@ declare module "bun" { ): ServerWebSocketSendStatus; /** + * Returns the client IP address of the given Request. + * + * @param request The incoming request + * + * @returns An ipv4/ipv6 address string, or null if it couldn't find one. + * + * @example + * ```js + * export default { + * async fetch(request, server) { + * return new Response(server.requestIP(request)); + * } + * } + * ``` + */ + requestIP(request: Request): SocketAddress | null; + + /** * How many requests are in-flight right now? */ readonly pendingRequests: number; diff --git a/packages/bun-usockets/src/libusockets.h b/packages/bun-usockets/src/libusockets.h index e0a427ce5..c0e3fad90 100644 --- a/packages/bun-usockets/src/libusockets.h +++ b/packages/bun-usockets/src/libusockets.h @@ -391,6 +391,7 @@ struct us_socket_t *us_socket_wrap_with_tls(int ssl, struct us_socket_t *s, stru int us_socket_raw_write(int ssl, struct us_socket_t *s, const char *data, int length, int msg_more); struct us_socket_t* us_socket_open(int ssl, struct us_socket_t * s, int is_client, char* ip, int ip_length); int us_raw_root_certs(struct us_cert_string_t**out); +unsigned int us_get_remote_address_info(char *buf, struct us_socket_t *s, const char **dest, int *port, int *is_ipv6); #ifdef __cplusplus } diff --git a/packages/bun-usockets/src/socket.c b/packages/bun-usockets/src/socket.c index ce5203ccb..78185e681 100644 --- a/packages/bun-usockets/src/socket.c +++ b/packages/bun-usockets/src/socket.c @@ -280,3 +280,25 @@ int us_socket_raw_write(int ssl, struct us_socket_t *s, const char *data, int le // non-TLS is always raw return us_socket_write(ssl, s, data, length, msg_more); } + +unsigned int us_get_remote_address_info(char *buf, struct us_socket_t *s, const char **dest, int *port, int *is_ipv6) +{ + // This function is manual inlining + modification of + // us_socket_remote_address + // AsyncSocket::getRemoteAddress + // To get { ip, port, is_ipv6 } for Bun.serve().requestIP() + struct bsd_addr_t addr; + if (bsd_remote_addr(us_poll_fd(&s->p), &addr)) { + return 0; + } + + int length = bsd_addr_get_ip_length(&addr); + if (!length) { + return 0; + } + + memcpy(buf, bsd_addr_get_ip(&addr), length); + *port = bsd_addr_get_port(&addr); + + return length; +}
\ No newline at end of file diff --git a/packages/bun-uws/capi/libuwebsockets.h b/packages/bun-uws/capi/libuwebsockets.h index 25c330af7..3008d1992 100644 --- a/packages/bun-uws/capi/libuwebsockets.h +++ b/packages/bun-uws/capi/libuwebsockets.h @@ -205,6 +205,7 @@ extern "C" DLL_EXPORT unsigned int uws_ws_get_buffered_amount(int ssl, uws_websocket_t *ws); DLL_EXPORT size_t uws_ws_get_remote_address(int ssl, uws_websocket_t *ws, const char **dest); DLL_EXPORT size_t uws_ws_get_remote_address_as_text(int ssl, uws_websocket_t *ws, const char **dest); + DLL_EXPORT void uws_res_get_remote_address_info(uws_res_t *res, const char **dest, size_t *length, unsigned int *port); //Response DLL_EXPORT void uws_res_end(int ssl, uws_res_t *res, const char *data, size_t length, bool close_connection); |