mirror of
https://github.com/zigzap/zap.git
synced 2025-10-20 15:14:08 +00:00
doc update
This commit is contained in:
parent
d51a0b8ca3
commit
0d712282e2
15 changed files with 1374 additions and 1175 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
var modules =[{"name":"zap","file":0,"main":66,"table":{"zap":0}},{"name":"builtin","file":0,"main":454,"table":{}}];
|
||||
var modules =[{"name":"zap","file":0,"main":66,"table":{"zap":0}},{"name":"builtin","file":0,"main":463,"table":{}}];
|
File diff suppressed because one or more lines are too long
|
@ -255,7 +255,7 @@
|
|||
/* docs section */
|
||||
.docs {
|
||||
flex-grow: 2;
|
||||
padding: 0rem 0.7rem 2.4rem 1.4rem;
|
||||
padding: 0rem 0.7rem 0rem 1.4rem;
|
||||
font-size: 1rem;
|
||||
background-color: var(--bg-color);
|
||||
overflow-wrap: break-word;
|
||||
|
@ -746,7 +746,6 @@
|
|||
}
|
||||
.flex-main {
|
||||
flex-direction: column;
|
||||
display: block;
|
||||
}
|
||||
.sidebar {
|
||||
min-width: calc(100vw - 2.8rem);
|
||||
|
|
|
@ -116,126 +116,62 @@
|
|||
<span class="line" id="L2"><span class="tok-comment">/// Zig version. When writing code that supports multiple versions of Zig, prefer</span></span>
|
||||
<span class="line" id="L3"><span class="tok-comment">/// feature detection (i.e. with `@hasDecl` or `@hasField`) over version checks.</span></span>
|
||||
<span class="line" id="L4"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> zig_version = std.SemanticVersion.parse(zig_version_string) <span class="tok-kw">catch</span> <span class="tok-kw">unreachable</span>;</span>
|
||||
<span class="line" id="L5"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> zig_version_string = <span class="tok-str">"0.12.0-dev.2105+60094cc3f"</span>;</span>
|
||||
<span class="line" id="L5"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> zig_version_string = <span class="tok-str">"0.12.0-dev.2833+8802ec583"</span>;</span>
|
||||
<span class="line" id="L6"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> zig_backend = std.builtin.CompilerBackend.stage2_llvm;</span>
|
||||
<span class="line" id="L7"></span>
|
||||
<span class="line" id="L8"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> output_mode = std.builtin.OutputMode.Obj;</span>
|
||||
<span class="line" id="L9"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> link_mode = std.builtin.LinkMode.Static;</span>
|
||||
<span class="line" id="L10"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> is_test = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L11"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> single_threaded = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L12"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> abi = std.Target.Abi.gnu;</span>
|
||||
<span class="line" id="L12"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> abi = std.Target.Abi.none;</span>
|
||||
<span class="line" id="L13"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> cpu: std.Target.Cpu = .{</span>
|
||||
<span class="line" id="L14"> .arch = .x86_64,</span>
|
||||
<span class="line" id="L15"> .model = &std.Target.x86.cpu.znver3,</span>
|
||||
<span class="line" id="L16"> .features = std.Target.x86.featureSet(&[_]std.Target.x86.Feature{</span>
|
||||
<span class="line" id="L17"> .@"64bit",</span>
|
||||
<span class="line" id="L18"> .adx,</span>
|
||||
<span class="line" id="L19"> .aes,</span>
|
||||
<span class="line" id="L20"> .allow_light_256_bit,</span>
|
||||
<span class="line" id="L21"> .avx,</span>
|
||||
<span class="line" id="L22"> .avx2,</span>
|
||||
<span class="line" id="L23"> .bmi,</span>
|
||||
<span class="line" id="L24"> .bmi2,</span>
|
||||
<span class="line" id="L25"> .branchfusion,</span>
|
||||
<span class="line" id="L26"> .clflushopt,</span>
|
||||
<span class="line" id="L27"> .clwb,</span>
|
||||
<span class="line" id="L28"> .clzero,</span>
|
||||
<span class="line" id="L29"> .cmov,</span>
|
||||
<span class="line" id="L30"> .crc32,</span>
|
||||
<span class="line" id="L31"> .cx16,</span>
|
||||
<span class="line" id="L32"> .cx8,</span>
|
||||
<span class="line" id="L33"> .f16c,</span>
|
||||
<span class="line" id="L34"> .fast_15bytenop,</span>
|
||||
<span class="line" id="L35"> .fast_bextr,</span>
|
||||
<span class="line" id="L36"> .fast_lzcnt,</span>
|
||||
<span class="line" id="L37"> .fast_movbe,</span>
|
||||
<span class="line" id="L38"> .fast_scalar_fsqrt,</span>
|
||||
<span class="line" id="L39"> .fast_scalar_shift_masks,</span>
|
||||
<span class="line" id="L40"> .fast_variable_perlane_shuffle,</span>
|
||||
<span class="line" id="L41"> .fast_vector_fsqrt,</span>
|
||||
<span class="line" id="L42"> .fma,</span>
|
||||
<span class="line" id="L43"> .fsgsbase,</span>
|
||||
<span class="line" id="L44"> .fsrm,</span>
|
||||
<span class="line" id="L45"> .fxsr,</span>
|
||||
<span class="line" id="L46"> .invpcid,</span>
|
||||
<span class="line" id="L47"> .lzcnt,</span>
|
||||
<span class="line" id="L48"> .macrofusion,</span>
|
||||
<span class="line" id="L49"> .mmx,</span>
|
||||
<span class="line" id="L50"> .movbe,</span>
|
||||
<span class="line" id="L51"> .mwaitx,</span>
|
||||
<span class="line" id="L52"> .nopl,</span>
|
||||
<span class="line" id="L53"> .pclmul,</span>
|
||||
<span class="line" id="L54"> .pku,</span>
|
||||
<span class="line" id="L55"> .popcnt,</span>
|
||||
<span class="line" id="L56"> .prfchw,</span>
|
||||
<span class="line" id="L57"> .rdpid,</span>
|
||||
<span class="line" id="L58"> .rdpru,</span>
|
||||
<span class="line" id="L59"> .rdrnd,</span>
|
||||
<span class="line" id="L60"> .rdseed,</span>
|
||||
<span class="line" id="L61"> .sahf,</span>
|
||||
<span class="line" id="L62"> .sbb_dep_breaking,</span>
|
||||
<span class="line" id="L63"> .sha,</span>
|
||||
<span class="line" id="L64"> .shstk,</span>
|
||||
<span class="line" id="L65"> .slow_shld,</span>
|
||||
<span class="line" id="L66"> .sse,</span>
|
||||
<span class="line" id="L67"> .sse2,</span>
|
||||
<span class="line" id="L68"> .sse3,</span>
|
||||
<span class="line" id="L69"> .sse4_1,</span>
|
||||
<span class="line" id="L70"> .sse4_2,</span>
|
||||
<span class="line" id="L71"> .sse4a,</span>
|
||||
<span class="line" id="L72"> .ssse3,</span>
|
||||
<span class="line" id="L73"> .vaes,</span>
|
||||
<span class="line" id="L74"> .vpclmulqdq,</span>
|
||||
<span class="line" id="L75"> .vzeroupper,</span>
|
||||
<span class="line" id="L76"> .wbnoinvd,</span>
|
||||
<span class="line" id="L77"> .x87,</span>
|
||||
<span class="line" id="L78"> .xsave,</span>
|
||||
<span class="line" id="L79"> .xsavec,</span>
|
||||
<span class="line" id="L80"> .xsaveopt,</span>
|
||||
<span class="line" id="L81"> .xsaves,</span>
|
||||
<span class="line" id="L82"> }),</span>
|
||||
<span class="line" id="L83">};</span>
|
||||
<span class="line" id="L84"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> os = std.Target.Os{</span>
|
||||
<span class="line" id="L85"> .tag = .linux,</span>
|
||||
<span class="line" id="L86"> .version_range = .{ .linux = .{</span>
|
||||
<span class="line" id="L87"> .range = .{</span>
|
||||
<span class="line" id="L88"> .min = .{</span>
|
||||
<span class="line" id="L89"> .major = <span class="tok-number">6</span>,</span>
|
||||
<span class="line" id="L90"> .minor = <span class="tok-number">6</span>,</span>
|
||||
<span class="line" id="L91"> .patch = <span class="tok-number">8</span>,</span>
|
||||
<span class="line" id="L92"> },</span>
|
||||
<span class="line" id="L93"> .max = .{</span>
|
||||
<span class="line" id="L94"> .major = <span class="tok-number">6</span>,</span>
|
||||
<span class="line" id="L95"> .minor = <span class="tok-number">6</span>,</span>
|
||||
<span class="line" id="L96"> .patch = <span class="tok-number">8</span>,</span>
|
||||
<span class="line" id="L97"> },</span>
|
||||
<span class="line" id="L98"> },</span>
|
||||
<span class="line" id="L99"> .glibc = .{</span>
|
||||
<span class="line" id="L100"> .major = <span class="tok-number">2</span>,</span>
|
||||
<span class="line" id="L101"> .minor = <span class="tok-number">36</span>,</span>
|
||||
<span class="line" id="L102"> .patch = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L103"> },</span>
|
||||
<span class="line" id="L104"> }},</span>
|
||||
<span class="line" id="L105">};</span>
|
||||
<span class="line" id="L106"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> target: std.Target = .{</span>
|
||||
<span class="line" id="L107"> .cpu = cpu,</span>
|
||||
<span class="line" id="L108"> .os = os,</span>
|
||||
<span class="line" id="L109"> .abi = abi,</span>
|
||||
<span class="line" id="L110"> .ofmt = object_format,</span>
|
||||
<span class="line" id="L111"> .dynamic_linker = std.Target.DynamicLinker.init(<span class="tok-str">"/nix/store/9v5d40jyvmwgnq1nj8f19ji2rcc5dksd-glibc-2.37-45/lib/ld-linux-x86-64.so.2"</span>),</span>
|
||||
<span class="line" id="L112">};</span>
|
||||
<span class="line" id="L113"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> object_format = std.Target.ObjectFormat.elf;</span>
|
||||
<span class="line" id="L114"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> mode = std.builtin.OptimizeMode.Debug;</span>
|
||||
<span class="line" id="L115"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> link_libc = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L116"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> link_libcpp = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L117"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> have_error_return_tracing = <span class="tok-null">true</span>;</span>
|
||||
<span class="line" id="L118"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> valgrind_support = <span class="tok-null">true</span>;</span>
|
||||
<span class="line" id="L119"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> sanitize_thread = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L120"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> position_independent_code = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L121"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> position_independent_executable = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L122"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> strip_debug_info = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L123"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> code_model = std.builtin.CodeModel.default;</span>
|
||||
<span class="line" id="L124"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> omit_frame_pointer = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L125"></span>
|
||||
<span class="line" id="L14"> .arch = .aarch64,</span>
|
||||
<span class="line" id="L15"> .model = &std.Target.aarch64.cpu.generic,</span>
|
||||
<span class="line" id="L16"> .features = std.Target.aarch64.featureSet(&[_]std.Target.aarch64.Feature{</span>
|
||||
<span class="line" id="L17"> .enable_select_opt,</span>
|
||||
<span class="line" id="L18"> .ete,</span>
|
||||
<span class="line" id="L19"> .fp_armv8,</span>
|
||||
<span class="line" id="L20"> .fuse_adrp_add,</span>
|
||||
<span class="line" id="L21"> .fuse_aes,</span>
|
||||
<span class="line" id="L22"> .neon,</span>
|
||||
<span class="line" id="L23"> .trbe,</span>
|
||||
<span class="line" id="L24"> .use_postra_scheduler,</span>
|
||||
<span class="line" id="L25"> }),</span>
|
||||
<span class="line" id="L26">};</span>
|
||||
<span class="line" id="L27"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> os = std.Target.Os{</span>
|
||||
<span class="line" id="L28"> .tag = .macos,</span>
|
||||
<span class="line" id="L29"> .version_range = .{ .semver = .{</span>
|
||||
<span class="line" id="L30"> .min = .{</span>
|
||||
<span class="line" id="L31"> .major = <span class="tok-number">14</span>,</span>
|
||||
<span class="line" id="L32"> .minor = <span class="tok-number">3</span>,</span>
|
||||
<span class="line" id="L33"> .patch = <span class="tok-number">1</span>,</span>
|
||||
<span class="line" id="L34"> },</span>
|
||||
<span class="line" id="L35"> .max = .{</span>
|
||||
<span class="line" id="L36"> .major = <span class="tok-number">14</span>,</span>
|
||||
<span class="line" id="L37"> .minor = <span class="tok-number">3</span>,</span>
|
||||
<span class="line" id="L38"> .patch = <span class="tok-number">1</span>,</span>
|
||||
<span class="line" id="L39"> },</span>
|
||||
<span class="line" id="L40"> }},</span>
|
||||
<span class="line" id="L41">};</span>
|
||||
<span class="line" id="L42"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> target: std.Target = .{</span>
|
||||
<span class="line" id="L43"> .cpu = cpu,</span>
|
||||
<span class="line" id="L44"> .os = os,</span>
|
||||
<span class="line" id="L45"> .abi = abi,</span>
|
||||
<span class="line" id="L46"> .ofmt = object_format,</span>
|
||||
<span class="line" id="L47"> .dynamic_linker = std.Target.DynamicLinker.init(<span class="tok-str">"/usr/lib/dyld"</span>),</span>
|
||||
<span class="line" id="L48">};</span>
|
||||
<span class="line" id="L49"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> object_format = std.Target.ObjectFormat.macho;</span>
|
||||
<span class="line" id="L50"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> mode = std.builtin.OptimizeMode.Debug;</span>
|
||||
<span class="line" id="L51"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> link_libc = <span class="tok-null">true</span>;</span>
|
||||
<span class="line" id="L52"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> link_libcpp = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L53"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> have_error_return_tracing = <span class="tok-null">true</span>;</span>
|
||||
<span class="line" id="L54"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> valgrind_support = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L55"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> sanitize_thread = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L56"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> position_independent_code = <span class="tok-null">true</span>;</span>
|
||||
<span class="line" id="L57"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> position_independent_executable = <span class="tok-null">true</span>;</span>
|
||||
<span class="line" id="L58"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> strip_debug_info = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L59"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> code_model = std.builtin.CodeModel.default;</span>
|
||||
<span class="line" id="L60"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> omit_frame_pointer = <span class="tok-null">false</span>;</span>
|
||||
<span class="line" id="L61"></span>
|
||||
</code></pre></body>
|
||||
</html>
|
|
@ -176,286 +176,281 @@
|
|||
<span class="line" id="L60"></span>
|
||||
<span class="line" id="L61"><span class="tok-comment">/// The global request handler for this Endpoint, called by the listener.</span></span>
|
||||
<span class="line" id="L62"><span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">onRequest</span>(self: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L63"> <span class="tok-kw">if</span> (r.method) |m| {</span>
|
||||
<span class="line" id="L64"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"GET"</span>))</span>
|
||||
<span class="line" id="L65"> <span class="tok-kw">return</span> self.settings.get.?(self, r);</span>
|
||||
<span class="line" id="L66"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"POST"</span>))</span>
|
||||
<span class="line" id="L67"> <span class="tok-kw">return</span> self.settings.post.?(self, r);</span>
|
||||
<span class="line" id="L68"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"PUT"</span>))</span>
|
||||
<span class="line" id="L69"> <span class="tok-kw">return</span> self.settings.put.?(self, r);</span>
|
||||
<span class="line" id="L70"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"DELETE"</span>))</span>
|
||||
<span class="line" id="L71"> <span class="tok-kw">return</span> self.settings.delete.?(self, r);</span>
|
||||
<span class="line" id="L72"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"PATCH"</span>))</span>
|
||||
<span class="line" id="L73"> <span class="tok-kw">return</span> self.settings.patch.?(self, r);</span>
|
||||
<span class="line" id="L74"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"OPTIONS"</span>))</span>
|
||||
<span class="line" id="L75"> <span class="tok-kw">return</span> self.settings.options.?(self, r);</span>
|
||||
<span class="line" id="L76"> }</span>
|
||||
<span class="line" id="L77">}</span>
|
||||
<span class="line" id="L78"></span>
|
||||
<span class="line" id="L79"><span class="tok-comment">/// Wrap an endpoint with an Authenticator -> new Endpoint of type Endpoint</span></span>
|
||||
<span class="line" id="L80"><span class="tok-comment">/// is available via the `endpoint()` function.</span></span>
|
||||
<span class="line" id="L81"><span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">Authenticating</span>(<span class="tok-kw">comptime</span> Authenticator: <span class="tok-type">type</span>) <span class="tok-type">type</span> {</span>
|
||||
<span class="line" id="L82"> <span class="tok-kw">return</span> <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L83"> authenticator: *Authenticator,</span>
|
||||
<span class="line" id="L84"> ep: *Endpoint,</span>
|
||||
<span class="line" id="L85"> auth_endpoint: Endpoint,</span>
|
||||
<span class="line" id="L86"> <span class="tok-kw">const</span> Self = <span class="tok-builtin">@This</span>();</span>
|
||||
<span class="line" id="L87"></span>
|
||||
<span class="line" id="L88"> <span class="tok-comment">/// Init the authenticating endpoint. Pass in a pointer to the endpoint</span></span>
|
||||
<span class="line" id="L89"> <span class="tok-comment">/// you want to wrap, and the Authenticator that takes care of authenticating</span></span>
|
||||
<span class="line" id="L90"> <span class="tok-comment">/// requests.</span></span>
|
||||
<span class="line" id="L91"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">init</span>(e: *Endpoint, authenticator: *Authenticator) Self {</span>
|
||||
<span class="line" id="L92"> <span class="tok-kw">return</span> .{</span>
|
||||
<span class="line" id="L93"> .authenticator = authenticator,</span>
|
||||
<span class="line" id="L94"> .ep = e,</span>
|
||||
<span class="line" id="L95"> .auth_endpoint = Endpoint.init(.{</span>
|
||||
<span class="line" id="L96"> .path = e.settings.path,</span>
|
||||
<span class="line" id="L97"> <span class="tok-comment">// we override only the set ones. the other ones</span>
|
||||
<span class="line" id="L63"> <span class="tok-kw">switch</span> (r.method) {</span>
|
||||
<span class="line" id="L64"> .GET => self.settings.get.?(self, r),</span>
|
||||
<span class="line" id="L65"> .POST => self.settings.post.?(self, r),</span>
|
||||
<span class="line" id="L66"> .PUT => self.settings.put.?(self, r),</span>
|
||||
<span class="line" id="L67"> .DELETE => self.settings.delete.?(self, r),</span>
|
||||
<span class="line" id="L68"> .PATCH => self.settings.patch.?(self, r),</span>
|
||||
<span class="line" id="L69"> .OPTIONS => self.settings.options.?(self, r),</span>
|
||||
<span class="line" id="L70"> <span class="tok-kw">else</span> => <span class="tok-kw">return</span>,</span>
|
||||
<span class="line" id="L71"> }</span>
|
||||
<span class="line" id="L72">}</span>
|
||||
<span class="line" id="L73"></span>
|
||||
<span class="line" id="L74"><span class="tok-comment">/// Wrap an endpoint with an Authenticator -> new Endpoint of type Endpoint</span></span>
|
||||
<span class="line" id="L75"><span class="tok-comment">/// is available via the `endpoint()` function.</span></span>
|
||||
<span class="line" id="L76"><span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">Authenticating</span>(<span class="tok-kw">comptime</span> Authenticator: <span class="tok-type">type</span>) <span class="tok-type">type</span> {</span>
|
||||
<span class="line" id="L77"> <span class="tok-kw">return</span> <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L78"> authenticator: *Authenticator,</span>
|
||||
<span class="line" id="L79"> ep: *Endpoint,</span>
|
||||
<span class="line" id="L80"> auth_endpoint: Endpoint,</span>
|
||||
<span class="line" id="L81"> <span class="tok-kw">const</span> Self = <span class="tok-builtin">@This</span>();</span>
|
||||
<span class="line" id="L82"></span>
|
||||
<span class="line" id="L83"> <span class="tok-comment">/// Init the authenticating endpoint. Pass in a pointer to the endpoint</span></span>
|
||||
<span class="line" id="L84"> <span class="tok-comment">/// you want to wrap, and the Authenticator that takes care of authenticating</span></span>
|
||||
<span class="line" id="L85"> <span class="tok-comment">/// requests.</span></span>
|
||||
<span class="line" id="L86"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">init</span>(e: *Endpoint, authenticator: *Authenticator) Self {</span>
|
||||
<span class="line" id="L87"> <span class="tok-kw">return</span> .{</span>
|
||||
<span class="line" id="L88"> .authenticator = authenticator,</span>
|
||||
<span class="line" id="L89"> .ep = e,</span>
|
||||
<span class="line" id="L90"> .auth_endpoint = Endpoint.init(.{</span>
|
||||
<span class="line" id="L91"> .path = e.settings.path,</span>
|
||||
<span class="line" id="L92"> <span class="tok-comment">// we override only the set ones. the other ones</span>
|
||||
</span>
|
||||
<span class="line" id="L98"> <span class="tok-comment">// are set to null anyway -> will be nopped out</span>
|
||||
<span class="line" id="L93"> <span class="tok-comment">// are set to null anyway -> will be nopped out</span>
|
||||
</span>
|
||||
<span class="line" id="L99"> .get = <span class="tok-kw">if</span> (e.settings.get != <span class="tok-null">null</span>) get <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L100"> .post = <span class="tok-kw">if</span> (e.settings.post != <span class="tok-null">null</span>) post <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L101"> .put = <span class="tok-kw">if</span> (e.settings.put != <span class="tok-null">null</span>) put <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L102"> .delete = <span class="tok-kw">if</span> (e.settings.delete != <span class="tok-null">null</span>) delete <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L103"> .patch = <span class="tok-kw">if</span> (e.settings.patch != <span class="tok-null">null</span>) patch <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L104"> .options = <span class="tok-kw">if</span> (e.settings.options != <span class="tok-null">null</span>) options <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L105"> .unauthorized = e.settings.unauthorized,</span>
|
||||
<span class="line" id="L106"> }),</span>
|
||||
<span class="line" id="L107"> };</span>
|
||||
<span class="line" id="L108"> }</span>
|
||||
<span class="line" id="L109"></span>
|
||||
<span class="line" id="L110"> <span class="tok-comment">/// Get the auth endpoint struct of type Endpoint so it can be stored in the listener.</span></span>
|
||||
<span class="line" id="L111"> <span class="tok-comment">/// When the listener calls the auth_endpoint, onRequest will have</span></span>
|
||||
<span class="line" id="L112"> <span class="tok-comment">/// access to all of this via fieldParentPtr</span></span>
|
||||
<span class="line" id="L113"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">endpoint</span>(self: *Self) *Endpoint {</span>
|
||||
<span class="line" id="L114"> <span class="tok-kw">return</span> &self.auth_endpoint;</span>
|
||||
<span class="line" id="L115"> }</span>
|
||||
<span class="line" id="L116"></span>
|
||||
<span class="line" id="L117"> <span class="tok-comment">/// GET: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L118"> <span class="tok-comment">/// Authenticates GET requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L119"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">get</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L120"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L121"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L122"> .AuthFailed => {</span>
|
||||
<span class="line" id="L123"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L124"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L125"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L126"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L127"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L128"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L129"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L130"> }</span>
|
||||
<span class="line" id="L131"> },</span>
|
||||
<span class="line" id="L132"> .AuthOK => authEp.ep.settings.get.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L133"> .Handled => {},</span>
|
||||
<span class="line" id="L134"> }</span>
|
||||
<span class="line" id="L135"> }</span>
|
||||
<span class="line" id="L136"></span>
|
||||
<span class="line" id="L137"> <span class="tok-comment">/// POST: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L138"> <span class="tok-comment">/// Authenticates POST requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L139"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">post</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L140"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L141"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L142"> .AuthFailed => {</span>
|
||||
<span class="line" id="L143"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L144"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L145"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L146"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L147"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L148"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L149"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L150"> }</span>
|
||||
<span class="line" id="L151"> },</span>
|
||||
<span class="line" id="L152"> .AuthOK => authEp.ep.settings.post.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L153"> .Handled => {},</span>
|
||||
<span class="line" id="L154"> }</span>
|
||||
<span class="line" id="L155"> }</span>
|
||||
<span class="line" id="L156"></span>
|
||||
<span class="line" id="L157"> <span class="tok-comment">/// PUT: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L158"> <span class="tok-comment">/// Authenticates PUT requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L159"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">put</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L160"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L161"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L162"> .AuthFailed => {</span>
|
||||
<span class="line" id="L163"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L164"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L165"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L166"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L167"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L168"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L169"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L170"> }</span>
|
||||
<span class="line" id="L171"> },</span>
|
||||
<span class="line" id="L172"> .AuthOK => authEp.ep.settings.put.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L173"> .Handled => {},</span>
|
||||
<span class="line" id="L174"> }</span>
|
||||
<span class="line" id="L175"> }</span>
|
||||
<span class="line" id="L176"></span>
|
||||
<span class="line" id="L177"> <span class="tok-comment">/// DELETE: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L178"> <span class="tok-comment">/// Authenticates DELETE requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L179"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">delete</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L180"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L181"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L182"> .AuthFailed => {</span>
|
||||
<span class="line" id="L183"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L184"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L185"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L186"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L187"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L188"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L189"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L190"> }</span>
|
||||
<span class="line" id="L191"> },</span>
|
||||
<span class="line" id="L192"> .AuthOK => authEp.ep.settings.delete.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L193"> .Handled => {},</span>
|
||||
<span class="line" id="L194"> }</span>
|
||||
<span class="line" id="L195"> }</span>
|
||||
<span class="line" id="L196"></span>
|
||||
<span class="line" id="L197"> <span class="tok-comment">/// PATCH: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L198"> <span class="tok-comment">/// Authenticates PATCH requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L199"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">patch</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L200"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L201"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L202"> .AuthFailed => {</span>
|
||||
<span class="line" id="L203"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L204"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L205"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L206"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L207"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L208"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L209"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L210"> }</span>
|
||||
<span class="line" id="L211"> },</span>
|
||||
<span class="line" id="L212"> .AuthOK => authEp.ep.settings.patch.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L213"> .Handled => {},</span>
|
||||
<span class="line" id="L214"> }</span>
|
||||
<span class="line" id="L215"> }</span>
|
||||
<span class="line" id="L216"></span>
|
||||
<span class="line" id="L217"> <span class="tok-comment">/// OPTIONS: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L218"> <span class="tok-comment">/// Authenticates OPTIONS requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L219"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">options</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L220"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L221"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L222"> .AuthFailed => {</span>
|
||||
<span class="line" id="L223"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L224"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L225"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L226"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L227"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L228"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L229"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L230"> }</span>
|
||||
<span class="line" id="L231"> },</span>
|
||||
<span class="line" id="L232"> .AuthOK => authEp.ep.settings.put.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L233"> .Handled => {},</span>
|
||||
<span class="line" id="L234"> }</span>
|
||||
<span class="line" id="L235"> }</span>
|
||||
<span class="line" id="L236"> };</span>
|
||||
<span class="line" id="L237">}</span>
|
||||
<span class="line" id="L238"></span>
|
||||
<span class="line" id="L239"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> EndpointListenerError = <span class="tok-kw">error</span>{</span>
|
||||
<span class="line" id="L240"> <span class="tok-comment">/// Since we use .startsWith to check for matching paths, you cannot use</span></span>
|
||||
<span class="line" id="L241"> <span class="tok-comment">/// endpoint paths that overlap at the beginning. --> When trying to register</span></span>
|
||||
<span class="line" id="L242"> <span class="tok-comment">/// an endpoint whose path would shadow an already registered one, you will</span></span>
|
||||
<span class="line" id="L243"> <span class="tok-comment">/// receive this error.</span></span>
|
||||
<span class="line" id="L244"> EndpointPathShadowError,</span>
|
||||
<span class="line" id="L245">};</span>
|
||||
<span class="line" id="L246"></span>
|
||||
<span class="line" id="L247"><span class="tok-comment">/// The listener with endpoint support</span></span>
|
||||
<span class="line" id="L248"><span class="tok-comment">///</span></span>
|
||||
<span class="line" id="L249"><span class="tok-comment">/// NOTE: It switches on path.startsWith -> so use endpoints with distinctly starting names!!</span></span>
|
||||
<span class="line" id="L250"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> Listener = <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L251"> listener: HttpListener,</span>
|
||||
<span class="line" id="L252"> allocator: std.mem.Allocator,</span>
|
||||
<span class="line" id="L94"> .get = <span class="tok-kw">if</span> (e.settings.get != <span class="tok-null">null</span>) get <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L95"> .post = <span class="tok-kw">if</span> (e.settings.post != <span class="tok-null">null</span>) post <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L96"> .put = <span class="tok-kw">if</span> (e.settings.put != <span class="tok-null">null</span>) put <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L97"> .delete = <span class="tok-kw">if</span> (e.settings.delete != <span class="tok-null">null</span>) delete <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L98"> .patch = <span class="tok-kw">if</span> (e.settings.patch != <span class="tok-null">null</span>) patch <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L99"> .options = <span class="tok-kw">if</span> (e.settings.options != <span class="tok-null">null</span>) options <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L100"> .unauthorized = e.settings.unauthorized,</span>
|
||||
<span class="line" id="L101"> }),</span>
|
||||
<span class="line" id="L102"> };</span>
|
||||
<span class="line" id="L103"> }</span>
|
||||
<span class="line" id="L104"></span>
|
||||
<span class="line" id="L105"> <span class="tok-comment">/// Get the auth endpoint struct of type Endpoint so it can be stored in the listener.</span></span>
|
||||
<span class="line" id="L106"> <span class="tok-comment">/// When the listener calls the auth_endpoint, onRequest will have</span></span>
|
||||
<span class="line" id="L107"> <span class="tok-comment">/// access to all of this via fieldParentPtr</span></span>
|
||||
<span class="line" id="L108"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">endpoint</span>(self: *Self) *Endpoint {</span>
|
||||
<span class="line" id="L109"> <span class="tok-kw">return</span> &self.auth_endpoint;</span>
|
||||
<span class="line" id="L110"> }</span>
|
||||
<span class="line" id="L111"></span>
|
||||
<span class="line" id="L112"> <span class="tok-comment">/// GET: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L113"> <span class="tok-comment">/// Authenticates GET requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L114"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">get</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L115"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L116"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L117"> .AuthFailed => {</span>
|
||||
<span class="line" id="L118"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L119"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L120"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L121"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L122"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L123"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L124"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L125"> }</span>
|
||||
<span class="line" id="L126"> },</span>
|
||||
<span class="line" id="L127"> .AuthOK => authEp.ep.settings.get.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L128"> .Handled => {},</span>
|
||||
<span class="line" id="L129"> }</span>
|
||||
<span class="line" id="L130"> }</span>
|
||||
<span class="line" id="L131"></span>
|
||||
<span class="line" id="L132"> <span class="tok-comment">/// POST: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L133"> <span class="tok-comment">/// Authenticates POST requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L134"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">post</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L135"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L136"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L137"> .AuthFailed => {</span>
|
||||
<span class="line" id="L138"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L139"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L140"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L141"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L142"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L143"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L144"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L145"> }</span>
|
||||
<span class="line" id="L146"> },</span>
|
||||
<span class="line" id="L147"> .AuthOK => authEp.ep.settings.post.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L148"> .Handled => {},</span>
|
||||
<span class="line" id="L149"> }</span>
|
||||
<span class="line" id="L150"> }</span>
|
||||
<span class="line" id="L151"></span>
|
||||
<span class="line" id="L152"> <span class="tok-comment">/// PUT: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L153"> <span class="tok-comment">/// Authenticates PUT requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L154"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">put</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L155"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L156"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L157"> .AuthFailed => {</span>
|
||||
<span class="line" id="L158"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L159"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L160"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L161"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L162"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L163"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L164"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L165"> }</span>
|
||||
<span class="line" id="L166"> },</span>
|
||||
<span class="line" id="L167"> .AuthOK => authEp.ep.settings.put.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L168"> .Handled => {},</span>
|
||||
<span class="line" id="L169"> }</span>
|
||||
<span class="line" id="L170"> }</span>
|
||||
<span class="line" id="L171"></span>
|
||||
<span class="line" id="L172"> <span class="tok-comment">/// DELETE: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L173"> <span class="tok-comment">/// Authenticates DELETE requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L174"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">delete</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L175"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L176"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L177"> .AuthFailed => {</span>
|
||||
<span class="line" id="L178"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L179"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L180"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L181"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L182"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L183"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L184"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L185"> }</span>
|
||||
<span class="line" id="L186"> },</span>
|
||||
<span class="line" id="L187"> .AuthOK => authEp.ep.settings.delete.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L188"> .Handled => {},</span>
|
||||
<span class="line" id="L189"> }</span>
|
||||
<span class="line" id="L190"> }</span>
|
||||
<span class="line" id="L191"></span>
|
||||
<span class="line" id="L192"> <span class="tok-comment">/// PATCH: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L193"> <span class="tok-comment">/// Authenticates PATCH requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L194"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">patch</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L195"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L196"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L197"> .AuthFailed => {</span>
|
||||
<span class="line" id="L198"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L199"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L200"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L201"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L202"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L203"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L204"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L205"> }</span>
|
||||
<span class="line" id="L206"> },</span>
|
||||
<span class="line" id="L207"> .AuthOK => authEp.ep.settings.patch.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L208"> .Handled => {},</span>
|
||||
<span class="line" id="L209"> }</span>
|
||||
<span class="line" id="L210"> }</span>
|
||||
<span class="line" id="L211"></span>
|
||||
<span class="line" id="L212"> <span class="tok-comment">/// OPTIONS: here, the auth_endpoint will be passed in as endpoint.</span></span>
|
||||
<span class="line" id="L213"> <span class="tok-comment">/// Authenticates OPTIONS requests using the Authenticator.</span></span>
|
||||
<span class="line" id="L214"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">options</span>(e: *Endpoint, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L215"> <span class="tok-kw">const</span> authEp: *Self = <span class="tok-builtin">@fieldParentPtr</span>(Self, <span class="tok-str">"auth_endpoint"</span>, e);</span>
|
||||
<span class="line" id="L216"> <span class="tok-kw">switch</span> (authEp.authenticator.authenticateRequest(&r)) {</span>
|
||||
<span class="line" id="L217"> .AuthFailed => {</span>
|
||||
<span class="line" id="L218"> <span class="tok-kw">if</span> (e.settings.unauthorized) |unauthorized| {</span>
|
||||
<span class="line" id="L219"> unauthorized(authEp.ep, r);</span>
|
||||
<span class="line" id="L220"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L221"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L222"> r.setStatus(.unauthorized);</span>
|
||||
<span class="line" id="L223"> r.sendBody(<span class="tok-str">"UNAUTHORIZED"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L224"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L225"> }</span>
|
||||
<span class="line" id="L226"> },</span>
|
||||
<span class="line" id="L227"> .AuthOK => authEp.ep.settings.put.?(authEp.ep, r),</span>
|
||||
<span class="line" id="L228"> .Handled => {},</span>
|
||||
<span class="line" id="L229"> }</span>
|
||||
<span class="line" id="L230"> }</span>
|
||||
<span class="line" id="L231"> };</span>
|
||||
<span class="line" id="L232">}</span>
|
||||
<span class="line" id="L233"></span>
|
||||
<span class="line" id="L234"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> EndpointListenerError = <span class="tok-kw">error</span>{</span>
|
||||
<span class="line" id="L235"> <span class="tok-comment">/// Since we use .startsWith to check for matching paths, you cannot use</span></span>
|
||||
<span class="line" id="L236"> <span class="tok-comment">/// endpoint paths that overlap at the beginning. --> When trying to register</span></span>
|
||||
<span class="line" id="L237"> <span class="tok-comment">/// an endpoint whose path would shadow an already registered one, you will</span></span>
|
||||
<span class="line" id="L238"> <span class="tok-comment">/// receive this error.</span></span>
|
||||
<span class="line" id="L239"> EndpointPathShadowError,</span>
|
||||
<span class="line" id="L240">};</span>
|
||||
<span class="line" id="L241"></span>
|
||||
<span class="line" id="L242"><span class="tok-comment">/// The listener with endpoint support</span></span>
|
||||
<span class="line" id="L243"><span class="tok-comment">///</span></span>
|
||||
<span class="line" id="L244"><span class="tok-comment">/// NOTE: It switches on path.startsWith -> so use endpoints with distinctly starting names!!</span></span>
|
||||
<span class="line" id="L245"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> Listener = <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L246"> listener: HttpListener,</span>
|
||||
<span class="line" id="L247"> allocator: std.mem.Allocator,</span>
|
||||
<span class="line" id="L248"></span>
|
||||
<span class="line" id="L249"> <span class="tok-kw">const</span> Self = <span class="tok-builtin">@This</span>();</span>
|
||||
<span class="line" id="L250"></span>
|
||||
<span class="line" id="L251"> <span class="tok-comment">/// Internal static struct of member endpoints</span></span>
|
||||
<span class="line" id="L252"> <span class="tok-kw">var</span> endpoints: std.ArrayList(*Endpoint) = <span class="tok-null">undefined</span>;</span>
|
||||
<span class="line" id="L253"></span>
|
||||
<span class="line" id="L254"> <span class="tok-kw">const</span> Self = <span class="tok-builtin">@This</span>();</span>
|
||||
<span class="line" id="L255"></span>
|
||||
<span class="line" id="L256"> <span class="tok-comment">/// Internal static struct of member endpoints</span></span>
|
||||
<span class="line" id="L257"> <span class="tok-kw">var</span> endpoints: std.ArrayList(*Endpoint) = <span class="tok-null">undefined</span>;</span>
|
||||
<span class="line" id="L254"> <span class="tok-comment">/// Internal, static request handler callback. Will be set to the optional,</span></span>
|
||||
<span class="line" id="L255"> <span class="tok-comment">/// user-defined request callback that only gets called if no endpoints match</span></span>
|
||||
<span class="line" id="L256"> <span class="tok-comment">/// a request.</span></span>
|
||||
<span class="line" id="L257"> <span class="tok-kw">var</span> on_request: ?zap.HttpRequestFn = <span class="tok-null">null</span>;</span>
|
||||
<span class="line" id="L258"></span>
|
||||
<span class="line" id="L259"> <span class="tok-comment">/// Internal, static request handler callback. Will be set to the optional,</span></span>
|
||||
<span class="line" id="L260"> <span class="tok-comment">/// user-defined request callback that only gets called if no endpoints match</span></span>
|
||||
<span class="line" id="L261"> <span class="tok-comment">/// a request.</span></span>
|
||||
<span class="line" id="L262"> <span class="tok-kw">var</span> on_request: ?zap.HttpRequestFn = <span class="tok-null">null</span>;</span>
|
||||
<span class="line" id="L263"></span>
|
||||
<span class="line" id="L264"> <span class="tok-comment">/// Initialize a new endpoint listener. Note, if you pass an `on_request`</span></span>
|
||||
<span class="line" id="L265"> <span class="tok-comment">/// callback in the provided ListenerSettings, this request callback will be</span></span>
|
||||
<span class="line" id="L266"> <span class="tok-comment">/// called every time a request arrives that no endpoint matches.</span></span>
|
||||
<span class="line" id="L267"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">init</span>(a: std.mem.Allocator, l: ListenerSettings) Self {</span>
|
||||
<span class="line" id="L268"> endpoints = std.ArrayList(*Endpoint).init(a);</span>
|
||||
<span class="line" id="L269"></span>
|
||||
<span class="line" id="L270"> <span class="tok-comment">// take copy of listener settings before modifying the callback field</span>
|
||||
<span class="line" id="L259"> <span class="tok-comment">/// Initialize a new endpoint listener. Note, if you pass an `on_request`</span></span>
|
||||
<span class="line" id="L260"> <span class="tok-comment">/// callback in the provided ListenerSettings, this request callback will be</span></span>
|
||||
<span class="line" id="L261"> <span class="tok-comment">/// called every time a request arrives that no endpoint matches.</span></span>
|
||||
<span class="line" id="L262"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">init</span>(a: std.mem.Allocator, l: ListenerSettings) Self {</span>
|
||||
<span class="line" id="L263"> endpoints = std.ArrayList(*Endpoint).init(a);</span>
|
||||
<span class="line" id="L264"></span>
|
||||
<span class="line" id="L265"> <span class="tok-comment">// take copy of listener settings before modifying the callback field</span>
|
||||
</span>
|
||||
<span class="line" id="L271"> <span class="tok-kw">var</span> ls = l;</span>
|
||||
<span class="line" id="L272"></span>
|
||||
<span class="line" id="L273"> <span class="tok-comment">// override the settings with our internal, actul callback function</span>
|
||||
<span class="line" id="L266"> <span class="tok-kw">var</span> ls = l;</span>
|
||||
<span class="line" id="L267"></span>
|
||||
<span class="line" id="L268"> <span class="tok-comment">// override the settings with our internal, actul callback function</span>
|
||||
</span>
|
||||
<span class="line" id="L274"> <span class="tok-comment">// so that "we" will be called on request</span>
|
||||
<span class="line" id="L269"> <span class="tok-comment">// so that "we" will be called on request</span>
|
||||
</span>
|
||||
<span class="line" id="L275"> ls.on_request = Listener.onRequest;</span>
|
||||
<span class="line" id="L276"></span>
|
||||
<span class="line" id="L277"> <span class="tok-comment">// store the settings-provided request callback for later use</span>
|
||||
<span class="line" id="L270"> ls.on_request = Listener.onRequest;</span>
|
||||
<span class="line" id="L271"></span>
|
||||
<span class="line" id="L272"> <span class="tok-comment">// store the settings-provided request callback for later use</span>
|
||||
</span>
|
||||
<span class="line" id="L278"> on_request = l.on_request;</span>
|
||||
<span class="line" id="L279"> <span class="tok-kw">return</span> .{</span>
|
||||
<span class="line" id="L280"> .listener = HttpListener.init(ls),</span>
|
||||
<span class="line" id="L281"> .allocator = a,</span>
|
||||
<span class="line" id="L282"> };</span>
|
||||
<span class="line" id="L283"> }</span>
|
||||
<span class="line" id="L284"></span>
|
||||
<span class="line" id="L285"> <span class="tok-comment">/// De-init the listener and free its resources.</span></span>
|
||||
<span class="line" id="L286"> <span class="tok-comment">/// Registered endpoints will not be de-initialized automatically; just removed</span></span>
|
||||
<span class="line" id="L287"> <span class="tok-comment">/// from the internal map.</span></span>
|
||||
<span class="line" id="L288"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">deinit</span>(self: *Self) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L289"> _ = self;</span>
|
||||
<span class="line" id="L290"> endpoints.deinit();</span>
|
||||
<span class="line" id="L291"> }</span>
|
||||
<span class="line" id="L292"></span>
|
||||
<span class="line" id="L293"> <span class="tok-comment">/// Call this to start listening. After this, no more endpoints can be</span></span>
|
||||
<span class="line" id="L294"> <span class="tok-comment">/// registered.</span></span>
|
||||
<span class="line" id="L295"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">listen</span>(self: *Self) !<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L296"> <span class="tok-kw">try</span> self.listener.listen();</span>
|
||||
<span class="line" id="L297"> }</span>
|
||||
<span class="line" id="L298"></span>
|
||||
<span class="line" id="L299"> <span class="tok-comment">/// Register an endpoint with this listener.</span></span>
|
||||
<span class="line" id="L300"> <span class="tok-comment">/// NOTE: endpoint paths are matched with startsWith -> so use endpoints with distinctly starting names!!</span></span>
|
||||
<span class="line" id="L301"> <span class="tok-comment">/// If you try to register an endpoint whose path would shadow an already registered one, you will</span></span>
|
||||
<span class="line" id="L302"> <span class="tok-comment">/// receive an EndpointPathShadowError.</span></span>
|
||||
<span class="line" id="L303"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">register</span>(self: *Self, e: *Endpoint) !<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L304"> _ = self;</span>
|
||||
<span class="line" id="L305"> <span class="tok-kw">for</span> (endpoints.items) |other| {</span>
|
||||
<span class="line" id="L306"> <span class="tok-kw">if</span> (std.mem.startsWith(</span>
|
||||
<span class="line" id="L307"> <span class="tok-type">u8</span>,</span>
|
||||
<span class="line" id="L273"> on_request = l.on_request;</span>
|
||||
<span class="line" id="L274"> <span class="tok-kw">return</span> .{</span>
|
||||
<span class="line" id="L275"> .listener = HttpListener.init(ls),</span>
|
||||
<span class="line" id="L276"> .allocator = a,</span>
|
||||
<span class="line" id="L277"> };</span>
|
||||
<span class="line" id="L278"> }</span>
|
||||
<span class="line" id="L279"></span>
|
||||
<span class="line" id="L280"> <span class="tok-comment">/// De-init the listener and free its resources.</span></span>
|
||||
<span class="line" id="L281"> <span class="tok-comment">/// Registered endpoints will not be de-initialized automatically; just removed</span></span>
|
||||
<span class="line" id="L282"> <span class="tok-comment">/// from the internal map.</span></span>
|
||||
<span class="line" id="L283"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">deinit</span>(self: *Self) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L284"> _ = self;</span>
|
||||
<span class="line" id="L285"> endpoints.deinit();</span>
|
||||
<span class="line" id="L286"> }</span>
|
||||
<span class="line" id="L287"></span>
|
||||
<span class="line" id="L288"> <span class="tok-comment">/// Call this to start listening. After this, no more endpoints can be</span></span>
|
||||
<span class="line" id="L289"> <span class="tok-comment">/// registered.</span></span>
|
||||
<span class="line" id="L290"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">listen</span>(self: *Self) !<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L291"> <span class="tok-kw">try</span> self.listener.listen();</span>
|
||||
<span class="line" id="L292"> }</span>
|
||||
<span class="line" id="L293"></span>
|
||||
<span class="line" id="L294"> <span class="tok-comment">/// Register an endpoint with this listener.</span></span>
|
||||
<span class="line" id="L295"> <span class="tok-comment">/// NOTE: endpoint paths are matched with startsWith -> so use endpoints with distinctly starting names!!</span></span>
|
||||
<span class="line" id="L296"> <span class="tok-comment">/// If you try to register an endpoint whose path would shadow an already registered one, you will</span></span>
|
||||
<span class="line" id="L297"> <span class="tok-comment">/// receive an EndpointPathShadowError.</span></span>
|
||||
<span class="line" id="L298"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">register</span>(self: *Self, e: *Endpoint) !<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L299"> _ = self;</span>
|
||||
<span class="line" id="L300"> <span class="tok-kw">for</span> (endpoints.items) |other| {</span>
|
||||
<span class="line" id="L301"> <span class="tok-kw">if</span> (std.mem.startsWith(</span>
|
||||
<span class="line" id="L302"> <span class="tok-type">u8</span>,</span>
|
||||
<span class="line" id="L303"> other.settings.path,</span>
|
||||
<span class="line" id="L304"> e.settings.path,</span>
|
||||
<span class="line" id="L305"> ) <span class="tok-kw">or</span> std.mem.startsWith(</span>
|
||||
<span class="line" id="L306"> <span class="tok-type">u8</span>,</span>
|
||||
<span class="line" id="L307"> e.settings.path,</span>
|
||||
<span class="line" id="L308"> other.settings.path,</span>
|
||||
<span class="line" id="L309"> e.settings.path,</span>
|
||||
<span class="line" id="L310"> ) <span class="tok-kw">or</span> std.mem.startsWith(</span>
|
||||
<span class="line" id="L311"> <span class="tok-type">u8</span>,</span>
|
||||
<span class="line" id="L312"> e.settings.path,</span>
|
||||
<span class="line" id="L313"> other.settings.path,</span>
|
||||
<span class="line" id="L314"> )) {</span>
|
||||
<span class="line" id="L315"> <span class="tok-kw">return</span> EndpointListenerError.EndpointPathShadowError;</span>
|
||||
<span class="line" id="L316"> }</span>
|
||||
<span class="line" id="L317"> }</span>
|
||||
<span class="line" id="L318"> <span class="tok-kw">try</span> endpoints.append(e);</span>
|
||||
<span class="line" id="L319"> }</span>
|
||||
<span class="line" id="L320"></span>
|
||||
<span class="line" id="L321"> <span class="tok-kw">fn</span> <span class="tok-fn">onRequest</span>(r: Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L322"> <span class="tok-kw">if</span> (r.path) |p| {</span>
|
||||
<span class="line" id="L323"> <span class="tok-kw">for</span> (endpoints.items) |e| {</span>
|
||||
<span class="line" id="L324"> <span class="tok-kw">if</span> (std.mem.startsWith(<span class="tok-type">u8</span>, p, e.settings.path)) {</span>
|
||||
<span class="line" id="L325"> e.onRequest(r);</span>
|
||||
<span class="line" id="L326"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L327"> }</span>
|
||||
<span class="line" id="L328"> }</span>
|
||||
<span class="line" id="L329"> }</span>
|
||||
<span class="line" id="L330"> <span class="tok-comment">// if set, call the user-provided default callback</span>
|
||||
<span class="line" id="L309"> )) {</span>
|
||||
<span class="line" id="L310"> <span class="tok-kw">return</span> EndpointListenerError.EndpointPathShadowError;</span>
|
||||
<span class="line" id="L311"> }</span>
|
||||
<span class="line" id="L312"> }</span>
|
||||
<span class="line" id="L313"> <span class="tok-kw">try</span> endpoints.append(e);</span>
|
||||
<span class="line" id="L314"> }</span>
|
||||
<span class="line" id="L315"></span>
|
||||
<span class="line" id="L316"> <span class="tok-kw">fn</span> <span class="tok-fn">onRequest</span>(r: Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L317"> <span class="tok-kw">if</span> (r.path) |p| {</span>
|
||||
<span class="line" id="L318"> <span class="tok-kw">for</span> (endpoints.items) |e| {</span>
|
||||
<span class="line" id="L319"> <span class="tok-kw">if</span> (std.mem.startsWith(<span class="tok-type">u8</span>, p, e.settings.path)) {</span>
|
||||
<span class="line" id="L320"> e.onRequest(r);</span>
|
||||
<span class="line" id="L321"> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L322"> }</span>
|
||||
<span class="line" id="L323"> }</span>
|
||||
<span class="line" id="L324"> }</span>
|
||||
<span class="line" id="L325"> <span class="tok-comment">// if set, call the user-provided default callback</span>
|
||||
</span>
|
||||
<span class="line" id="L331"> <span class="tok-kw">if</span> (on_request) |foo| {</span>
|
||||
<span class="line" id="L332"> foo(r);</span>
|
||||
<span class="line" id="L333"> }</span>
|
||||
<span class="line" id="L334"> }</span>
|
||||
<span class="line" id="L335">};</span>
|
||||
<span class="line" id="L336"></span>
|
||||
<span class="line" id="L326"> <span class="tok-kw">if</span> (on_request) |foo| {</span>
|
||||
<span class="line" id="L327"> foo(r);</span>
|
||||
<span class="line" id="L328"> }</span>
|
||||
<span class="line" id="L329"> }</span>
|
||||
<span class="line" id="L330">};</span>
|
||||
<span class="line" id="L331"></span>
|
||||
</code></pre></body>
|
||||
</html>
|
|
@ -112,118 +112,149 @@
|
|||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<pre><code><span class="line" id="L1"><span class="tok-comment">/// HTTP Status codes according to `rfc7231`</span></span>
|
||||
<span class="line" id="L2"><span class="tok-comment">/// https://tools.ietf.org/html/rfc7231#section-6</span></span>
|
||||
<span class="line" id="L3"><span class="tok-comment">/// (taken from https://github.com/Luukdegram/apple_pie/blob/master/src/response.zig)</span></span>
|
||||
<span class="line" id="L4"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> StatusCode = <span class="tok-kw">enum</span>(<span class="tok-type">u16</span>) {</span>
|
||||
<span class="line" id="L5"> <span class="tok-comment">// Informational 1xx</span>
|
||||
<pre><code><span class="line" id="L1"><span class="tok-kw">const</span> std = <span class="tok-builtin">@import</span>(<span class="tok-str">"std"</span>);</span>
|
||||
<span class="line" id="L2"></span>
|
||||
<span class="line" id="L3"><span class="tok-comment">/// HTTP Status codes according to `rfc7231`</span></span>
|
||||
<span class="line" id="L4"><span class="tok-comment">/// https://tools.ietf.org/html/rfc7231#section-6</span></span>
|
||||
<span class="line" id="L5"><span class="tok-comment">/// (taken from https://github.com/Luukdegram/apple_pie/blob/master/src/response.zig)</span></span>
|
||||
<span class="line" id="L6"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> StatusCode = <span class="tok-kw">enum</span>(<span class="tok-type">u16</span>) {</span>
|
||||
<span class="line" id="L7"> <span class="tok-comment">// Informational 1xx</span>
|
||||
</span>
|
||||
<span class="line" id="L6"> @"continue" = <span class="tok-number">100</span>,</span>
|
||||
<span class="line" id="L7"> <span class="tok-comment">// Successful 2xx</span>
|
||||
<span class="line" id="L8"> @"continue" = <span class="tok-number">100</span>,</span>
|
||||
<span class="line" id="L9"> <span class="tok-comment">// Successful 2xx</span>
|
||||
</span>
|
||||
<span class="line" id="L8"> switching_protocols = <span class="tok-number">101</span>,</span>
|
||||
<span class="line" id="L9"> ok = <span class="tok-number">200</span>,</span>
|
||||
<span class="line" id="L10"> created = <span class="tok-number">201</span>,</span>
|
||||
<span class="line" id="L11"> accepted = <span class="tok-number">202</span>,</span>
|
||||
<span class="line" id="L12"> non_authoritative_information = <span class="tok-number">203</span>,</span>
|
||||
<span class="line" id="L13"> no_content = <span class="tok-number">204</span>,</span>
|
||||
<span class="line" id="L14"> reset_content = <span class="tok-number">205</span>,</span>
|
||||
<span class="line" id="L15"> <span class="tok-comment">// redirections 3xx</span>
|
||||
<span class="line" id="L10"> switching_protocols = <span class="tok-number">101</span>,</span>
|
||||
<span class="line" id="L11"> ok = <span class="tok-number">200</span>,</span>
|
||||
<span class="line" id="L12"> created = <span class="tok-number">201</span>,</span>
|
||||
<span class="line" id="L13"> accepted = <span class="tok-number">202</span>,</span>
|
||||
<span class="line" id="L14"> non_authoritative_information = <span class="tok-number">203</span>,</span>
|
||||
<span class="line" id="L15"> no_content = <span class="tok-number">204</span>,</span>
|
||||
<span class="line" id="L16"> reset_content = <span class="tok-number">205</span>,</span>
|
||||
<span class="line" id="L17"> <span class="tok-comment">// redirections 3xx</span>
|
||||
</span>
|
||||
<span class="line" id="L16"> partial_content = <span class="tok-number">206</span>,</span>
|
||||
<span class="line" id="L17"> multiple_choices = <span class="tok-number">300</span>,</span>
|
||||
<span class="line" id="L18"> moved_permanently = <span class="tok-number">301</span>,</span>
|
||||
<span class="line" id="L19"> found = <span class="tok-number">302</span>,</span>
|
||||
<span class="line" id="L20"> see_other = <span class="tok-number">303</span>,</span>
|
||||
<span class="line" id="L21"> not_modified = <span class="tok-number">304</span>,</span>
|
||||
<span class="line" id="L22"> use_proxy = <span class="tok-number">305</span>,</span>
|
||||
<span class="line" id="L23"> temporary_redirect = <span class="tok-number">307</span>,</span>
|
||||
<span class="line" id="L24"> <span class="tok-comment">// client errors 4xx</span>
|
||||
<span class="line" id="L18"> partial_content = <span class="tok-number">206</span>,</span>
|
||||
<span class="line" id="L19"> multiple_choices = <span class="tok-number">300</span>,</span>
|
||||
<span class="line" id="L20"> moved_permanently = <span class="tok-number">301</span>,</span>
|
||||
<span class="line" id="L21"> found = <span class="tok-number">302</span>,</span>
|
||||
<span class="line" id="L22"> see_other = <span class="tok-number">303</span>,</span>
|
||||
<span class="line" id="L23"> not_modified = <span class="tok-number">304</span>,</span>
|
||||
<span class="line" id="L24"> use_proxy = <span class="tok-number">305</span>,</span>
|
||||
<span class="line" id="L25"> temporary_redirect = <span class="tok-number">307</span>,</span>
|
||||
<span class="line" id="L26"> <span class="tok-comment">// client errors 4xx</span>
|
||||
</span>
|
||||
<span class="line" id="L25"> bad_request = <span class="tok-number">400</span>,</span>
|
||||
<span class="line" id="L26"> unauthorized = <span class="tok-number">401</span>,</span>
|
||||
<span class="line" id="L27"> payment_required = <span class="tok-number">402</span>,</span>
|
||||
<span class="line" id="L28"> forbidden = <span class="tok-number">403</span>,</span>
|
||||
<span class="line" id="L29"> not_found = <span class="tok-number">404</span>,</span>
|
||||
<span class="line" id="L30"> method_not_allowed = <span class="tok-number">405</span>,</span>
|
||||
<span class="line" id="L31"> not_acceptable = <span class="tok-number">406</span>,</span>
|
||||
<span class="line" id="L32"> proxy_authentication_required = <span class="tok-number">407</span>,</span>
|
||||
<span class="line" id="L33"> request_timeout = <span class="tok-number">408</span>,</span>
|
||||
<span class="line" id="L34"> conflict = <span class="tok-number">409</span>,</span>
|
||||
<span class="line" id="L35"> gone = <span class="tok-number">410</span>,</span>
|
||||
<span class="line" id="L36"> length_required = <span class="tok-number">411</span>,</span>
|
||||
<span class="line" id="L37"> precondition_failed = <span class="tok-number">412</span>,</span>
|
||||
<span class="line" id="L38"> request_entity_too_large = <span class="tok-number">413</span>,</span>
|
||||
<span class="line" id="L39"> request_uri_too_long = <span class="tok-number">414</span>,</span>
|
||||
<span class="line" id="L40"> unsupported_mediatype = <span class="tok-number">415</span>,</span>
|
||||
<span class="line" id="L41"> requested_range_not_satisfiable = <span class="tok-number">416</span>,</span>
|
||||
<span class="line" id="L42"> expectation_failed = <span class="tok-number">417</span>,</span>
|
||||
<span class="line" id="L43"> <span class="tok-comment">/// teapot is an extension status code and not required for clients to support</span></span>
|
||||
<span class="line" id="L44"> teapot = <span class="tok-number">418</span>,</span>
|
||||
<span class="line" id="L45"> upgrade_required = <span class="tok-number">426</span>,</span>
|
||||
<span class="line" id="L46"> <span class="tok-comment">/// extra status code according to `https://tools.ietf.org/html/rfc6585#section-5`</span></span>
|
||||
<span class="line" id="L47"> request_header_fields_too_large = <span class="tok-number">431</span>,</span>
|
||||
<span class="line" id="L48"> <span class="tok-comment">// server errors 5xx</span>
|
||||
<span class="line" id="L27"> bad_request = <span class="tok-number">400</span>,</span>
|
||||
<span class="line" id="L28"> unauthorized = <span class="tok-number">401</span>,</span>
|
||||
<span class="line" id="L29"> payment_required = <span class="tok-number">402</span>,</span>
|
||||
<span class="line" id="L30"> forbidden = <span class="tok-number">403</span>,</span>
|
||||
<span class="line" id="L31"> not_found = <span class="tok-number">404</span>,</span>
|
||||
<span class="line" id="L32"> method_not_allowed = <span class="tok-number">405</span>,</span>
|
||||
<span class="line" id="L33"> not_acceptable = <span class="tok-number">406</span>,</span>
|
||||
<span class="line" id="L34"> proxy_authentication_required = <span class="tok-number">407</span>,</span>
|
||||
<span class="line" id="L35"> request_timeout = <span class="tok-number">408</span>,</span>
|
||||
<span class="line" id="L36"> conflict = <span class="tok-number">409</span>,</span>
|
||||
<span class="line" id="L37"> gone = <span class="tok-number">410</span>,</span>
|
||||
<span class="line" id="L38"> length_required = <span class="tok-number">411</span>,</span>
|
||||
<span class="line" id="L39"> precondition_failed = <span class="tok-number">412</span>,</span>
|
||||
<span class="line" id="L40"> request_entity_too_large = <span class="tok-number">413</span>,</span>
|
||||
<span class="line" id="L41"> request_uri_too_long = <span class="tok-number">414</span>,</span>
|
||||
<span class="line" id="L42"> unsupported_mediatype = <span class="tok-number">415</span>,</span>
|
||||
<span class="line" id="L43"> requested_range_not_satisfiable = <span class="tok-number">416</span>,</span>
|
||||
<span class="line" id="L44"> expectation_failed = <span class="tok-number">417</span>,</span>
|
||||
<span class="line" id="L45"> <span class="tok-comment">/// teapot is an extension status code and not required for clients to support</span></span>
|
||||
<span class="line" id="L46"> teapot = <span class="tok-number">418</span>,</span>
|
||||
<span class="line" id="L47"> upgrade_required = <span class="tok-number">426</span>,</span>
|
||||
<span class="line" id="L48"> <span class="tok-comment">/// extra status code according to `https://tools.ietf.org/html/rfc6585#section-5`</span></span>
|
||||
<span class="line" id="L49"> request_header_fields_too_large = <span class="tok-number">431</span>,</span>
|
||||
<span class="line" id="L50"> <span class="tok-comment">// server errors 5xx</span>
|
||||
</span>
|
||||
<span class="line" id="L49"> internal_server_error = <span class="tok-number">500</span>,</span>
|
||||
<span class="line" id="L50"> not_implemented = <span class="tok-number">501</span>,</span>
|
||||
<span class="line" id="L51"> bad_gateway = <span class="tok-number">502</span>,</span>
|
||||
<span class="line" id="L52"> service_unavailable = <span class="tok-number">503</span>,</span>
|
||||
<span class="line" id="L53"> gateway_timeout = <span class="tok-number">504</span>,</span>
|
||||
<span class="line" id="L54"> http_version_not_supported = <span class="tok-number">505</span>,</span>
|
||||
<span class="line" id="L55"> _,</span>
|
||||
<span class="line" id="L56"></span>
|
||||
<span class="line" id="L57"> <span class="tok-comment">/// Returns the string value of a `StatusCode`</span></span>
|
||||
<span class="line" id="L58"> <span class="tok-comment">/// for example: .ResetContent returns "Returns Content".</span></span>
|
||||
<span class="line" id="L59"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">toString</span>(self: StatusCode) []<span class="tok-kw">const</span> <span class="tok-type">u8</span> {</span>
|
||||
<span class="line" id="L60"> <span class="tok-kw">return</span> <span class="tok-kw">switch</span> (self) {</span>
|
||||
<span class="line" id="L61"> .@"continue" => <span class="tok-str">"Continue"</span>,</span>
|
||||
<span class="line" id="L62"> .switching_protocols => <span class="tok-str">"Switching Protocols"</span>,</span>
|
||||
<span class="line" id="L63"> .ok => <span class="tok-str">"Ok"</span>,</span>
|
||||
<span class="line" id="L64"> .created => <span class="tok-str">"Created"</span>,</span>
|
||||
<span class="line" id="L65"> .accepted => <span class="tok-str">"Accepted"</span>,</span>
|
||||
<span class="line" id="L66"> .non_authoritative_information => <span class="tok-str">"Non Authoritative Information"</span>,</span>
|
||||
<span class="line" id="L67"> .no_content => <span class="tok-str">"No Content"</span>,</span>
|
||||
<span class="line" id="L68"> .reset_content => <span class="tok-str">"Reset Content"</span>,</span>
|
||||
<span class="line" id="L69"> .partial_content => <span class="tok-str">"Partial Content"</span>,</span>
|
||||
<span class="line" id="L70"> .multiple_choices => <span class="tok-str">"Multiple Choices"</span>,</span>
|
||||
<span class="line" id="L71"> .moved_permanently => <span class="tok-str">"Moved Permanently"</span>,</span>
|
||||
<span class="line" id="L72"> .found => <span class="tok-str">"Found"</span>,</span>
|
||||
<span class="line" id="L73"> .see_other => <span class="tok-str">"See Other"</span>,</span>
|
||||
<span class="line" id="L74"> .not_modified => <span class="tok-str">"Not Modified"</span>,</span>
|
||||
<span class="line" id="L75"> .use_proxy => <span class="tok-str">"Use Proxy"</span>,</span>
|
||||
<span class="line" id="L76"> .temporary_redirect => <span class="tok-str">"Temporary Redirect"</span>,</span>
|
||||
<span class="line" id="L77"> .bad_request => <span class="tok-str">"Bad Request"</span>,</span>
|
||||
<span class="line" id="L78"> .unauthorized => <span class="tok-str">"Unauthorized"</span>,</span>
|
||||
<span class="line" id="L79"> .payment_required => <span class="tok-str">"Payment Required"</span>,</span>
|
||||
<span class="line" id="L80"> .forbidden => <span class="tok-str">"Forbidden"</span>,</span>
|
||||
<span class="line" id="L81"> .not_found => <span class="tok-str">"Not Found"</span>,</span>
|
||||
<span class="line" id="L82"> .method_not_allowed => <span class="tok-str">"Method Not Allowed"</span>,</span>
|
||||
<span class="line" id="L83"> .not_acceptable => <span class="tok-str">"Not Acceptable"</span>,</span>
|
||||
<span class="line" id="L84"> .proxy_authentication_required => <span class="tok-str">"Proxy Authentication Required"</span>,</span>
|
||||
<span class="line" id="L85"> .request_timeout => <span class="tok-str">"Request Timeout"</span>,</span>
|
||||
<span class="line" id="L86"> .conflict => <span class="tok-str">"Conflict"</span>,</span>
|
||||
<span class="line" id="L87"> .gone => <span class="tok-str">"Gone"</span>,</span>
|
||||
<span class="line" id="L88"> .length_required => <span class="tok-str">"Length Required"</span>,</span>
|
||||
<span class="line" id="L89"> .precondition_failed => <span class="tok-str">"Precondition Failed"</span>,</span>
|
||||
<span class="line" id="L90"> .request_entity_too_large => <span class="tok-str">"Request Entity Too Large"</span>,</span>
|
||||
<span class="line" id="L91"> .request_uri_too_long => <span class="tok-str">"Request-URI Too Long"</span>,</span>
|
||||
<span class="line" id="L92"> .unsupported_mediatype => <span class="tok-str">"Unsupported Media Type"</span>,</span>
|
||||
<span class="line" id="L93"> .requested_range_not_satisfiable => <span class="tok-str">"Requested Range Not Satisfiable"</span>,</span>
|
||||
<span class="line" id="L94"> .teapot => <span class="tok-str">"I'm a Teapot"</span>,</span>
|
||||
<span class="line" id="L95"> .upgrade_required => <span class="tok-str">"Upgrade Required"</span>,</span>
|
||||
<span class="line" id="L96"> .request_header_fields_too_large => <span class="tok-str">"Request Header Fields Too Large"</span>,</span>
|
||||
<span class="line" id="L97"> .expectation_failed => <span class="tok-str">"Expectation Failed"</span>,</span>
|
||||
<span class="line" id="L98"> .internal_server_error => <span class="tok-str">"Internal Server Error"</span>,</span>
|
||||
<span class="line" id="L99"> .not_implemented => <span class="tok-str">"Not Implemented"</span>,</span>
|
||||
<span class="line" id="L100"> .bad_gateway => <span class="tok-str">"Bad Gateway"</span>,</span>
|
||||
<span class="line" id="L101"> .service_unavailable => <span class="tok-str">"Service Unavailable"</span>,</span>
|
||||
<span class="line" id="L102"> .gateway_timeout => <span class="tok-str">"Gateway Timeout"</span>,</span>
|
||||
<span class="line" id="L103"> .http_version_not_supported => <span class="tok-str">"HTTP Version Not Supported"</span>,</span>
|
||||
<span class="line" id="L104"> _ => <span class="tok-str">""</span>,</span>
|
||||
<span class="line" id="L105"> };</span>
|
||||
<span class="line" id="L106"> }</span>
|
||||
<span class="line" id="L107">};</span>
|
||||
<span class="line" id="L108"></span>
|
||||
<span class="line" id="L51"> internal_server_error = <span class="tok-number">500</span>,</span>
|
||||
<span class="line" id="L52"> not_implemented = <span class="tok-number">501</span>,</span>
|
||||
<span class="line" id="L53"> bad_gateway = <span class="tok-number">502</span>,</span>
|
||||
<span class="line" id="L54"> service_unavailable = <span class="tok-number">503</span>,</span>
|
||||
<span class="line" id="L55"> gateway_timeout = <span class="tok-number">504</span>,</span>
|
||||
<span class="line" id="L56"> http_version_not_supported = <span class="tok-number">505</span>,</span>
|
||||
<span class="line" id="L57"> _,</span>
|
||||
<span class="line" id="L58"></span>
|
||||
<span class="line" id="L59"> <span class="tok-comment">/// Returns the string value of a `StatusCode`</span></span>
|
||||
<span class="line" id="L60"> <span class="tok-comment">/// for example: .ResetContent returns "Returns Content".</span></span>
|
||||
<span class="line" id="L61"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">toString</span>(self: StatusCode) []<span class="tok-kw">const</span> <span class="tok-type">u8</span> {</span>
|
||||
<span class="line" id="L62"> <span class="tok-kw">return</span> <span class="tok-kw">switch</span> (self) {</span>
|
||||
<span class="line" id="L63"> .@"continue" => <span class="tok-str">"Continue"</span>,</span>
|
||||
<span class="line" id="L64"> .switching_protocols => <span class="tok-str">"Switching Protocols"</span>,</span>
|
||||
<span class="line" id="L65"> .ok => <span class="tok-str">"Ok"</span>,</span>
|
||||
<span class="line" id="L66"> .created => <span class="tok-str">"Created"</span>,</span>
|
||||
<span class="line" id="L67"> .accepted => <span class="tok-str">"Accepted"</span>,</span>
|
||||
<span class="line" id="L68"> .non_authoritative_information => <span class="tok-str">"Non Authoritative Information"</span>,</span>
|
||||
<span class="line" id="L69"> .no_content => <span class="tok-str">"No Content"</span>,</span>
|
||||
<span class="line" id="L70"> .reset_content => <span class="tok-str">"Reset Content"</span>,</span>
|
||||
<span class="line" id="L71"> .partial_content => <span class="tok-str">"Partial Content"</span>,</span>
|
||||
<span class="line" id="L72"> .multiple_choices => <span class="tok-str">"Multiple Choices"</span>,</span>
|
||||
<span class="line" id="L73"> .moved_permanently => <span class="tok-str">"Moved Permanently"</span>,</span>
|
||||
<span class="line" id="L74"> .found => <span class="tok-str">"Found"</span>,</span>
|
||||
<span class="line" id="L75"> .see_other => <span class="tok-str">"See Other"</span>,</span>
|
||||
<span class="line" id="L76"> .not_modified => <span class="tok-str">"Not Modified"</span>,</span>
|
||||
<span class="line" id="L77"> .use_proxy => <span class="tok-str">"Use Proxy"</span>,</span>
|
||||
<span class="line" id="L78"> .temporary_redirect => <span class="tok-str">"Temporary Redirect"</span>,</span>
|
||||
<span class="line" id="L79"> .bad_request => <span class="tok-str">"Bad Request"</span>,</span>
|
||||
<span class="line" id="L80"> .unauthorized => <span class="tok-str">"Unauthorized"</span>,</span>
|
||||
<span class="line" id="L81"> .payment_required => <span class="tok-str">"Payment Required"</span>,</span>
|
||||
<span class="line" id="L82"> .forbidden => <span class="tok-str">"Forbidden"</span>,</span>
|
||||
<span class="line" id="L83"> .not_found => <span class="tok-str">"Not Found"</span>,</span>
|
||||
<span class="line" id="L84"> .method_not_allowed => <span class="tok-str">"Method Not Allowed"</span>,</span>
|
||||
<span class="line" id="L85"> .not_acceptable => <span class="tok-str">"Not Acceptable"</span>,</span>
|
||||
<span class="line" id="L86"> .proxy_authentication_required => <span class="tok-str">"Proxy Authentication Required"</span>,</span>
|
||||
<span class="line" id="L87"> .request_timeout => <span class="tok-str">"Request Timeout"</span>,</span>
|
||||
<span class="line" id="L88"> .conflict => <span class="tok-str">"Conflict"</span>,</span>
|
||||
<span class="line" id="L89"> .gone => <span class="tok-str">"Gone"</span>,</span>
|
||||
<span class="line" id="L90"> .length_required => <span class="tok-str">"Length Required"</span>,</span>
|
||||
<span class="line" id="L91"> .precondition_failed => <span class="tok-str">"Precondition Failed"</span>,</span>
|
||||
<span class="line" id="L92"> .request_entity_too_large => <span class="tok-str">"Request Entity Too Large"</span>,</span>
|
||||
<span class="line" id="L93"> .request_uri_too_long => <span class="tok-str">"Request-URI Too Long"</span>,</span>
|
||||
<span class="line" id="L94"> .unsupported_mediatype => <span class="tok-str">"Unsupported Media Type"</span>,</span>
|
||||
<span class="line" id="L95"> .requested_range_not_satisfiable => <span class="tok-str">"Requested Range Not Satisfiable"</span>,</span>
|
||||
<span class="line" id="L96"> .teapot => <span class="tok-str">"I'm a Teapot"</span>,</span>
|
||||
<span class="line" id="L97"> .upgrade_required => <span class="tok-str">"Upgrade Required"</span>,</span>
|
||||
<span class="line" id="L98"> .request_header_fields_too_large => <span class="tok-str">"Request Header Fields Too Large"</span>,</span>
|
||||
<span class="line" id="L99"> .expectation_failed => <span class="tok-str">"Expectation Failed"</span>,</span>
|
||||
<span class="line" id="L100"> .internal_server_error => <span class="tok-str">"Internal Server Error"</span>,</span>
|
||||
<span class="line" id="L101"> .not_implemented => <span class="tok-str">"Not Implemented"</span>,</span>
|
||||
<span class="line" id="L102"> .bad_gateway => <span class="tok-str">"Bad Gateway"</span>,</span>
|
||||
<span class="line" id="L103"> .service_unavailable => <span class="tok-str">"Service Unavailable"</span>,</span>
|
||||
<span class="line" id="L104"> .gateway_timeout => <span class="tok-str">"Gateway Timeout"</span>,</span>
|
||||
<span class="line" id="L105"> .http_version_not_supported => <span class="tok-str">"HTTP Version Not Supported"</span>,</span>
|
||||
<span class="line" id="L106"> _ => <span class="tok-str">""</span>,</span>
|
||||
<span class="line" id="L107"> };</span>
|
||||
<span class="line" id="L108"> }</span>
|
||||
<span class="line" id="L109">};</span>
|
||||
<span class="line" id="L110"></span>
|
||||
<span class="line" id="L111"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> Method = <span class="tok-kw">enum</span> {</span>
|
||||
<span class="line" id="L112"> GET,</span>
|
||||
<span class="line" id="L113"> POST,</span>
|
||||
<span class="line" id="L114"> PUT,</span>
|
||||
<span class="line" id="L115"> DELETE,</span>
|
||||
<span class="line" id="L116"> PATCH,</span>
|
||||
<span class="line" id="L117"> OPTIONS,</span>
|
||||
<span class="line" id="L118"> UNKNOWN,</span>
|
||||
<span class="line" id="L119">};</span>
|
||||
<span class="line" id="L120"><span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">methodToEnum</span>(method: ?[]<span class="tok-kw">const</span> <span class="tok-type">u8</span>) Method {</span>
|
||||
<span class="line" id="L121"> {</span>
|
||||
<span class="line" id="L122"> <span class="tok-kw">if</span> (method) |m| {</span>
|
||||
<span class="line" id="L123"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"GET"</span>))</span>
|
||||
<span class="line" id="L124"> <span class="tok-kw">return</span> Method.GET;</span>
|
||||
<span class="line" id="L125"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"POST"</span>))</span>
|
||||
<span class="line" id="L126"> <span class="tok-kw">return</span> Method.POST;</span>
|
||||
<span class="line" id="L127"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"PUT"</span>))</span>
|
||||
<span class="line" id="L128"> <span class="tok-kw">return</span> Method.PUT;</span>
|
||||
<span class="line" id="L129"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"DELETE"</span>))</span>
|
||||
<span class="line" id="L130"> <span class="tok-kw">return</span> Method.DELETE;</span>
|
||||
<span class="line" id="L131"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"PATCH"</span>))</span>
|
||||
<span class="line" id="L132"> <span class="tok-kw">return</span> Method.PATCH;</span>
|
||||
<span class="line" id="L133"> <span class="tok-kw">if</span> (std.mem.eql(<span class="tok-type">u8</span>, m, <span class="tok-str">"OPTIONS"</span>))</span>
|
||||
<span class="line" id="L134"> <span class="tok-kw">return</span> Method.OPTIONS;</span>
|
||||
<span class="line" id="L135"> }</span>
|
||||
<span class="line" id="L136"> <span class="tok-kw">return</span> Method.UNKNOWN;</span>
|
||||
<span class="line" id="L137"> }</span>
|
||||
<span class="line" id="L138">}</span>
|
||||
<span class="line" id="L139"></span>
|
||||
</code></pre></body>
|
||||
</html>
|
File diff suppressed because it is too large
Load diff
179
docs/src/zap/router.zig.html
Normal file
179
docs/src/zap/router.zig.html
Normal file
|
@ -0,0 +1,179 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>router.zig - source view</title>
|
||||
<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAgklEQVR4AWMYWuD7EllJIM4G4g4g5oIJ/odhOJ8wToOxSTXgNxDHoeiBMfA4+wGShjyYOCkG/IGqWQziEzYAoUAeiF9D5U+DxEg14DRU7jWIT5IBIOdCxf+A+CQZAAoopEB7QJwBCBwHiip8UYmRdrAlDpIMgApwQZNnNii5Dq0MBgCxxycBnwEd+wAAAABJRU5ErkJggg==">
|
||||
<link rel="icon" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNTMgMTQwIj48ZyBmaWxsPSIjRjdBNDFEIj48Zz48cG9seWdvbiBwb2ludHM9IjQ2LDIyIDI4LDQ0IDE5LDMwIi8+PHBvbHlnb24gcG9pbnRzPSI0NiwyMiAzMywzMyAyOCw0NCAyMiw0NCAyMiw5NSAzMSw5NSAyMCwxMDAgMTIsMTE3IDAsMTE3IDAsMjIiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyIvPjxwb2x5Z29uIHBvaW50cz0iMzEsOTUgMTIsMTE3IDQsMTA2Ii8+PC9nPjxnPjxwb2x5Z29uIHBvaW50cz0iNTYsMjIgNjIsMzYgMzcsNDQiLz48cG9seWdvbiBwb2ludHM9IjU2LDIyIDExMSwyMiAxMTEsNDQgMzcsNDQgNTYsMzIiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyIvPjxwb2x5Z29uIHBvaW50cz0iMTE2LDk1IDk3LDExNyA5MCwxMDQiLz48cG9seWdvbiBwb2ludHM9IjExNiw5NSAxMDAsMTA0IDk3LDExNyA0MiwxMTcgNDIsOTUiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyIvPjxwb2x5Z29uIHBvaW50cz0iMTUwLDAgNTIsMTE3IDMsMTQwIDEwMSwyMiIvPjwvZz48Zz48cG9seWdvbiBwb2ludHM9IjE0MSwyMiAxNDAsNDAgMTIyLDQ1Ii8+PHBvbHlnb24gcG9pbnRzPSIxNTMsMjIgMTUzLDExNyAxMDYsMTE3IDEyMCwxMDUgMTI1LDk1IDEzMSw5NSAxMzEsNDUgMTIyLDQ1IDEzMiwzNiAxNDEsMjIiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyIvPjxwb2x5Z29uIHBvaW50cz0iMTI1LDk1IDEzMCwxMTAgMTA2LDExNyIvPjwvZz48L2c+PC9zdmc+">
|
||||
<style>
|
||||
body{
|
||||
font-family: system-ui, -apple-system, Roboto, "Segoe UI", sans-serif;
|
||||
margin: 0;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
pre > code {
|
||||
display: block;
|
||||
overflow: auto;
|
||||
line-height: normal;
|
||||
margin: 0em;
|
||||
}
|
||||
.tok-kw {
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
}
|
||||
.tok-str {
|
||||
color: #d14;
|
||||
}
|
||||
.tok-builtin {
|
||||
color: #005C7A;
|
||||
}
|
||||
.tok-comment {
|
||||
color: #545454;
|
||||
font-style: italic;
|
||||
}
|
||||
.tok-fn {
|
||||
color: #900;
|
||||
font-weight: bold;
|
||||
}
|
||||
.tok-null {
|
||||
color: #005C5C;
|
||||
}
|
||||
.tok-number {
|
||||
color: #005C5C;
|
||||
}
|
||||
.tok-type {
|
||||
color: #458;
|
||||
font-weight: bold;
|
||||
}
|
||||
pre {
|
||||
counter-reset: line;
|
||||
}
|
||||
pre .line:before {
|
||||
counter-increment: line;
|
||||
content: counter(line);
|
||||
display: inline-block;
|
||||
padding-right: 1em;
|
||||
width: 2em;
|
||||
text-align: right;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.line {
|
||||
width: 100%;
|
||||
display: inline-block;
|
||||
}
|
||||
.line:target {
|
||||
border-top: 1px solid #ccc;
|
||||
border-bottom: 1px solid #ccc;
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body{
|
||||
background:#222;
|
||||
color: #ccc;
|
||||
}
|
||||
pre > code {
|
||||
color: #ccc;
|
||||
background: #222;
|
||||
border: unset;
|
||||
}
|
||||
.line:target {
|
||||
border-top: 1px solid #444;
|
||||
border-bottom: 1px solid #444;
|
||||
background: #333;
|
||||
}
|
||||
.tok-kw {
|
||||
color: #eee;
|
||||
}
|
||||
.tok-str {
|
||||
color: #2e5;
|
||||
}
|
||||
.tok-builtin {
|
||||
color: #ff894c;
|
||||
}
|
||||
.tok-comment {
|
||||
color: #aa7;
|
||||
}
|
||||
.tok-fn {
|
||||
color: #B1A0F8;
|
||||
}
|
||||
.tok-null {
|
||||
color: #ff8080;
|
||||
}
|
||||
.tok-number {
|
||||
color: #ff8080;
|
||||
}
|
||||
.tok-type {
|
||||
color: #68f;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<pre><code><span class="line" id="L1"><span class="tok-kw">const</span> std = <span class="tok-builtin">@import</span>(<span class="tok-str">"std"</span>);</span>
|
||||
<span class="line" id="L2"><span class="tok-kw">const</span> zap = <span class="tok-builtin">@import</span>(<span class="tok-str">"zap.zig"</span>);</span>
|
||||
<span class="line" id="L3"></span>
|
||||
<span class="line" id="L4"><span class="tok-kw">const</span> Allocator = std.mem.Allocator;</span>
|
||||
<span class="line" id="L5"><span class="tok-kw">const</span> RouterError = <span class="tok-kw">error</span>{</span>
|
||||
<span class="line" id="L6"> AlreadyExists,</span>
|
||||
<span class="line" id="L7"> EmptyPath,</span>
|
||||
<span class="line" id="L8">};</span>
|
||||
<span class="line" id="L9"></span>
|
||||
<span class="line" id="L10"><span class="tok-kw">const</span> Self = <span class="tok-builtin">@This</span>();</span>
|
||||
<span class="line" id="L11"></span>
|
||||
<span class="line" id="L12"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> Options = <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L13"> not_found: ?zap.HttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L14">};</span>
|
||||
<span class="line" id="L15"></span>
|
||||
<span class="line" id="L16">routes: std.StringHashMap(zap.HttpRequestFn),</span>
|
||||
<span class="line" id="L17">not_found: ?zap.HttpRequestFn,</span>
|
||||
<span class="line" id="L18"></span>
|
||||
<span class="line" id="L19"><span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">init</span>(allocator: Allocator, options: Options) Self {</span>
|
||||
<span class="line" id="L20"> <span class="tok-kw">return</span> .{</span>
|
||||
<span class="line" id="L21"> .routes = std.StringHashMap(zap.HttpRequestFn).init(allocator),</span>
|
||||
<span class="line" id="L22"></span>
|
||||
<span class="line" id="L23"> .not_found = options.not_found,</span>
|
||||
<span class="line" id="L24"> };</span>
|
||||
<span class="line" id="L25">}</span>
|
||||
<span class="line" id="L26"></span>
|
||||
<span class="line" id="L27"><span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">deinit</span>(self: *Self) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L28"> self.routes.deinit();</span>
|
||||
<span class="line" id="L29">}</span>
|
||||
<span class="line" id="L30"></span>
|
||||
<span class="line" id="L31"><span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">handle_func</span>(self: *Self, path: []<span class="tok-kw">const</span> <span class="tok-type">u8</span>, h: zap.HttpRequestFn) !<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L32"> <span class="tok-kw">if</span> (path.len == <span class="tok-number">0</span>) {</span>
|
||||
<span class="line" id="L33"> <span class="tok-kw">return</span> RouterError.EmptyPath;</span>
|
||||
<span class="line" id="L34"> }</span>
|
||||
<span class="line" id="L35"></span>
|
||||
<span class="line" id="L36"> <span class="tok-kw">const</span> route = self.routes.get(path);</span>
|
||||
<span class="line" id="L37"></span>
|
||||
<span class="line" id="L38"> <span class="tok-kw">if</span> (route != <span class="tok-null">null</span>) {</span>
|
||||
<span class="line" id="L39"> <span class="tok-kw">return</span> RouterError.AlreadyExists;</span>
|
||||
<span class="line" id="L40"> }</span>
|
||||
<span class="line" id="L41"></span>
|
||||
<span class="line" id="L42"> <span class="tok-kw">try</span> self.routes.put(path, h);</span>
|
||||
<span class="line" id="L43">}</span>
|
||||
<span class="line" id="L44"></span>
|
||||
<span class="line" id="L45"><span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">serve</span>(self: *Self, r: zap.Request) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L46"> <span class="tok-kw">const</span> path = <span class="tok-kw">if</span> (r.path) |p| p <span class="tok-kw">else</span> <span class="tok-str">"/"</span>;</span>
|
||||
<span class="line" id="L47"></span>
|
||||
<span class="line" id="L48"> <span class="tok-kw">const</span> route = self.routes.get(path);</span>
|
||||
<span class="line" id="L49"></span>
|
||||
<span class="line" id="L50"> <span class="tok-kw">if</span> (route) |handler| {</span>
|
||||
<span class="line" id="L51"> handler(r);</span>
|
||||
<span class="line" id="L52"> } <span class="tok-kw">else</span> <span class="tok-kw">if</span> (self.not_found) |handler| {</span>
|
||||
<span class="line" id="L53"> <span class="tok-comment">// not found handler</span>
|
||||
</span>
|
||||
<span class="line" id="L54"> handler(r);</span>
|
||||
<span class="line" id="L55"> } <span class="tok-kw">else</span> {</span>
|
||||
<span class="line" id="L56"> <span class="tok-comment">// default 404 output</span>
|
||||
</span>
|
||||
<span class="line" id="L57"> r.setStatus(.not_found);</span>
|
||||
<span class="line" id="L58"> r.sendBody(<span class="tok-str">"404 Not Found"</span>) <span class="tok-kw">catch</span> <span class="tok-kw">return</span>;</span>
|
||||
<span class="line" id="L59"> }</span>
|
||||
<span class="line" id="L60">}</span>
|
||||
<span class="line" id="L61"></span>
|
||||
</code></pre></body>
|
||||
</html>
|
|
@ -328,223 +328,226 @@
|
|||
<span class="line" id="L207"> .path = util.fio2str(r.*.path),</span>
|
||||
<span class="line" id="L208"> .query = util.fio2str(r.*.query),</span>
|
||||
<span class="line" id="L209"> .body = util.fio2str(r.*.body),</span>
|
||||
<span class="line" id="L210"> .method = util.fio2str(r.*.method),</span>
|
||||
<span class="line" id="L211"> .h = r,</span>
|
||||
<span class="line" id="L212"> ._is_finished_request_global = <span class="tok-null">false</span>,</span>
|
||||
<span class="line" id="L213"> ._user_context = <span class="tok-null">undefined</span>,</span>
|
||||
<span class="line" id="L214"> };</span>
|
||||
<span class="line" id="L215"> req._is_finished = &req._is_finished_request_global;</span>
|
||||
<span class="line" id="L216"></span>
|
||||
<span class="line" id="L217"> <span class="tok-kw">var</span> user_context: Request.UserContext = .{};</span>
|
||||
<span class="line" id="L218"> req._user_context = &user_context;</span>
|
||||
<span class="line" id="L219"></span>
|
||||
<span class="line" id="L220"> req.markAsFinished(<span class="tok-null">false</span>);</span>
|
||||
<span class="line" id="L221"> std.debug.assert(l.settings.on_request != <span class="tok-null">null</span>);</span>
|
||||
<span class="line" id="L222"> <span class="tok-kw">if</span> (l.settings.on_request) |on_request| {</span>
|
||||
<span class="line" id="L223"> <span class="tok-comment">// l.settings.on_request.?(req);</span>
|
||||
<span class="line" id="L210"> .method = http.methodToEnum(util.fio2str(r.*.method)),</span>
|
||||
<span class="line" id="L211"> .method_str = util.fio2str(r.*.method),</span>
|
||||
<span class="line" id="L212"> .h = r,</span>
|
||||
<span class="line" id="L213"> ._is_finished_request_global = <span class="tok-null">false</span>,</span>
|
||||
<span class="line" id="L214"> ._user_context = <span class="tok-null">undefined</span>,</span>
|
||||
<span class="line" id="L215"> };</span>
|
||||
<span class="line" id="L216"> req._is_finished = &req._is_finished_request_global;</span>
|
||||
<span class="line" id="L217"></span>
|
||||
<span class="line" id="L218"> <span class="tok-kw">var</span> user_context: Request.UserContext = .{};</span>
|
||||
<span class="line" id="L219"> req._user_context = &user_context;</span>
|
||||
<span class="line" id="L220"></span>
|
||||
<span class="line" id="L221"> req.markAsFinished(<span class="tok-null">false</span>);</span>
|
||||
<span class="line" id="L222"> std.debug.assert(l.settings.on_request != <span class="tok-null">null</span>);</span>
|
||||
<span class="line" id="L223"> <span class="tok-kw">if</span> (l.settings.on_request) |on_request| {</span>
|
||||
<span class="line" id="L224"> <span class="tok-comment">// l.settings.on_request.?(req);</span>
|
||||
</span>
|
||||
<span class="line" id="L224"> on_request(req);</span>
|
||||
<span class="line" id="L225"> }</span>
|
||||
<span class="line" id="L226"> }</span>
|
||||
<span class="line" id="L227"> }</span>
|
||||
<span class="line" id="L228"></span>
|
||||
<span class="line" id="L229"> <span class="tok-comment">/// Used internally: the listener's facilio response callback</span></span>
|
||||
<span class="line" id="L230"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">theOneAndOnlyResponseCallBack</span>(r: [*c]fio.http_s) <span class="tok-kw">callconv</span>(.C) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L231"> <span class="tok-kw">if</span> (the_one_and_only_listener) |l| {</span>
|
||||
<span class="line" id="L232"> <span class="tok-kw">var</span> req: Request = .{</span>
|
||||
<span class="line" id="L233"> .path = util.fio2str(r.*.path),</span>
|
||||
<span class="line" id="L234"> .query = util.fio2str(r.*.query),</span>
|
||||
<span class="line" id="L235"> .body = util.fio2str(r.*.body),</span>
|
||||
<span class="line" id="L236"> .method = util.fio2str(r.*.method),</span>
|
||||
<span class="line" id="L237"> .h = r,</span>
|
||||
<span class="line" id="L238"> ._is_finished_request_global = <span class="tok-null">false</span>,</span>
|
||||
<span class="line" id="L239"> ._user_context = <span class="tok-null">undefined</span>,</span>
|
||||
<span class="line" id="L240"> };</span>
|
||||
<span class="line" id="L241"> req._is_finished = &req._is_finished_request_global;</span>
|
||||
<span class="line" id="L242"></span>
|
||||
<span class="line" id="L243"> <span class="tok-kw">var</span> user_context: Request.UserContext = .{};</span>
|
||||
<span class="line" id="L244"> req._user_context = &user_context;</span>
|
||||
<span class="line" id="L245"></span>
|
||||
<span class="line" id="L246"> l.settings.on_response.?(req);</span>
|
||||
<span class="line" id="L247"> }</span>
|
||||
<span class="line" id="L248"> }</span>
|
||||
<span class="line" id="L249"></span>
|
||||
<span class="line" id="L250"> <span class="tok-comment">/// Used internally: the listener's facilio upgrade callback</span></span>
|
||||
<span class="line" id="L251"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">theOneAndOnlyUpgradeCallBack</span>(r: [*c]fio.http_s, target: [*c]<span class="tok-type">u8</span>, target_len: <span class="tok-type">usize</span>) <span class="tok-kw">callconv</span>(.C) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L252"> <span class="tok-kw">if</span> (the_one_and_only_listener) |l| {</span>
|
||||
<span class="line" id="L253"> <span class="tok-kw">var</span> req: Request = .{</span>
|
||||
<span class="line" id="L254"> .path = util.fio2str(r.*.path),</span>
|
||||
<span class="line" id="L255"> .query = util.fio2str(r.*.query),</span>
|
||||
<span class="line" id="L256"> .body = util.fio2str(r.*.body),</span>
|
||||
<span class="line" id="L257"> .method = util.fio2str(r.*.method),</span>
|
||||
<span class="line" id="L258"> .h = r,</span>
|
||||
<span class="line" id="L259"> ._is_finished_request_global = <span class="tok-null">false</span>,</span>
|
||||
<span class="line" id="L260"> ._user_context = <span class="tok-null">undefined</span>,</span>
|
||||
<span class="line" id="L261"> };</span>
|
||||
<span class="line" id="L262"> <span class="tok-kw">const</span> zigtarget: []<span class="tok-type">u8</span> = target[<span class="tok-number">0</span>..target_len];</span>
|
||||
<span class="line" id="L263"> req._is_finished = &req._is_finished_request_global;</span>
|
||||
<span class="line" id="L264"></span>
|
||||
<span class="line" id="L265"> <span class="tok-kw">var</span> user_context: Request.UserContext = .{};</span>
|
||||
<span class="line" id="L266"> req._user_context = &user_context;</span>
|
||||
<span class="line" id="L225"> on_request(req);</span>
|
||||
<span class="line" id="L226"> }</span>
|
||||
<span class="line" id="L227"> }</span>
|
||||
<span class="line" id="L228"> }</span>
|
||||
<span class="line" id="L229"></span>
|
||||
<span class="line" id="L230"> <span class="tok-comment">/// Used internally: the listener's facilio response callback</span></span>
|
||||
<span class="line" id="L231"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">theOneAndOnlyResponseCallBack</span>(r: [*c]fio.http_s) <span class="tok-kw">callconv</span>(.C) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L232"> <span class="tok-kw">if</span> (the_one_and_only_listener) |l| {</span>
|
||||
<span class="line" id="L233"> <span class="tok-kw">var</span> req: Request = .{</span>
|
||||
<span class="line" id="L234"> .path = util.fio2str(r.*.path),</span>
|
||||
<span class="line" id="L235"> .query = util.fio2str(r.*.query),</span>
|
||||
<span class="line" id="L236"> .body = util.fio2str(r.*.body),</span>
|
||||
<span class="line" id="L237"> .method = http.methodToEnum(util.fio2str(r.*.method)),</span>
|
||||
<span class="line" id="L238"> .method_str = util.fio2str(r.*.method),</span>
|
||||
<span class="line" id="L239"> .h = r,</span>
|
||||
<span class="line" id="L240"> ._is_finished_request_global = <span class="tok-null">false</span>,</span>
|
||||
<span class="line" id="L241"> ._user_context = <span class="tok-null">undefined</span>,</span>
|
||||
<span class="line" id="L242"> };</span>
|
||||
<span class="line" id="L243"> req._is_finished = &req._is_finished_request_global;</span>
|
||||
<span class="line" id="L244"></span>
|
||||
<span class="line" id="L245"> <span class="tok-kw">var</span> user_context: Request.UserContext = .{};</span>
|
||||
<span class="line" id="L246"> req._user_context = &user_context;</span>
|
||||
<span class="line" id="L247"></span>
|
||||
<span class="line" id="L248"> l.settings.on_response.?(req);</span>
|
||||
<span class="line" id="L249"> }</span>
|
||||
<span class="line" id="L250"> }</span>
|
||||
<span class="line" id="L251"></span>
|
||||
<span class="line" id="L252"> <span class="tok-comment">/// Used internally: the listener's facilio upgrade callback</span></span>
|
||||
<span class="line" id="L253"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">theOneAndOnlyUpgradeCallBack</span>(r: [*c]fio.http_s, target: [*c]<span class="tok-type">u8</span>, target_len: <span class="tok-type">usize</span>) <span class="tok-kw">callconv</span>(.C) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L254"> <span class="tok-kw">if</span> (the_one_and_only_listener) |l| {</span>
|
||||
<span class="line" id="L255"> <span class="tok-kw">var</span> req: Request = .{</span>
|
||||
<span class="line" id="L256"> .path = util.fio2str(r.*.path),</span>
|
||||
<span class="line" id="L257"> .query = util.fio2str(r.*.query),</span>
|
||||
<span class="line" id="L258"> .body = util.fio2str(r.*.body),</span>
|
||||
<span class="line" id="L259"> .method = http.methodToEnum(util.fio2str(r.*.method)),</span>
|
||||
<span class="line" id="L260"> .method_str = util.fio2str(r.*.method),</span>
|
||||
<span class="line" id="L261"> .h = r,</span>
|
||||
<span class="line" id="L262"> ._is_finished_request_global = <span class="tok-null">false</span>,</span>
|
||||
<span class="line" id="L263"> ._user_context = <span class="tok-null">undefined</span>,</span>
|
||||
<span class="line" id="L264"> };</span>
|
||||
<span class="line" id="L265"> <span class="tok-kw">const</span> zigtarget: []<span class="tok-type">u8</span> = target[<span class="tok-number">0</span>..target_len];</span>
|
||||
<span class="line" id="L266"> req._is_finished = &req._is_finished_request_global;</span>
|
||||
<span class="line" id="L267"></span>
|
||||
<span class="line" id="L268"> l.settings.on_upgrade.?(req, zigtarget);</span>
|
||||
<span class="line" id="L269"> }</span>
|
||||
<span class="line" id="L270"> }</span>
|
||||
<span class="line" id="L271"></span>
|
||||
<span class="line" id="L272"> <span class="tok-comment">/// Used internally: the listener's facilio finish callback</span></span>
|
||||
<span class="line" id="L273"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">theOneAndOnlyFinishCallBack</span>(s: [*c]fio.struct_http_settings_s) <span class="tok-kw">callconv</span>(.C) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L274"> <span class="tok-kw">if</span> (the_one_and_only_listener) |l| {</span>
|
||||
<span class="line" id="L275"> l.settings.on_finish.?(s);</span>
|
||||
<span class="line" id="L276"> }</span>
|
||||
<span class="line" id="L277"> }</span>
|
||||
<span class="line" id="L278"></span>
|
||||
<span class="line" id="L279"> <span class="tok-comment">/// Start listening</span></span>
|
||||
<span class="line" id="L280"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">listen</span>(self: *Self) !<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L281"> <span class="tok-kw">var</span> pfolder: [*c]<span class="tok-kw">const</span> <span class="tok-type">u8</span> = <span class="tok-null">null</span>;</span>
|
||||
<span class="line" id="L282"> <span class="tok-kw">var</span> pfolder_len: <span class="tok-type">usize</span> = <span class="tok-number">0</span>;</span>
|
||||
<span class="line" id="L283"></span>
|
||||
<span class="line" id="L284"> <span class="tok-kw">if</span> (self.settings.public_folder) |pf| {</span>
|
||||
<span class="line" id="L285"> debug(<span class="tok-str">"HttpListener.listen(): public folder is {s}\n"</span>, .{pf});</span>
|
||||
<span class="line" id="L286"> pfolder_len = pf.len;</span>
|
||||
<span class="line" id="L287"> pfolder = pf.ptr;</span>
|
||||
<span class="line" id="L288"> }</span>
|
||||
<span class="line" id="L289"></span>
|
||||
<span class="line" id="L290"> <span class="tok-kw">const</span> x: fio.http_settings_s = .{</span>
|
||||
<span class="line" id="L291"> .on_request = <span class="tok-kw">if</span> (self.settings.on_request) |_| Self.theOneAndOnlyRequestCallBack <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L292"> .on_upgrade = <span class="tok-kw">if</span> (self.settings.on_upgrade) |_| Self.theOneAndOnlyUpgradeCallBack <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L293"> .on_response = <span class="tok-kw">if</span> (self.settings.on_response) |_| Self.theOneAndOnlyResponseCallBack <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L294"> .on_finish = <span class="tok-kw">if</span> (self.settings.on_finish) |_| Self.theOneAndOnlyFinishCallBack <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L295"> .udata = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L296"> .public_folder = pfolder,</span>
|
||||
<span class="line" id="L297"> .public_folder_length = pfolder_len,</span>
|
||||
<span class="line" id="L298"> .max_header_size = <span class="tok-number">32</span> * <span class="tok-number">1024</span>,</span>
|
||||
<span class="line" id="L299"> .max_body_size = self.settings.max_body_size <span class="tok-kw">orelse</span> <span class="tok-number">50</span> * <span class="tok-number">1024</span> * <span class="tok-number">1024</span>,</span>
|
||||
<span class="line" id="L300"> <span class="tok-comment">// fio provides good default:</span>
|
||||
<span class="line" id="L268"> <span class="tok-kw">var</span> user_context: Request.UserContext = .{};</span>
|
||||
<span class="line" id="L269"> req._user_context = &user_context;</span>
|
||||
<span class="line" id="L270"></span>
|
||||
<span class="line" id="L271"> l.settings.on_upgrade.?(req, zigtarget);</span>
|
||||
<span class="line" id="L272"> }</span>
|
||||
<span class="line" id="L273"> }</span>
|
||||
<span class="line" id="L274"></span>
|
||||
<span class="line" id="L275"> <span class="tok-comment">/// Used internally: the listener's facilio finish callback</span></span>
|
||||
<span class="line" id="L276"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">theOneAndOnlyFinishCallBack</span>(s: [*c]fio.struct_http_settings_s) <span class="tok-kw">callconv</span>(.C) <span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L277"> <span class="tok-kw">if</span> (the_one_and_only_listener) |l| {</span>
|
||||
<span class="line" id="L278"> l.settings.on_finish.?(s);</span>
|
||||
<span class="line" id="L279"> }</span>
|
||||
<span class="line" id="L280"> }</span>
|
||||
<span class="line" id="L281"></span>
|
||||
<span class="line" id="L282"> <span class="tok-comment">/// Start listening</span></span>
|
||||
<span class="line" id="L283"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">listen</span>(self: *Self) !<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L284"> <span class="tok-kw">var</span> pfolder: [*c]<span class="tok-kw">const</span> <span class="tok-type">u8</span> = <span class="tok-null">null</span>;</span>
|
||||
<span class="line" id="L285"> <span class="tok-kw">var</span> pfolder_len: <span class="tok-type">usize</span> = <span class="tok-number">0</span>;</span>
|
||||
<span class="line" id="L286"></span>
|
||||
<span class="line" id="L287"> <span class="tok-kw">if</span> (self.settings.public_folder) |pf| {</span>
|
||||
<span class="line" id="L288"> debug(<span class="tok-str">"HttpListener.listen(): public folder is {s}\n"</span>, .{pf});</span>
|
||||
<span class="line" id="L289"> pfolder_len = pf.len;</span>
|
||||
<span class="line" id="L290"> pfolder = pf.ptr;</span>
|
||||
<span class="line" id="L291"> }</span>
|
||||
<span class="line" id="L292"></span>
|
||||
<span class="line" id="L293"> <span class="tok-kw">const</span> x: fio.http_settings_s = .{</span>
|
||||
<span class="line" id="L294"> .on_request = <span class="tok-kw">if</span> (self.settings.on_request) |_| Self.theOneAndOnlyRequestCallBack <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L295"> .on_upgrade = <span class="tok-kw">if</span> (self.settings.on_upgrade) |_| Self.theOneAndOnlyUpgradeCallBack <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L296"> .on_response = <span class="tok-kw">if</span> (self.settings.on_response) |_| Self.theOneAndOnlyResponseCallBack <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L297"> .on_finish = <span class="tok-kw">if</span> (self.settings.on_finish) |_| Self.theOneAndOnlyFinishCallBack <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L298"> .udata = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L299"> .public_folder = pfolder,</span>
|
||||
<span class="line" id="L300"> .public_folder_length = pfolder_len,</span>
|
||||
<span class="line" id="L301"> .max_header_size = <span class="tok-number">32</span> * <span class="tok-number">1024</span>,</span>
|
||||
<span class="line" id="L302"> .max_body_size = self.settings.max_body_size <span class="tok-kw">orelse</span> <span class="tok-number">50</span> * <span class="tok-number">1024</span> * <span class="tok-number">1024</span>,</span>
|
||||
<span class="line" id="L303"> <span class="tok-comment">// fio provides good default:</span>
|
||||
</span>
|
||||
<span class="line" id="L301"> .max_clients = self.settings.max_clients <span class="tok-kw">orelse</span> <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L302"> .tls = <span class="tok-kw">if</span> (self.settings.tls) |tls| tls.fio_tls <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L303"> .reserved1 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L304"> .reserved2 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L305"> .reserved3 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L306"> .ws_max_msg_size = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L307"> .timeout = self.settings.timeout <span class="tok-kw">orelse</span> <span class="tok-number">5</span>,</span>
|
||||
<span class="line" id="L308"> .ws_timeout = self.settings.ws_timeout,</span>
|
||||
<span class="line" id="L309"> .log = <span class="tok-kw">if</span> (self.settings.log) <span class="tok-number">1</span> <span class="tok-kw">else</span> <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L310"> .is_client = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L311"> };</span>
|
||||
<span class="line" id="L312"> <span class="tok-comment">// TODO: BUG: without this print/sleep statement, -Drelease* loop forever</span>
|
||||
<span class="line" id="L304"> .max_clients = self.settings.max_clients <span class="tok-kw">orelse</span> <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L305"> .tls = <span class="tok-kw">if</span> (self.settings.tls) |tls| tls.fio_tls <span class="tok-kw">else</span> <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L306"> .reserved1 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L307"> .reserved2 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L308"> .reserved3 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L309"> .ws_max_msg_size = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L310"> .timeout = self.settings.timeout <span class="tok-kw">orelse</span> <span class="tok-number">5</span>,</span>
|
||||
<span class="line" id="L311"> .ws_timeout = self.settings.ws_timeout,</span>
|
||||
<span class="line" id="L312"> .log = <span class="tok-kw">if</span> (self.settings.log) <span class="tok-number">1</span> <span class="tok-kw">else</span> <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L313"> .is_client = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L314"> };</span>
|
||||
<span class="line" id="L315"> <span class="tok-comment">// TODO: BUG: without this print/sleep statement, -Drelease* loop forever</span>
|
||||
</span>
|
||||
<span class="line" id="L313"> <span class="tok-comment">// in debug2 and debug3 of hello example</span>
|
||||
<span class="line" id="L316"> <span class="tok-comment">// in debug2 and debug3 of hello example</span>
|
||||
</span>
|
||||
<span class="line" id="L314"> <span class="tok-comment">// std.debug.print("X\n", .{});</span>
|
||||
<span class="line" id="L317"> <span class="tok-comment">// std.debug.print("X\n", .{});</span>
|
||||
</span>
|
||||
<span class="line" id="L315"> <span class="tok-comment">// TODO: still happening?</span>
|
||||
<span class="line" id="L318"> <span class="tok-comment">// TODO: still happening?</span>
|
||||
</span>
|
||||
<span class="line" id="L316"> std.time.sleep(<span class="tok-number">500</span> * std.time.ns_per_ms);</span>
|
||||
<span class="line" id="L317"></span>
|
||||
<span class="line" id="L318"> <span class="tok-kw">var</span> portbuf: [<span class="tok-number">100</span>]<span class="tok-type">u8</span> = <span class="tok-null">undefined</span>;</span>
|
||||
<span class="line" id="L319"> <span class="tok-kw">const</span> printed_port = <span class="tok-kw">try</span> std.fmt.bufPrintZ(&portbuf, <span class="tok-str">"{d}"</span>, .{self.settings.port});</span>
|
||||
<span class="line" id="L319"> std.time.sleep(<span class="tok-number">500</span> * std.time.ns_per_ms);</span>
|
||||
<span class="line" id="L320"></span>
|
||||
<span class="line" id="L321"> <span class="tok-kw">const</span> ret = fio.http_listen(printed_port.ptr, self.settings.interface, x);</span>
|
||||
<span class="line" id="L322"> <span class="tok-kw">if</span> (ret == -<span class="tok-number">1</span>) {</span>
|
||||
<span class="line" id="L323"> <span class="tok-kw">return</span> <span class="tok-kw">error</span>.ListenError;</span>
|
||||
<span class="line" id="L324"> }</span>
|
||||
<span class="line" id="L325"></span>
|
||||
<span class="line" id="L326"> <span class="tok-comment">// set ourselves up to handle requests:</span>
|
||||
<span class="line" id="L321"> <span class="tok-kw">var</span> portbuf: [<span class="tok-number">100</span>]<span class="tok-type">u8</span> = <span class="tok-null">undefined</span>;</span>
|
||||
<span class="line" id="L322"> <span class="tok-kw">const</span> printed_port = <span class="tok-kw">try</span> std.fmt.bufPrintZ(&portbuf, <span class="tok-str">"{d}"</span>, .{self.settings.port});</span>
|
||||
<span class="line" id="L323"></span>
|
||||
<span class="line" id="L324"> <span class="tok-kw">const</span> ret = fio.http_listen(printed_port.ptr, self.settings.interface, x);</span>
|
||||
<span class="line" id="L325"> <span class="tok-kw">if</span> (ret == -<span class="tok-number">1</span>) {</span>
|
||||
<span class="line" id="L326"> <span class="tok-kw">return</span> <span class="tok-kw">error</span>.ListenError;</span>
|
||||
<span class="line" id="L327"> }</span>
|
||||
<span class="line" id="L328"></span>
|
||||
<span class="line" id="L329"> <span class="tok-comment">// set ourselves up to handle requests:</span>
|
||||
</span>
|
||||
<span class="line" id="L327"> <span class="tok-comment">// TODO: do we mind the race condition?</span>
|
||||
<span class="line" id="L330"> <span class="tok-comment">// TODO: do we mind the race condition?</span>
|
||||
</span>
|
||||
<span class="line" id="L328"> <span class="tok-comment">// the HttpRequestFn will check if this is null and not process</span>
|
||||
<span class="line" id="L331"> <span class="tok-comment">// the HttpRequestFn will check if this is null and not process</span>
|
||||
</span>
|
||||
<span class="line" id="L329"> <span class="tok-comment">// the request if it isn't set. hence, if started under full load, the</span>
|
||||
<span class="line" id="L332"> <span class="tok-comment">// the request if it isn't set. hence, if started under full load, the</span>
|
||||
</span>
|
||||
<span class="line" id="L330"> <span class="tok-comment">// first request(s) might not be serviced, as long as it takes from</span>
|
||||
<span class="line" id="L333"> <span class="tok-comment">// first request(s) might not be serviced, as long as it takes from</span>
|
||||
</span>
|
||||
<span class="line" id="L331"> <span class="tok-comment">// fio.http_listen() to here</span>
|
||||
<span class="line" id="L334"> <span class="tok-comment">// fio.http_listen() to here</span>
|
||||
</span>
|
||||
<span class="line" id="L332"> Self.the_one_and_only_listener = self;</span>
|
||||
<span class="line" id="L333"> }</span>
|
||||
<span class="line" id="L334">};</span>
|
||||
<span class="line" id="L335"></span>
|
||||
<span class="line" id="L336"><span class="tok-comment">/// Low-level API</span></span>
|
||||
<span class="line" id="L337"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> LowLevel = <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L338"> <span class="tok-comment">/// lower level listening, if you don't want to use a listener but rather use</span></span>
|
||||
<span class="line" id="L339"> <span class="tok-comment">/// the listen() function.</span></span>
|
||||
<span class="line" id="L340"> <span class="tok-kw">pub</span> <span class="tok-kw">const</span> ListenSettings = <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L341"> on_request: ?FioHttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L342"> on_upgrade: ?FioHttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L343"> on_response: ?FioHttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L344"> on_finish: ?FioHttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L345"> public_folder: ?[]<span class="tok-kw">const</span> <span class="tok-type">u8</span> = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L346"> max_header_size: <span class="tok-type">usize</span> = <span class="tok-number">32</span> * <span class="tok-number">1024</span>,</span>
|
||||
<span class="line" id="L347"> max_body_size: <span class="tok-type">usize</span> = <span class="tok-number">50</span> * <span class="tok-number">1024</span> * <span class="tok-number">1024</span>,</span>
|
||||
<span class="line" id="L348"> max_clients: <span class="tok-type">isize</span> = <span class="tok-number">100</span>,</span>
|
||||
<span class="line" id="L349"> keepalive_timeout_s: <span class="tok-type">u8</span> = <span class="tok-number">5</span>,</span>
|
||||
<span class="line" id="L350"> log: <span class="tok-type">bool</span> = <span class="tok-null">false</span>,</span>
|
||||
<span class="line" id="L351"></span>
|
||||
<span class="line" id="L352"> <span class="tok-kw">const</span> Self = <span class="tok-builtin">@This</span>();</span>
|
||||
<span class="line" id="L353"></span>
|
||||
<span class="line" id="L354"> <span class="tok-comment">/// Create settings with defaults</span></span>
|
||||
<span class="line" id="L355"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">init</span>() Self {</span>
|
||||
<span class="line" id="L356"> <span class="tok-kw">return</span> .{};</span>
|
||||
<span class="line" id="L357"> }</span>
|
||||
<span class="line" id="L358"> };</span>
|
||||
<span class="line" id="L359"></span>
|
||||
<span class="line" id="L360"> <span class="tok-comment">/// Low level listen function</span></span>
|
||||
<span class="line" id="L361"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">listen</span>(port: [*c]<span class="tok-kw">const</span> <span class="tok-type">u8</span>, interface: [*c]<span class="tok-kw">const</span> <span class="tok-type">u8</span>, settings: ListenSettings) ListenError!<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L362"> <span class="tok-kw">var</span> pfolder: [*c]<span class="tok-kw">const</span> <span class="tok-type">u8</span> = <span class="tok-null">null</span>;</span>
|
||||
<span class="line" id="L363"> <span class="tok-kw">var</span> pfolder_len: <span class="tok-type">usize</span> = <span class="tok-number">0</span>;</span>
|
||||
<span class="line" id="L364"></span>
|
||||
<span class="line" id="L365"> <span class="tok-kw">if</span> (settings.public_folder) |pf| {</span>
|
||||
<span class="line" id="L366"> pfolder_len = pf.len;</span>
|
||||
<span class="line" id="L367"> pfolder = pf.ptr;</span>
|
||||
<span class="line" id="L368"> }</span>
|
||||
<span class="line" id="L369"> <span class="tok-kw">const</span> x: fio.http_settings_s = .{</span>
|
||||
<span class="line" id="L370"> .on_request = settings.on_request,</span>
|
||||
<span class="line" id="L371"> .on_upgrade = settings.on_upgrade,</span>
|
||||
<span class="line" id="L372"> .on_response = settings.on_response,</span>
|
||||
<span class="line" id="L373"> .on_finish = settings.on_finish,</span>
|
||||
<span class="line" id="L374"> .udata = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L375"> .public_folder = pfolder,</span>
|
||||
<span class="line" id="L376"> .public_folder_length = pfolder_len,</span>
|
||||
<span class="line" id="L377"> .max_header_size = settings.max_header_size,</span>
|
||||
<span class="line" id="L378"> .max_body_size = settings.max_body_size,</span>
|
||||
<span class="line" id="L379"> .max_clients = settings.max_clients,</span>
|
||||
<span class="line" id="L380"> .tls = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L381"> .reserved1 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L382"> .reserved2 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L383"> .reserved3 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L384"> .ws_max_msg_size = settings.ws_max_msg_size,</span>
|
||||
<span class="line" id="L385"> .timeout = settings.keepalive_timeout_s,</span>
|
||||
<span class="line" id="L386"> .ws_timeout = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L387"> .log = <span class="tok-kw">if</span> (settings.log) <span class="tok-number">1</span> <span class="tok-kw">else</span> <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L388"> .is_client = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L389"> };</span>
|
||||
<span class="line" id="L390"> <span class="tok-comment">// TODO: BUG: without this print/sleep statement, -Drelease* loop forever</span>
|
||||
<span class="line" id="L335"> Self.the_one_and_only_listener = self;</span>
|
||||
<span class="line" id="L336"> }</span>
|
||||
<span class="line" id="L337">};</span>
|
||||
<span class="line" id="L338"></span>
|
||||
<span class="line" id="L339"><span class="tok-comment">/// Low-level API</span></span>
|
||||
<span class="line" id="L340"><span class="tok-kw">pub</span> <span class="tok-kw">const</span> LowLevel = <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L341"> <span class="tok-comment">/// lower level listening, if you don't want to use a listener but rather use</span></span>
|
||||
<span class="line" id="L342"> <span class="tok-comment">/// the listen() function.</span></span>
|
||||
<span class="line" id="L343"> <span class="tok-kw">pub</span> <span class="tok-kw">const</span> ListenSettings = <span class="tok-kw">struct</span> {</span>
|
||||
<span class="line" id="L344"> on_request: ?FioHttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L345"> on_upgrade: ?FioHttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L346"> on_response: ?FioHttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L347"> on_finish: ?FioHttpRequestFn = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L348"> public_folder: ?[]<span class="tok-kw">const</span> <span class="tok-type">u8</span> = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L349"> max_header_size: <span class="tok-type">usize</span> = <span class="tok-number">32</span> * <span class="tok-number">1024</span>,</span>
|
||||
<span class="line" id="L350"> max_body_size: <span class="tok-type">usize</span> = <span class="tok-number">50</span> * <span class="tok-number">1024</span> * <span class="tok-number">1024</span>,</span>
|
||||
<span class="line" id="L351"> max_clients: <span class="tok-type">isize</span> = <span class="tok-number">100</span>,</span>
|
||||
<span class="line" id="L352"> keepalive_timeout_s: <span class="tok-type">u8</span> = <span class="tok-number">5</span>,</span>
|
||||
<span class="line" id="L353"> log: <span class="tok-type">bool</span> = <span class="tok-null">false</span>,</span>
|
||||
<span class="line" id="L354"></span>
|
||||
<span class="line" id="L355"> <span class="tok-kw">const</span> Self = <span class="tok-builtin">@This</span>();</span>
|
||||
<span class="line" id="L356"></span>
|
||||
<span class="line" id="L357"> <span class="tok-comment">/// Create settings with defaults</span></span>
|
||||
<span class="line" id="L358"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">init</span>() Self {</span>
|
||||
<span class="line" id="L359"> <span class="tok-kw">return</span> .{};</span>
|
||||
<span class="line" id="L360"> }</span>
|
||||
<span class="line" id="L361"> };</span>
|
||||
<span class="line" id="L362"></span>
|
||||
<span class="line" id="L363"> <span class="tok-comment">/// Low level listen function</span></span>
|
||||
<span class="line" id="L364"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">listen</span>(port: [*c]<span class="tok-kw">const</span> <span class="tok-type">u8</span>, interface: [*c]<span class="tok-kw">const</span> <span class="tok-type">u8</span>, settings: ListenSettings) ListenError!<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L365"> <span class="tok-kw">var</span> pfolder: [*c]<span class="tok-kw">const</span> <span class="tok-type">u8</span> = <span class="tok-null">null</span>;</span>
|
||||
<span class="line" id="L366"> <span class="tok-kw">var</span> pfolder_len: <span class="tok-type">usize</span> = <span class="tok-number">0</span>;</span>
|
||||
<span class="line" id="L367"></span>
|
||||
<span class="line" id="L368"> <span class="tok-kw">if</span> (settings.public_folder) |pf| {</span>
|
||||
<span class="line" id="L369"> pfolder_len = pf.len;</span>
|
||||
<span class="line" id="L370"> pfolder = pf.ptr;</span>
|
||||
<span class="line" id="L371"> }</span>
|
||||
<span class="line" id="L372"> <span class="tok-kw">const</span> x: fio.http_settings_s = .{</span>
|
||||
<span class="line" id="L373"> .on_request = settings.on_request,</span>
|
||||
<span class="line" id="L374"> .on_upgrade = settings.on_upgrade,</span>
|
||||
<span class="line" id="L375"> .on_response = settings.on_response,</span>
|
||||
<span class="line" id="L376"> .on_finish = settings.on_finish,</span>
|
||||
<span class="line" id="L377"> .udata = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L378"> .public_folder = pfolder,</span>
|
||||
<span class="line" id="L379"> .public_folder_length = pfolder_len,</span>
|
||||
<span class="line" id="L380"> .max_header_size = settings.max_header_size,</span>
|
||||
<span class="line" id="L381"> .max_body_size = settings.max_body_size,</span>
|
||||
<span class="line" id="L382"> .max_clients = settings.max_clients,</span>
|
||||
<span class="line" id="L383"> .tls = <span class="tok-null">null</span>,</span>
|
||||
<span class="line" id="L384"> .reserved1 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L385"> .reserved2 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L386"> .reserved3 = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L387"> .ws_max_msg_size = settings.ws_max_msg_size,</span>
|
||||
<span class="line" id="L388"> .timeout = settings.keepalive_timeout_s,</span>
|
||||
<span class="line" id="L389"> .ws_timeout = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L390"> .log = <span class="tok-kw">if</span> (settings.log) <span class="tok-number">1</span> <span class="tok-kw">else</span> <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L391"> .is_client = <span class="tok-number">0</span>,</span>
|
||||
<span class="line" id="L392"> };</span>
|
||||
<span class="line" id="L393"> <span class="tok-comment">// TODO: BUG: without this print/sleep statement, -Drelease* loop forever</span>
|
||||
</span>
|
||||
<span class="line" id="L391"> <span class="tok-comment">// in debug2 and debug3 of hello example</span>
|
||||
<span class="line" id="L394"> <span class="tok-comment">// in debug2 and debug3 of hello example</span>
|
||||
</span>
|
||||
<span class="line" id="L392"> <span class="tok-comment">// std.debug.print("X\n", .{});</span>
|
||||
<span class="line" id="L395"> <span class="tok-comment">// std.debug.print("X\n", .{});</span>
|
||||
</span>
|
||||
<span class="line" id="L393"> <span class="tok-comment">// TODO: still happening?</span>
|
||||
<span class="line" id="L396"> <span class="tok-comment">// TODO: still happening?</span>
|
||||
</span>
|
||||
<span class="line" id="L394"> std.time.sleep(<span class="tok-number">500</span> * std.time.ns_per_ms);</span>
|
||||
<span class="line" id="L395"></span>
|
||||
<span class="line" id="L396"> <span class="tok-kw">if</span> (fio.http_listen(port, interface, x) == -<span class="tok-number">1</span>) {</span>
|
||||
<span class="line" id="L397"> <span class="tok-kw">return</span> <span class="tok-kw">error</span>.ListenError;</span>
|
||||
<span class="line" id="L398"> }</span>
|
||||
<span class="line" id="L399"> }</span>
|
||||
<span class="line" id="L400"></span>
|
||||
<span class="line" id="L401"> <span class="tok-comment">/// lower level sendBody</span></span>
|
||||
<span class="line" id="L402"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">sendBody</span>(request: [*c]fio.http_s, body: []<span class="tok-kw">const</span> <span class="tok-type">u8</span>) HttpError!<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L403"> <span class="tok-kw">const</span> ret = fio.http_send_body(request, <span class="tok-builtin">@as</span>(</span>
|
||||
<span class="line" id="L404"> *<span class="tok-type">anyopaque</span>,</span>
|
||||
<span class="line" id="L405"> <span class="tok-builtin">@ptrFromInt</span>(<span class="tok-builtin">@intFromPtr</span>(body.ptr)),</span>
|
||||
<span class="line" id="L406"> ), body.len);</span>
|
||||
<span class="line" id="L407"> debug(<span class="tok-str">"sendBody(): ret = {}\n"</span>, .{ret});</span>
|
||||
<span class="line" id="L408"> <span class="tok-kw">if</span> (ret != -<span class="tok-number">1</span>) <span class="tok-kw">return</span> <span class="tok-kw">error</span>.HttpSendBody;</span>
|
||||
<span class="line" id="L409"> }</span>
|
||||
<span class="line" id="L410">};</span>
|
||||
<span class="line" id="L411"></span>
|
||||
<span class="line" id="L397"> std.time.sleep(<span class="tok-number">500</span> * std.time.ns_per_ms);</span>
|
||||
<span class="line" id="L398"></span>
|
||||
<span class="line" id="L399"> <span class="tok-kw">if</span> (fio.http_listen(port, interface, x) == -<span class="tok-number">1</span>) {</span>
|
||||
<span class="line" id="L400"> <span class="tok-kw">return</span> <span class="tok-kw">error</span>.ListenError;</span>
|
||||
<span class="line" id="L401"> }</span>
|
||||
<span class="line" id="L402"> }</span>
|
||||
<span class="line" id="L403"></span>
|
||||
<span class="line" id="L404"> <span class="tok-comment">/// lower level sendBody</span></span>
|
||||
<span class="line" id="L405"> <span class="tok-kw">pub</span> <span class="tok-kw">fn</span> <span class="tok-fn">sendBody</span>(request: [*c]fio.http_s, body: []<span class="tok-kw">const</span> <span class="tok-type">u8</span>) HttpError!<span class="tok-type">void</span> {</span>
|
||||
<span class="line" id="L406"> <span class="tok-kw">const</span> ret = fio.http_send_body(request, <span class="tok-builtin">@as</span>(</span>
|
||||
<span class="line" id="L407"> *<span class="tok-type">anyopaque</span>,</span>
|
||||
<span class="line" id="L408"> <span class="tok-builtin">@ptrFromInt</span>(<span class="tok-builtin">@intFromPtr</span>(body.ptr)),</span>
|
||||
<span class="line" id="L409"> ), body.len);</span>
|
||||
<span class="line" id="L410"> debug(<span class="tok-str">"sendBody(): ret = {}\n"</span>, .{ret});</span>
|
||||
<span class="line" id="L411"> <span class="tok-kw">if</span> (ret != -<span class="tok-number">1</span>) <span class="tok-kw">return</span> <span class="tok-kw">error</span>.HttpSendBody;</span>
|
||||
<span class="line" id="L412"> }</span>
|
||||
<span class="line" id="L413">};</span>
|
||||
<span class="line" id="L414"></span>
|
||||
</code></pre></body>
|
||||
</html>
|
Loading…
Add table
Reference in a new issue