Files
rapr-rs/docs/src/httpdate/lib.rs.html
T
Uttarayan Mondal d5ecda4c73 Initial docs commit
2021-03-15 01:27:34 +05:30

305 lines
24 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 of the Rust file `/home/fs0c131y/.local/share/cargo/registry/src/github.com-1ecc6299db9ec823/httpdate-0.3.2/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.rs - 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="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><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='../../httpdate/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><button type="button" class="help-button">?</button>
<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>
</pre><div class="example-wrap"><pre class="rust ">
<span class="doccomment">//! Date and time utils for HTTP.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! Multiple HTTP header fields store timestamps.</span>
<span class="doccomment">//! For example a response created on May 15, 2015 may contain the header</span>
<span class="doccomment">//! `Date: Fri, 15 May 2015 15:34:21 GMT`. Since the timestamp does not</span>
<span class="doccomment">//! contain any timezone or leap second information it is equvivalent to</span>
<span class="doccomment">//! writing 1431696861 Unix time. Rusts `SystemTime` is used to store</span>
<span class="doccomment">//! these timestamps.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! This crate provides two public functions:</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! * `parse_http_date` to parse a HTTP datetime string to a system time</span>
<span class="doccomment">//! * `fmt_http_date` to format a system time to a IMF-fixdate</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! In addition it exposes the `HttpDate` type that can be used to parse</span>
<span class="doccomment">//! and format timestamps. Convert a sytem time to `HttpDate` and vice versa.</span>
<span class="doccomment">//! The `HttpType` (8 bytes) is smaller than `SystemTime` (16 bytes) and</span>
<span class="doccomment">//! using the display impl avoids a temporary allocation.</span>
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">error</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">fmt</span>::{<span class="self">self</span>, <span class="ident">Display</span>, <span class="ident">Formatter</span>};
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">io</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">num</span>::<span class="ident">ParseIntError</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">time</span>::<span class="ident">SystemTime</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">httpdate</span>::<span class="ident">HttpDate</span>;
<span class="kw">mod</span> <span class="ident">httpdate</span>;
<span class="doccomment">/// An opaque error type for all parsing errors.</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Error</span>(());
<span class="kw">impl</span> <span class="ident">error</span>::<span class="ident">Error</span> <span class="kw">for</span> <span class="ident">Error</span> {
<span class="kw">fn</span> <span class="ident">description</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="kw-2">&amp;</span><span class="ident">str</span> {
<span class="string">&quot;string contains no or an invalid date&quot;</span>
}
<span class="kw">fn</span> <span class="ident">cause</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">error</span>::<span class="ident">Error</span><span class="op">&gt;</span> {
<span class="prelude-val">None</span>
}
}
<span class="kw">impl</span> <span class="ident">Display</span> <span class="kw">for</span> <span class="ident">Error</span> {
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Formatter</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(), <span class="ident">fmt</span>::<span class="ident">Error</span><span class="op">&gt;</span> {
<span class="ident">f</span>.<span class="ident">write_str</span>(<span class="ident">error</span>::<span class="ident">Error</span>::<span class="ident">description</span>(<span class="self">self</span>))
}
}
<span class="kw">impl</span> <span class="ident">From</span><span class="op">&lt;</span><span class="ident">ParseIntError</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">Error</span> {
<span class="kw">fn</span> <span class="ident">from</span>(<span class="kw">_</span>: <span class="ident">ParseIntError</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Error</span> {
<span class="ident">Error</span>(())
}
}
<span class="kw">impl</span> <span class="ident">From</span><span class="op">&lt;</span><span class="ident">Error</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">io</span>::<span class="ident">Error</span> {
<span class="kw">fn</span> <span class="ident">from</span>(<span class="ident">e</span>: <span class="ident">Error</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">io</span>::<span class="ident">Error</span> {
<span class="ident">io</span>::<span class="ident">Error</span>::<span class="ident">new</span>(<span class="ident">io</span>::<span class="ident">ErrorKind</span>::<span class="ident">Other</span>, <span class="ident">e</span>)
}
}
<span class="doccomment">/// Parse a date from an HTTP header field.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// Supports the preferred IMF-fixdate and the legacy RFC 805 and</span>
<span class="doccomment">/// ascdate formats. Two digit years are mapped to dates between</span>
<span class="doccomment">/// 1970 and 2069.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">parse_http_date</span>(<span class="ident">s</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">SystemTime</span>, <span class="ident">Error</span><span class="op">&gt;</span> {
<span class="ident">s</span>.<span class="ident">parse</span>::<span class="op">&lt;</span><span class="ident">HttpDate</span><span class="op">&gt;</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">d</span><span class="op">|</span> <span class="ident">d</span>.<span class="ident">into</span>())
}
<span class="doccomment">/// Format a date to be used in a HTTP header field.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// Dates are formatted as IMF-fixdate: `Fri, 15 May 2015 15:34:21 GMT`.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">fmt_http_date</span>(<span class="ident">d</span>: <span class="ident">SystemTime</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">String</span> {
<span class="macro">format</span><span class="macro">!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">HttpDate</span>::<span class="ident">from</span>(<span class="ident">d</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">std</span>::<span class="ident">str</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">time</span>::{<span class="ident">Duration</span>, <span class="ident">UNIX_EPOCH</span>};
<span class="kw">use</span> <span class="kw">super</span>::{<span class="ident">HttpDate</span>, <span class="ident">parse_http_date</span>, <span class="ident">fmt_http_date</span>};
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_rfc_example</span>() {
<span class="kw">let</span> <span class="ident">d</span> <span class="op">=</span> <span class="ident">UNIX_EPOCH</span> <span class="op">+</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">784111777</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>,
<span class="ident">parse_http_date</span>(<span class="string">&quot;Sun, 06 Nov 1994 08:49:37 GMT&quot;</span>).<span class="ident">expect</span>(<span class="string">&quot;#1&quot;</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>,
<span class="ident">parse_http_date</span>(<span class="string">&quot;Sunday, 06-Nov-94 08:49:37 GMT&quot;</span>).<span class="ident">expect</span>(<span class="string">&quot;#2&quot;</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Sun Nov 6 08:49:37 1994&quot;</span>).<span class="ident">expect</span>(<span class="string">&quot;#3&quot;</span>));
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test2</span>() {
<span class="kw">let</span> <span class="ident">d</span> <span class="op">=</span> <span class="ident">UNIX_EPOCH</span> <span class="op">+</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">1475419451</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>,
<span class="ident">parse_http_date</span>(<span class="string">&quot;Sun, 02 Oct 2016 14:44:11 GMT&quot;</span>).<span class="ident">expect</span>(<span class="string">&quot;#1&quot;</span>));
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">parse_http_date</span>(<span class="string">&quot;Sun Nov 10 08:00:00 1000&quot;</span>).<span class="ident">is_err</span>());
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">parse_http_date</span>(<span class="string">&quot;Sun Nov 10 08*00:00 2000&quot;</span>).<span class="ident">is_err</span>());
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">parse_http_date</span>(<span class="string">&quot;Sunday, 06-Nov-94 08+49:37 GMT&quot;</span>).<span class="ident">is_err</span>());
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test3</span>() {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">d</span> <span class="op">=</span> <span class="ident">UNIX_EPOCH</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Thu, 01 Jan 1970 00:00:00 GMT&quot;</span>).<span class="ident">unwrap</span>());
<span class="ident">d</span> <span class="op">+</span><span class="op">=</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">3600</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Thu, 01 Jan 1970 01:00:00 GMT&quot;</span>).<span class="ident">unwrap</span>());
<span class="ident">d</span> <span class="op">+</span><span class="op">=</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">86400</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Fri, 02 Jan 1970 01:00:00 GMT&quot;</span>).<span class="ident">unwrap</span>());
<span class="ident">d</span> <span class="op">+</span><span class="op">=</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">2592000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Sun, 01 Feb 1970 01:00:00 GMT&quot;</span>).<span class="ident">unwrap</span>());
<span class="ident">d</span> <span class="op">+</span><span class="op">=</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">2592000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Tue, 03 Mar 1970 01:00:00 GMT&quot;</span>).<span class="ident">unwrap</span>());
<span class="ident">d</span> <span class="op">+</span><span class="op">=</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">31536005</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Wed, 03 Mar 1971 01:00:05 GMT&quot;</span>).<span class="ident">unwrap</span>());
<span class="ident">d</span> <span class="op">+</span><span class="op">=</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">15552000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Mon, 30 Aug 1971 01:00:05 GMT&quot;</span>).<span class="ident">unwrap</span>());
<span class="ident">d</span> <span class="op">+</span><span class="op">=</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">6048000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Mon, 08 Nov 1971 01:00:05 GMT&quot;</span>).<span class="ident">unwrap</span>());
<span class="ident">d</span> <span class="op">+</span><span class="op">=</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">864000000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">d</span>, <span class="ident">parse_http_date</span>(<span class="string">&quot;Fri, 26 Mar 1999 01:00:05 GMT&quot;</span>).<span class="ident">unwrap</span>());
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_fmt</span>() {
<span class="kw">let</span> <span class="ident">d</span> <span class="op">=</span> <span class="ident">UNIX_EPOCH</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">fmt_http_date</span>(<span class="ident">d</span>), <span class="string">&quot;Thu, 01 Jan 1970 00:00:00 GMT&quot;</span>);
<span class="kw">let</span> <span class="ident">d</span> <span class="op">=</span> <span class="ident">UNIX_EPOCH</span> <span class="op">+</span> <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">1475419451</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">fmt_http_date</span>(<span class="ident">d</span>), <span class="string">&quot;Sun, 02 Oct 2016 14:44:11 GMT&quot;</span>);
}
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">dead_code</span>)]</span>
<span class="kw">fn</span> <span class="ident">testcase</span>(<span class="ident">data</span>: <span class="kw-2">&amp;</span>[<span class="ident">u8</span>]) {
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Ok</span>(<span class="ident">s</span>) <span class="op">=</span> <span class="ident">str</span>::<span class="ident">from_utf8</span>(<span class="ident">data</span>) {
<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">s</span>);
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Ok</span>(<span class="ident">d</span>) <span class="op">=</span> <span class="ident">parse_http_date</span>(<span class="ident">s</span>) {
<span class="kw">let</span> <span class="ident">o</span> <span class="op">=</span> <span class="ident">fmt_http_date</span>(<span class="ident">d</span>);
<span class="macro">assert</span><span class="macro">!</span>(<span class="op">!</span><span class="ident">o</span>.<span class="ident">is_empty</span>());
}
}
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">size_of</span>() {
<span class="macro">assert_eq</span><span class="macro">!</span>(::<span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">size_of</span>::<span class="op">&lt;</span><span class="ident">HttpDate</span><span class="op">&gt;</span>(), <span class="number">8</span>);
}
}
</pre></div>
</section><section id="search" class="content hidden"></section><section class="footer"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="httpdate"></div>
<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>