From 4e05fd054147d03c547fe47e588cd906e3f8270a Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Thu, 7 Apr 2022 06:22:42 -0700 Subject: [PATCH] [bun.js] Add `baseURI` support to HTTP server --- examples/tsconfig.json | 2 +- packages/bun-error/bun.lockb | Bin 12182 -> 9259 bytes packages/bun-error/package.json | 4 +- packages/bun-framework-next/package.json | 12 +- src/javascript/jsc/api/server.zig | 103 +++++++++++++++++- .../jsc/bindings/ZigGlobalObject.cpp | 2 +- src/javascript/jsc/bindings/bindings.zig | 4 + src/javascript/jsc/webcore/response.zig | 6 +- 8 files changed, 118 insertions(+), 15 deletions(-) diff --git a/examples/tsconfig.json b/examples/tsconfig.json index 4e99331eef..404c353e6a 100644 --- a/examples/tsconfig.json +++ b/examples/tsconfig.json @@ -3,6 +3,6 @@ "lib": ["ESNext"], "module": "esnext", "target": "esnext", - "typeRoots": ["~/.bun/types"] + "typeRoots": ["../types"] } } diff --git a/packages/bun-error/bun.lockb b/packages/bun-error/bun.lockb index 1c7c459d1fb273e79f7e8ce675c3786272825100..7a58b882e51fbec9f83ea010d22c2ceccaaa99a2 100755 GIT binary patch literal 9259 zcmeHNcUV)|wm*rX1rShCM5S5)1roYSQv`9aQFJJxQoL`kU6|ex_y+SsLcjnF;-+O=D?>*N?Sm*4u_iwMY&#vcpbhV8m zcwA$DW|%P}EKAJ4on%bs#k zT0PjX%*lSITZh?QrJ#_uq(}`uxBarF-|JIosPB9**7qYr3+ojYE{oyVHu@yh#gH*!ipo72;`R*`rd0vUOi5 zR@?WUYFR*KQ+c{J^K|5GEe@ny-?YFotMy3xN>UU#`DWmf?xdKe{$Z&n?$1z_ePA_W z?oIB-;qSJu;W4LpB)=zq8+Oi_=^Pxicx;4pq4bP#CdDNa6Wn+e|>?=K`!*%h;J=NL1n-%N#D@zzZF~`+kI%ZVSmP+%9-N zn<8oai)&nNm?#hRFY-#7a5+dr>-0CT4@#&E>~_9o-iEyR2RkNMld!*_VeODdKM>Gh zM|&gT`lXFD$bYhiXE0IdX#gJZ|FV#XL0m~_%88`a&r4hs=S({0 z;AgVh`{?yZmQ!U(4{^#)-@4a%>+4Gt6IF|A7rKjUyi4?5y9751lE&GeoRH~q;AGsP zoe65lM~o}EZ=y6l%~vN34*EGAs-M5B`r{2&^7 z1HkYNf^ng5VWDJAJ#HQR#p^>z#*0(3RkhrR@%5GldgRFz>#nqvhTm7bovrJ;Bc*cn zh=-NS%r%CYxD0Q3>Fc4LV)oi4+|hvAjDRq%6b40_;&|6%&5xAki>3y;2D9bKnc|*>b0*JSdpz-hG-rBa?J$d(U>=8S~DzwoX2BoPA4Q0#{lR zcU|(>NmE1mQ$<)x6eYNR9 zcB_0X)S%G0(=Xb=2~`a{E8*KBIJ}dd{^KVhMST)v-GUE0yNV1#A&s$GXK-fm1?UA4jJZfzUU zc$HG5kf#Eq@%#$d6lG85 z3hiIHv6+6IB}BOIn_A90xv5cgwmn;NuO-O8OV}OEQA^QF+B%w*r#Ugph3t?!gY`>b z*Xs>hiWx4eGq?x?{Iy3K&(r9VphW*x7yR3tMXqrtM`~{|YAvXGxUc>V&tBeX#*=Q{ zix!9YH(4RE%8p6}-gf+GBhx9*EpE(ozDed^A9bkDV!tqSz|}%n=nOn0luA~Gl4@O^ zT2g(owOUEGbp6jK9;tF@@@c=gAAA^aA@Rz>m(I7e;_|oh7utrE$x%zC=gEW?8~W|p zQ9(%alM4|N-~u3wJuH;)p2V?HuBR6r)woh)r_Hy1VkPCV$!7ASX}xE2avXTa*DI-A z$yzk|$EB;vm+L78==Vp?-?ly?El6cvZ)cK?aRmZGxMWy2;VgiK!lJdV?2_M5X?x?d zt=GB0<=JaURHbl=d({f5n)EVnwHD1^8!rbMWVm12xXSCrs=ULgg$4~C2fETXu#(v8 z^|KKW!WFK^u)boU1XRRj-u89K{&;+cOq8L+kBvI9+h`^Re7=6hJWGv2BGpg7o2uBW z|FGiSio`FG{i94x&6&P|?g?|&)g?K2IU^tv>J8v8{IF0y{p|DlmScR)x=F9WZSg_=n(D#A2P#^7)(7oRS+U76_w3Tl@vpqAl18ila^V&$e@iR^ z!v5lY3t&@r#!mgbz_rxrB-z}=f@T%=h$fS_{7TCk8$xg9gxRSyW%-!+BiXe|!(-Co zlV9?xYA@=vZa7+YpYfLbI!b%|Wg#v_=qq~nFeDV6B{}L1{aY#rEXw!AExyE?c7C|q z*|Arzme?y!m67eq;Jj@r`Mh`io%Yf(wTbrv8T*8OtA?u~0qz4GA8UHe z3*SbBUZ}f0E_>OuXD+u&sl^LE?tNLFzt#BazPZ)!4HWXD5=ON1vx>qI5R7BMh4)5S zC~x`dDu+gQoc}WQJ)_XX`;)7AEd9#S%U#w9k9c`euFviS4_rPOtz4yY`^8dMH^;-V zd8bYH`*!}Y_grTvt?k_`1Vlo+5f~WgUC@wFxarFpG^35(j?&&W$Ot}-TN_|>=!bNh zwt``5PkPU`PpV(;?6GpkoRc$4%{-dkr!zfk=(5!4-D;Op*6A3vlcymhXa~R@GlYuz z!|qw^0j=WK7EZAc%f_+z7jU~9&cPdoBW-#lTe(1~TXYP#gZ^PIY5v%+$37*~v@ z&S!az+HvoF=a=i%Q8NG!{Drj*)@Ce}%IrMnG}2{_;^G%WJ z(n|+sCY?R0df&H#wn5Lea?9G9=C=6XtoWN_R5%l_&zs`7#`z@z0)GKl@@3ohMGGp;`OoH!=%(L1SZ&ast&z)3m$9x+}+Uh%yp;tVgvHR82);J+9dTa=HoFuMq-?I3eee~p! zeJ9(G?B~&vnKq4;hhCKV}Eg3U}{q&RY#lU&8|2-$Lo2SYu7ZHwqv)p74Go~ zH8%N&73?+eIuBz63&nNm(Tvx0#g=md>0J7evSHKXt|@FcA5ZR^DHG&hVDavmqXzSp zz1&l!Ib{DH^MK8}p024_BHJoZ>Ie$4yb|w*fH3X^42m?Rsmm%bG=)<){5|JI->!K1 zg>Tw3>|)HK@-D8f)7#SA;M8q?)X|4rkZazmPygL&^iH~xLrm{Ctte(?AM@#$Q0S=`qiox(rs&++ z@0HjS+gAF-Z9{eJp5qHP54P{%eo_;IB278G$M+@^jJ3-l)7hzxn`LEJo&cW}D16WL>V4kqp-%5kB_`R|hx<+fc07`#P z`@h=;G|>dtA(}X-)*f62!&b|Lrp05%GT1@Ww9K^pSj?Zo*g<&D_(depH()&Ad(e;u z@;&W)8~nR|0CT?NdII@i&XPQvK^pWe$#Wp2X`vrl=DrebbO&p-r0AdsNOigT2|NfJn4(D(<+rl0L4kFO^;cNrv5SXE1e-C?c*n`0y7xtsDcZ7W&?8#vN z1bZFWm%tE%^&W;8#164SY~TjO3^77X5CiypPUPQW(c<`5e*PH-_>N--OdJco20y?b z@C*C{Kfzz{8~lejARdSd;)6ILUWgmwhjxJWfOdiQfmk3Wa91GmSq~lx5~{V2iG^>3 z6`D~jhT54fo>2e;VG1x$CQBM5woIqvRR=SDWHQT-&*1S10&}343nYummRBwR2XmZcl08a6Eid@*cpZq!qNgXo3?!LEGoqUrnVJ!po5dWZ*piIOprv)P!{6FG>0enM09uI9!cmb;zfe|bQSLiQID?VNejbfS+ zEtqG>XNNGtc)~9{20xk*%`Ap~VS!vWGtkh&>|ay-xS`_2KtFC2GfX0vDB-J2L1@?H z&y&Q$DPLt{F~cIF4NXmOg@gCvx(4r2k*_oS2}UTB!?Q4BF}}{o;RO6Kk;~)-ME+|X zJk#m4Xk0jq!T;KMHir@RbqX&cjLnm11k@yf>?oc@EI3766HXDjFM6OHE}LU0e72&5 Np+`5^0seFU{}b@TfS~{Y literal 12182 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 0) { + defer sliced.deinit(); + args.base_uri = bun.default_allocator.dupe(u8, sliced.slice()) catch unreachable; + } + } + if (arg.getTruthy(global, "hostname") orelse arg.getTruthy(global, "host")) |host| { const host_str = host.toSlice( global, @@ -278,6 +296,7 @@ pub const ServerConfig = struct { ); if (host_str.len > 0) { args.hostname = bun.default_allocator.dupeZ(u8, host_str.slice()) catch unreachable; + has_hostname = true; } } @@ -329,6 +348,80 @@ pub const ServerConfig = struct { JSC.throwInvalidArguments("Invalid port: must be > 0", .{}, global.ref(), exception); } + if (args.base_uri.len > 0) { + args.base_url = URL.parse(args.base_uri); + if (args.base_url.hostname.len == 0) { + JSC.throwInvalidArguments("baseURI must have a hostname", .{}, global.ref(), exception); + bun.default_allocator.free(bun.constStrToU8(args.base_uri)); + args.base_uri = ""; + return args; + } + + if (!strings.isAllASCII(args.base_uri)) { + JSC.throwInvalidArguments("Unicode baseURI must already be encoded for now.\nnew URL(baseuRI).toString() should do the trick.", .{}, global.ref(), exception); + bun.default_allocator.free(bun.constStrToU8(args.base_uri)); + args.base_uri = ""; + return args; + } + + if (args.base_url.protocol.len == 0) { + const protocol: string = if (args.ssl_config != null) "https" else "http"; + + args.base_uri = (if ((args.port == 80 and args.ssl_config == null) or (args.port == 443 and args.ssl_config != null)) + std.fmt.allocPrint(bun.default_allocator, "{s}://{s}/{s}", .{ + protocol, + args.base_url.hostname, + strings.trimLeadingChar(args.base_url.pathname, '/'), + }) + else + std.fmt.allocPrint(bun.default_allocator, "{s}://{s}:{d}/{s}", .{ + protocol, + args.base_url.hostname, + args.port, + strings.trimLeadingChar(args.base_url.pathname, '/'), + })) catch unreachable; + + args.base_url = URL.parse(args.base_uri); + } + } else { + const hostname: string = + if (has_hostname and std.mem.span(args.hostname).len > 0) std.mem.span(args.hostname) else "localhost"; + const protocol: string = if (args.ssl_config != null) "https" else "http"; + + args.base_uri = (if ((args.port == 80 and args.ssl_config == null) or (args.port == 443 and args.ssl_config != null)) + std.fmt.allocPrint(bun.default_allocator, "{s}://{s}/", .{ + protocol, + hostname, + }) + else + std.fmt.allocPrint(bun.default_allocator, "{s}://{s}:{d}/", .{ protocol, hostname, args.port })) catch unreachable; + + if (!strings.isAllASCII(hostname)) { + JSC.throwInvalidArguments("Unicode hostnames must already be encoded for now.\nnew URL(input).hostname should do the trick.", .{}, global.ref(), exception); + bun.default_allocator.free(bun.constStrToU8(args.base_uri)); + args.base_uri = ""; + return args; + } + + args.base_url = URL.parse(args.base_uri); + } + + // I don't think there's a case where this can happen + // but let's check anyway, just in case + if (args.base_url.hostname.len == 0) { + JSC.throwInvalidArguments("baseURI must have a hostname", .{}, global.ref(), exception); + bun.default_allocator.free(bun.constStrToU8(args.base_uri)); + args.base_uri = ""; + return args; + } + + if (args.base_url.username.len > 0 or args.base_url.password.len > 0) { + JSC.throwInvalidArguments("baseURI can't have a username or password", .{}, global.ref(), exception); + bun.default_allocator.free(bun.constStrToU8(args.base_uri)); + args.base_uri = ""; + return args; + } + return args; } }; @@ -499,7 +592,9 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp this.* = .{ .resp = resp, .req = req, - .url = req.url(), + // this memory is owned by the Request object + .url = strings.append(bun.default_allocator, server.base_url_string_for_joining, req.url()) catch + @panic("Out of memory while joining the URL path?"), .method = HTTP.Method.which(req.method()) orelse .GET, .server = server, }; @@ -1030,7 +1125,7 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { app: *App = undefined, globalThis: *JSGlobalObject, - + base_url_string_for_joining: string = "", response_objects_pool: JSC.WebCore.Response.Pool = JSC.WebCore.Response.Pool{}, config: ServerConfig = ServerConfig{}, request_pool_allocator: std.mem.Allocator = undefined, @@ -1040,6 +1135,7 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { server.* = .{ .globalThis = globalThis, .config = config, + .base_url_string_for_joining = strings.trim(config.base_url.href, "/"), }; RequestContext.pool = bun.default_allocator.create(RequestContext.RequestContextStackAllocator) catch @panic("Out of memory!"); server.request_pool_allocator = RequestContext.pool.get(); @@ -1190,6 +1286,7 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { }, }, }; + request_object.url.mark(); // We keep the Request object alive for the duration of the request so that we can remove the pointer to the UWS request object. var args = [_]JSC.C.JSValueRef{JSC.WebCore.Request.Class.make(this.globalThis.ref(), request_object)}; ctx.request_js_object = args[0]; diff --git a/src/javascript/jsc/bindings/ZigGlobalObject.cpp b/src/javascript/jsc/bindings/ZigGlobalObject.cpp index 8d005a9816..d3c7d2785c 100644 --- a/src/javascript/jsc/bindings/ZigGlobalObject.cpp +++ b/src/javascript/jsc/bindings/ZigGlobalObject.cpp @@ -1085,7 +1085,7 @@ JSC::JSObject* GlobalObject::moduleLoaderCreateImportMetaProperties(JSGlobalObje metaProperties->putDirect(vm, clientData->builtinNames().resolvePublicName(), JSC::JSFunction::create(vm, JSC::jsCast(globalObject), 0, - WTF::String("resolve"), functionImportMeta__resolve), + WTF::String("resolve"_s), functionImportMeta__resolve), 0); } diff --git a/src/javascript/jsc/bindings/bindings.zig b/src/javascript/jsc/bindings/bindings.zig index 7797ae4c5d..2d384a924e 100644 --- a/src/javascript/jsc/bindings/bindings.zig +++ b/src/javascript/jsc/bindings/bindings.zig @@ -2780,6 +2780,10 @@ pub const JSValue = enum(u64) { return @intToPtr(C_API.JSValueRef, @intCast(usize, @enumToInt(this))); } + pub inline fn c(this: C_API.JSValueRef) JSValue { + return @intToEnum(JSValue, @ptrToInt(this)); + } + pub inline fn fromRef(this: C_API.JSValueRef) JSValue { return @intToEnum(JSValue, @ptrToInt(this)); } diff --git a/src/javascript/jsc/webcore/response.zig b/src/javascript/jsc/webcore/response.zig index f1fa6223bb..16122721f7 100644 --- a/src/javascript/jsc/webcore/response.zig +++ b/src/javascript/jsc/webcore/response.zig @@ -231,7 +231,7 @@ pub const Response = struct { _: js.ExceptionRef, ) js.JSValueRef { // https://developer.mozilla.org/en-US/docs/Web/API/Response/url - return ZigString.init(this.url).withEncoding().toValueGC(ctx.ptr()).asObjectRef(); + return ZigString.init(this.url).toValueGC(ctx.ptr()).asObjectRef(); } pub fn getResponseType( @@ -4352,6 +4352,10 @@ pub const Request = struct { this.headers = null; } + if (this.url.isGloballyAllocated()) { + bun.default_allocator.free(bun.constStrToU8(this.url.slice())); + } + bun.default_allocator.destroy(this); }