aboutsummaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/bun-types/bun.d.ts33
-rw-r--r--packages/bun-usockets/src/libusockets.h1
-rw-r--r--packages/bun-usockets/src/socket.c22
-rw-r--r--packages/bun-uws/capi/libuwebsockets.h1
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);