rocket_cors/src/rocket_cors/fairing.rs.html

385 lines
30 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `src/fairing.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>fairing.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../rocket_cors/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form js-only"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="doccomment">//! Fairing implementation</span>
<span class="kw">use</span> ::<span class="ident">log</span>::{<span class="ident">error</span>, <span class="ident">info</span>, <span class="ident">log</span>};
<span class="kw">use</span> <span class="ident">rocket</span>::<span class="ident">http</span>::{<span class="self">self</span>, <span class="ident">uri</span>::<span class="ident">Origin</span>, <span class="ident">Status</span>};
<span class="kw">use</span> <span class="ident">rocket</span>::{<span class="self">self</span>, <span class="ident">error_</span>, <span class="ident">info_</span>, <span class="ident">log_</span>, <span class="ident">Outcome</span>, <span class="ident">Request</span>};
<span class="kw">use</span> <span class="kw">crate</span>::{
<span class="ident">actual_request_response</span>, <span class="ident">origin</span>, <span class="ident">preflight_response</span>, <span class="ident">request_headers</span>, <span class="ident">validate</span>, <span class="ident">Cors</span>, <span class="ident">Error</span>,
};
<span class="doccomment">/// Request Local State to store CORS validation results</span>
<span class="kw">enum</span> <span class="ident">CorsValidation</span> {
<span class="ident">Success</span>,
<span class="ident">Failure</span>,
}
<span class="doccomment">/// Route for Fairing error handling</span>
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">fairing_error_route</span><span class="op">&lt;</span><span class="lifetime">&#39;r</span><span class="op">&gt;</span>(
<span class="ident">request</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;r</span> <span class="ident">Request</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>,
<span class="kw">_</span>: <span class="ident">rocket</span>::<span class="ident">Data</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">rocket</span>::<span class="ident">handler</span>::<span class="ident">Outcome</span><span class="op">&lt;</span><span class="lifetime">&#39;r</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">status</span> <span class="op">=</span> <span class="ident">request</span>
.<span class="ident">get_param</span>::<span class="op">&lt;</span><span class="ident">u16</span><span class="op">&gt;</span>(<span class="number">0</span>)
.<span class="ident">unwrap_or</span>(<span class="prelude-val">Ok</span>(<span class="number">0</span>))
.<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
<span class="macro">error_</span><span class="macro">!</span>(<span class="string">&quot;Fairing Error Handling Route error: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="number">500</span>
});
<span class="kw">let</span> <span class="ident">status</span> <span class="op">=</span> <span class="ident">Status</span>::<span class="ident">from_code</span>(<span class="ident">status</span>).<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">Status</span>::<span class="ident">InternalServerError</span>);
<span class="ident">Outcome</span>::<span class="ident">Failure</span>(<span class="ident">status</span>)
}
<span class="doccomment">/// Create a new `Route` for Fairing handling</span>
<span class="kw">fn</span> <span class="ident">fairing_route</span>(<span class="ident">rank</span>: <span class="ident">isize</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">rocket</span>::<span class="ident">Route</span> {
<span class="ident">rocket</span>::<span class="ident">Route</span>::<span class="ident">ranked</span>(<span class="ident">rank</span>, <span class="ident">http</span>::<span class="ident">Method</span>::<span class="ident">Get</span>, <span class="string">&quot;/&lt;status&gt;&quot;</span>, <span class="ident">fairing_error_route</span>)
}
<span class="doccomment">/// Modifies a `Request` to route to Fairing error handler</span>
<span class="kw">fn</span> <span class="ident">route_to_fairing_error_handler</span>(<span class="ident">options</span>: <span class="kw-2">&amp;</span><span class="ident">Cors</span>, <span class="ident">status</span>: <span class="ident">u16</span>, <span class="ident">request</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Request</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>) {
<span class="kw">let</span> <span class="ident">origin</span> <span class="op">=</span> <span class="ident">Origin</span>::<span class="ident">parse_owned</span>(<span class="macro">format</span><span class="macro">!</span>(<span class="string">&quot;{}/{}&quot;</span>, <span class="ident">options</span>.<span class="ident">fairing_route_base</span>, <span class="ident">status</span>)).<span class="ident">unwrap</span>();
<span class="ident">request</span>.<span class="ident">set_method</span>(<span class="ident">http</span>::<span class="ident">Method</span>::<span class="ident">Get</span>);
<span class="ident">request</span>.<span class="ident">set_uri</span>(<span class="ident">origin</span>);
}
<span class="kw">fn</span> <span class="ident">on_response_wrapper</span>(
<span class="ident">options</span>: <span class="kw-2">&amp;</span><span class="ident">Cors</span>,
<span class="ident">request</span>: <span class="kw-2">&amp;</span><span class="ident">Request</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>,
<span class="ident">response</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">rocket</span>::<span class="ident">Response</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(), <span class="ident">Error</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">origin</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">origin</span>(<span class="ident">request</span>)<span class="question-mark">?</span> {
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// Not a CORS request</span>
<span class="kw">return</span> <span class="prelude-val">Ok</span>(());
}
<span class="prelude-val">Some</span>(<span class="ident">origin</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">origin</span>,
};
<span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">request</span>.<span class="ident">local_cache</span>(<span class="op">|</span><span class="op">|</span> <span class="macro">unreachable</span><span class="macro">!</span>(<span class="string">&quot;This should not be executed so late&quot;</span>));
<span class="kw">if</span> <span class="kw">let</span> <span class="ident">CorsValidation</span>::<span class="ident">Failure</span> <span class="op">=</span> <span class="kw-2">*</span><span class="ident">result</span> {
<span class="comment">// Nothing else for us to do</span>
<span class="kw">return</span> <span class="prelude-val">Ok</span>(());
}
<span class="kw">let</span> <span class="ident">origin</span> <span class="op">=</span> <span class="ident">origin</span>.<span class="ident">to_string</span>();
<span class="kw">let</span> <span class="ident">cors_response</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">request</span>.<span class="ident">method</span>() <span class="op">=</span><span class="op">=</span> <span class="ident">http</span>::<span class="ident">Method</span>::<span class="ident">Options</span> {
<span class="kw">let</span> <span class="ident">headers</span> <span class="op">=</span> <span class="ident">request_headers</span>(<span class="ident">request</span>)<span class="question-mark">?</span>;
<span class="ident">preflight_response</span>(<span class="ident">options</span>, <span class="kw-2">&amp;</span><span class="ident">origin</span>, <span class="ident">headers</span>.<span class="ident">as_ref</span>())
} <span class="kw">else</span> {
<span class="ident">actual_request_response</span>(<span class="ident">options</span>, <span class="kw-2">&amp;</span><span class="ident">origin</span>)
};
<span class="ident">cors_response</span>.<span class="ident">merge</span>(<span class="ident">response</span>);
<span class="comment">// If this was an OPTIONS request and no route can be found, we should turn this</span>
<span class="comment">// into a HTTP 204 with no content body.</span>
<span class="comment">// This allows the user to not have to specify an OPTIONS route for everything.</span>
<span class="comment">//</span>
<span class="comment">// TODO: Is there anyway we can make this smarter? Only modify status codes for</span>
<span class="comment">// requests where an actual route exist?</span>
<span class="kw">if</span> <span class="ident">request</span>.<span class="ident">method</span>() <span class="op">=</span><span class="op">=</span> <span class="ident">http</span>::<span class="ident">Method</span>::<span class="ident">Options</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">request</span>.<span class="ident">route</span>().<span class="ident">is_none</span>() {
<span class="macro">info_</span><span class="macro">!</span>(
<span class="string">&quot;CORS Fairing: Turned missing route {} into an OPTIONS pre-flight request&quot;</span>,
<span class="ident">request</span>
);
<span class="ident">response</span>.<span class="ident">set_status</span>(<span class="ident">Status</span>::<span class="ident">NoContent</span>);
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="ident">response</span>.<span class="ident">take_body</span>();
}
<span class="prelude-val">Ok</span>(())
}
<span class="kw">impl</span> <span class="ident">rocket</span>::<span class="ident">fairing</span>::<span class="ident">Fairing</span> <span class="kw">for</span> <span class="ident">Cors</span> {
<span class="kw">fn</span> <span class="ident">info</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">rocket</span>::<span class="ident">fairing</span>::<span class="ident">Info</span> {
<span class="ident">rocket</span>::<span class="ident">fairing</span>::<span class="ident">Info</span> {
<span class="ident">name</span>: <span class="string">&quot;CORS&quot;</span>,
<span class="ident">kind</span>: <span class="ident">rocket</span>::<span class="ident">fairing</span>::<span class="ident">Kind</span>::<span class="ident">Attach</span>
<span class="op">|</span> <span class="ident">rocket</span>::<span class="ident">fairing</span>::<span class="ident">Kind</span>::<span class="ident">Request</span>
<span class="op">|</span> <span class="ident">rocket</span>::<span class="ident">fairing</span>::<span class="ident">Kind</span>::<span class="ident">Response</span>,
}
}
<span class="kw">fn</span> <span class="ident">on_attach</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">rocket</span>: <span class="ident">rocket</span>::<span class="ident">Rocket</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">rocket</span>::<span class="ident">Rocket</span>, <span class="ident">rocket</span>::<span class="ident">Rocket</span><span class="op">&gt;</span> {
<span class="prelude-val">Ok</span>(<span class="ident">rocket</span>.<span class="ident">mount</span>(
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">fairing_route_base</span>,
<span class="macro">vec</span><span class="macro">!</span>[<span class="ident">fairing_route</span>(<span class="self">self</span>.<span class="ident">fairing_route_rank</span>)],
))
}
<span class="kw">fn</span> <span class="ident">on_request</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">request</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Request</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>, <span class="kw">_</span>: <span class="kw-2">&amp;</span><span class="ident">rocket</span>::<span class="ident">Data</span>) {
<span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">validate</span>(<span class="self">self</span>, <span class="ident">request</span>) {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">CorsValidation</span>::<span class="ident">Success</span>,
<span class="prelude-val">Err</span>(<span class="ident">err</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="macro">error_</span><span class="macro">!</span>(<span class="string">&quot;CORS Error: {}&quot;</span>, <span class="ident">err</span>);
<span class="kw">let</span> <span class="ident">status</span> <span class="op">=</span> <span class="ident">err</span>.<span class="ident">status</span>();
<span class="ident">route_to_fairing_error_handler</span>(<span class="self">self</span>, <span class="ident">status</span>.<span class="ident">code</span>, <span class="ident">request</span>);
<span class="ident">CorsValidation</span>::<span class="ident">Failure</span>
}
};
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="ident">request</span>.<span class="ident">local_cache</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">result</span>);
}
<span class="kw">fn</span> <span class="ident">on_response</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">request</span>: <span class="kw-2">&amp;</span><span class="ident">Request</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>, <span class="ident">response</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">rocket</span>::<span class="ident">Response</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>) {
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">err</span>) <span class="op">=</span> <span class="ident">on_response_wrapper</span>(<span class="self">self</span>, <span class="ident">request</span>, <span class="ident">response</span>) {
<span class="macro">error_</span><span class="macro">!</span>(<span class="string">&quot;Fairings on_response error: {}\nMost likely a bug&quot;</span>, <span class="ident">err</span>);
<span class="ident">response</span>.<span class="ident">set_status</span>(<span class="ident">Status</span>::<span class="ident">InternalServerError</span>);
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="ident">response</span>.<span class="ident">take_body</span>();
}
}
}
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="kw">mod</span> <span class="ident">tests</span> {
<span class="kw">use</span> <span class="ident">rocket</span>::<span class="ident">http</span>::{<span class="ident">Method</span>, <span class="ident">Status</span>};
<span class="kw">use</span> <span class="ident">rocket</span>::<span class="ident">local</span>::<span class="ident">Client</span>;
<span class="kw">use</span> <span class="ident">rocket</span>::<span class="ident">Rocket</span>;
<span class="kw">use</span> <span class="kw">crate</span>::{<span class="ident">AllowedHeaders</span>, <span class="ident">AllowedOrigins</span>, <span class="ident">Cors</span>, <span class="ident">CorsOptions</span>};
<span class="kw">const</span> <span class="ident">CORS_ROOT</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;/my_cors&quot;</span>;
<span class="kw">fn</span> <span class="ident">make_cors_options</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Cors</span> {
<span class="kw">let</span> <span class="ident">allowed_origins</span> <span class="op">=</span> <span class="ident">AllowedOrigins</span>::<span class="ident">some_exact</span>(<span class="kw-2">&amp;</span>[<span class="string">&quot;https://www.acme.com&quot;</span>]);
<span class="ident">CorsOptions</span> {
<span class="ident">allowed_origins</span>,
<span class="ident">allowed_methods</span>: <span class="macro">vec</span><span class="macro">!</span>[<span class="ident">Method</span>::<span class="ident">Get</span>].<span class="ident">into_iter</span>().<span class="ident">map</span>(<span class="ident">From</span>::<span class="ident">from</span>).<span class="ident">collect</span>(),
<span class="ident">allowed_headers</span>: <span class="ident">AllowedHeaders</span>::<span class="ident">some</span>(<span class="kw-2">&amp;</span>[<span class="string">&quot;Authorization&quot;</span>, <span class="string">&quot;Accept&quot;</span>]),
<span class="ident">allow_credentials</span>: <span class="bool-val">true</span>,
<span class="ident">fairing_route_base</span>: <span class="ident">CORS_ROOT</span>.<span class="ident">to_string</span>(),
..<span class="ident">Default</span>::<span class="ident">default</span>()
}
.<span class="ident">to_cors</span>()
.<span class="ident">expect</span>(<span class="string">&quot;Not to fail&quot;</span>)
}
<span class="kw">fn</span> <span class="ident">rocket</span>(<span class="ident">fairing</span>: <span class="ident">Cors</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Rocket</span> {
<span class="ident">Rocket</span>::<span class="ident">ignite</span>().<span class="ident">attach</span>(<span class="ident">fairing</span>)
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">fairing_error_route_returns_passed_in_status</span>() {
<span class="kw">let</span> <span class="ident">client</span> <span class="op">=</span> <span class="ident">Client</span>::<span class="ident">new</span>(<span class="ident">rocket</span>(<span class="ident">make_cors_options</span>())).<span class="ident">expect</span>(<span class="string">&quot;to not fail&quot;</span>);
<span class="kw">let</span> <span class="ident">request</span> <span class="op">=</span> <span class="ident">client</span>.<span class="ident">get</span>(<span class="macro">format</span><span class="macro">!</span>(<span class="string">&quot;{}/403&quot;</span>, <span class="ident">CORS_ROOT</span>));
<span class="kw">let</span> <span class="ident">response</span> <span class="op">=</span> <span class="ident">request</span>.<span class="ident">dispatch</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">Status</span>::<span class="ident">Forbidden</span>, <span class="ident">response</span>.<span class="ident">status</span>());
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">fairing_error_route_returns_500_for_unknown_status</span>() {
<span class="kw">let</span> <span class="ident">client</span> <span class="op">=</span> <span class="ident">Client</span>::<span class="ident">new</span>(<span class="ident">rocket</span>(<span class="ident">make_cors_options</span>())).<span class="ident">expect</span>(<span class="string">&quot;to not fail&quot;</span>);
<span class="kw">let</span> <span class="ident">request</span> <span class="op">=</span> <span class="ident">client</span>.<span class="ident">get</span>(<span class="macro">format</span><span class="macro">!</span>(<span class="string">&quot;{}/999&quot;</span>, <span class="ident">CORS_ROOT</span>));
<span class="kw">let</span> <span class="ident">response</span> <span class="op">=</span> <span class="ident">request</span>.<span class="ident">dispatch</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">Status</span>::<span class="ident">InternalServerError</span>, <span class="ident">response</span>.<span class="ident">status</span>());
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">error_route_is_mounted_on_attach</span>() {
<span class="kw">let</span> <span class="ident">rocket</span> <span class="op">=</span> <span class="ident">rocket</span>(<span class="ident">make_cors_options</span>());
<span class="kw">let</span> <span class="ident">expected_uri</span> <span class="op">=</span> <span class="macro">format</span><span class="macro">!</span>(<span class="string">&quot;{}/&lt;status&gt;&quot;</span>, <span class="ident">CORS_ROOT</span>);
<span class="kw">let</span> <span class="ident">error_route</span> <span class="op">=</span> <span class="ident">rocket</span>
.<span class="ident">routes</span>()
.<span class="ident">find</span>(<span class="op">|</span><span class="ident">r</span><span class="op">|</span> <span class="ident">r</span>.<span class="ident">method</span> <span class="op">=</span><span class="op">=</span> <span class="ident">Method</span>::<span class="ident">Get</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">r</span>.<span class="ident">uri</span>.<span class="ident">to_string</span>() <span class="op">=</span><span class="op">=</span> <span class="ident">expected_uri</span>);
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">error_route</span>.<span class="ident">is_some</span>());
}
<span class="comment">// Rest of the things can only be tested in integration tests</span>
}
</pre></div>
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "rocket_cors";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>