From 9b84127143c0be244c2070092c2c0c8c2e08b721 Mon Sep 17 00:00:00 2001
From: "Kartikaya Gupta (kats)" <staktrace@users.noreply.github.com>
Date: Mon, 13 Jul 2020 00:21:27 -0400
Subject: [PATCH 001/138] Fix typo (#59)

---
 _guides/server/echo.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_guides/server/echo.md b/_guides/server/echo.md
index 2736436..af35ade 100644
--- a/_guides/server/echo.md
+++ b/_guides/server/echo.md
@@ -160,7 +160,7 @@ uppercase.
 ## Buffering the Request Body
 
 What if we want our echo service to reverse the data it received and send it
-back to use? We can't really stream the data as it comes in, since we need to
+back to us? We can't really stream the data as it comes in, since we need to
 find the end before we can respond. To do this, we can explore how to easily
 collect the full body.
 

From 56a58de4f3fe80a0414ad4105e52efc1545f7305 Mon Sep 17 00:00:00 2001
From: abgita <42152656+abgita@users.noreply.github.com>
Date: Sat, 10 Oct 2020 21:31:34 +0000
Subject: [PATCH 002/138] Update copyright year to 2020

---
 _includes/footer.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_includes/footer.html b/_includes/footer.html
index f01c6d7..262276c 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -1,7 +1,7 @@
 <footer class="hyper-footer col-md-12">
     <div class="container">
         <div class="row">
-            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2019 hyper</div>
+            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2020 hyper</div>
             <div class="col-sm-6 text-center text-sm-right">
                 <a href="https://github.com/hyperium/hyperium.github.io/blob/master/{{ page.path }}">
                     edit this page on github

From e6d3e21433abc42a622f694ed2a8de7498bb4477 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 23 Dec 2020 13:51:16 -0800
Subject: [PATCH 003/138] Update website for 0.14

---
 .travis.sh                    | 6 +++---
 _config.yml                   | 2 +-
 _guides/client/basic.md       | 4 ++--
 _guides/index.md              | 2 +-
 _guides/server/echo.md        | 4 ++--
 _guides/server/hello-world.md | 4 ++--
 6 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/.travis.sh b/.travis.sh
index 7df045d..400cf78 100755
--- a/.travis.sh
+++ b/.travis.sh
@@ -8,9 +8,9 @@ if [ ! -e tmp/Cargo.toml ]; then
     fi
     cat >> tmp/Cargo.toml <<-EOF
 futures = "0.3"
-hyper = "0.13"
-hyper-tls = "0.4"
-tokio = { version = "0.2", features = ["full"] }
+hyper = { version = "0.14", features = ["full"] }
+hyper-tls = "0.5"
+tokio = { version = "1", features = ["full"] }
 EOF
     cargo build --manifest-path tmp/Cargo.toml
 fi
diff --git a/_config.yml b/_config.yml
index 6a69e1d..75c3034 100644
--- a/_config.yml
+++ b/_config.yml
@@ -28,7 +28,7 @@ relative_links:
   enabled: true
   collections: true
 
-docs_url: https://docs.rs/hyper/0.13.*
+docs_url: https://docs.rs/hyper/0.14.*
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
 futures_url: https://docs.rs/futures/0.3.*
 hyper_tls_url: https://docs.rs/hyper-tls/*
diff --git a/_guides/client/basic.md b/_guides/client/basic.md
index 66b0d2a..79102d4 100644
--- a/_guides/client/basic.md
+++ b/_guides/client/basic.md
@@ -10,8 +10,8 @@ Let's tell Cargo about our dependencies by having this in the Cargo.toml.
 
 ```toml
 [dependencies]
-hyper = "0.13"
-tokio = { version = "0.2", features = ["full"] }
+hyper = { version = "0.14", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
 ```
 
 Now, we are ready to import the dependencies in our Rust file.
diff --git a/_guides/index.md b/_guides/index.md
index 295a2eb..3cf51c6 100644
--- a/_guides/index.md
+++ b/_guides/index.md
@@ -10,7 +10,7 @@ You can start using it by first adding it to your `Cargo.toml`:
 
 ```toml
 [dependencies]
-hyper = "0.13"
+hyper = "0.14"
 ```
 
 - If building a web server, continue with the [Server guide][].
diff --git a/_guides/server/echo.md b/_guides/server/echo.md
index af35ade..e454824 100644
--- a/_guides/server/echo.md
+++ b/_guides/server/echo.md
@@ -22,8 +22,8 @@ that as a dependency:
 
 ```toml
 [dependencies]
-hyper = "0.13"
-tokio = { version = "0.2", features = ["full"] }
+hyper = { version = "0.14", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
 futures = "0.3"
 ```
 
diff --git a/_guides/server/hello-world.md b/_guides/server/hello-world.md
index deddef2..b64d6ce 100644
--- a/_guides/server/hello-world.md
+++ b/_guides/server/hello-world.md
@@ -9,8 +9,8 @@ First, we need our dependencies. Let's tell Cargo about our dependencies by havi
 
 ```toml
 [dependencies]
-hyper = "0.13"
-tokio = { version = "0.2", features = ["full"] }
+hyper = { version = "0.14", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
 ```
 
 Now lets start on our `main.rs`, and add some imports:

From f70955dc7200db079778668214a38088b9de98e7 Mon Sep 17 00:00:00 2001
From: phil <aemonk@users.noreply.github.com>
Date: Tue, 19 Jan 2021 15:28:32 +0100
Subject: [PATCH 004/138] Update copyright year to 2021

---
 _includes/footer.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_includes/footer.html b/_includes/footer.html
index 262276c..026e917 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -1,7 +1,7 @@
 <footer class="hyper-footer col-md-12">
     <div class="container">
         <div class="row">
-            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2020 hyper</div>
+            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2021 hyper</div>
             <div class="col-sm-6 text-center text-sm-right">
                 <a href="https://github.com/hyperium/hyperium.github.io/blob/master/{{ page.path }}">
                     edit this page on github

From 99b6efb56a6a1af89dae3f86bcd081debf1811e4 Mon Sep 17 00:00:00 2001
From: Shin Seunghun <36041278+seunghunee@users.noreply.github.com>
Date: Wed, 7 Apr 2021 02:43:59 +0900
Subject: [PATCH 005/138] Remove mention of importing with extern keyword (#64)

---
 _guides/client/basic.md | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/_guides/client/basic.md b/_guides/client/basic.md
index 79102d4..a7694c0 100644
--- a/_guides/client/basic.md
+++ b/_guides/client/basic.md
@@ -14,13 +14,7 @@ hyper = { version = "0.14", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
 ```
 
-Now, we are ready to import the dependencies in our Rust file.
-
-```rust
-extern crate hyper;
-```
-
-We need to import pieces to use from our dependencies:
+Now, we need to import pieces to use from our dependencies:
 
 ```rust
 # extern crate hyper;

From 5afa56cb79e4252c301c5442462160d559cb72ea Mon Sep 17 00:00:00 2001
From: Shin Seunghun <36041278+seunghunee@users.noreply.github.com>
Date: Tue, 13 Apr 2021 07:20:58 +0900
Subject: [PATCH 006/138] Update advanced client usage page for 0.14 (#65)

---
 _guides/client/advanced.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/_guides/client/advanced.md b/_guides/client/advanced.md
index 554c3a0..c041fb3 100644
--- a/_guides/client/advanced.md
+++ b/_guides/client/advanced.md
@@ -77,8 +77,8 @@ imports again:
 
 ```toml
 [dependencies]
-hyper = "0.13"
-tokio = { version = "0.2", features = ["full"] }
+hyper = { version = "0.14", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
 futures = "0.3"
 ```
 

From 0e050a51d16ac9216fdfb71ca80fdc540cdf3618 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 29 Apr 2021 11:39:37 -0700
Subject: [PATCH 007/138] Add blog template and test blog post

---
 _layouts/post.html                    | 45 +++++++++++++++++++--------
 _posts/2021-04-29-is-this-thing-on.md | 10 ++++++
 2 files changed, 42 insertions(+), 13 deletions(-)
 create mode 100644 _posts/2021-04-29-is-this-thing-on.md

diff --git a/_layouts/post.html b/_layouts/post.html
index a2b4e52..896ec93 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -1,15 +1,34 @@
----
-layout: default
----
-<div class="post">
+<!doctype html>
+<html>
+  <head>
+    {% include head.html %}
+  </head>
+  <body id="hyper">
+    {% include header.html %}
+    <div class="hyper-pageheader">
+      <div class="container">
+        <h1>{{ page.title }}</h1>
+      </div>
+    </div>
+    <div class="container">
+      <div class="row">
+        <aside class="col-md-3 hyper-sidebar">
+          <nav>
+            <ul class="nav">
+            {% for post in site.posts %}
+              <li {% if post.url == page.url %}class="active"{% endif %}><a href="{{ post.url }}">{{ post.title }}</a></li>
+            {% endfor %}
+            </ul>
+          </nav>
+        </aside>
+        <article class="col-md-9 hyper-content hyper-post">
+          {{ content }}
 
-  <header class="post-header">
-    <h1 class="post-title">{{ page.title }}</h1>
-    <p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
-  </header>
+          <!--<p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>-->
+        </article>
+      </div>
+    </div>
 
-  <article class="post-content">
-    {{ content }}
-  </article>
-
-</div>
+    {% include footer.html %}
+  </body>
+</html>
diff --git a/_posts/2021-04-29-is-this-thing-on.md b/_posts/2021-04-29-is-this-thing-on.md
new file mode 100644
index 0000000..18e8824
--- /dev/null
+++ b/_posts/2021-04-29-is-this-thing-on.md
@@ -0,0 +1,10 @@
+---
+layout: post
+title: "Testing... Is this thing on?"
+---
+
+# Testing... Is this thing on?
+
+Bear with us, we're checking the lights and sound system.
+
+Eventually, this will be a function blog for hyper.rs. Once we figure out how it works.

From 62f0f54d9af513a9266840472f370cbf1828684c Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 29 Apr 2021 11:49:45 -0700
Subject: [PATCH 008/138] enable the posts collection

---
 _config.yml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/_config.yml b/_config.yml
index 75c3034..00ef7dd 100644
--- a/_config.yml
+++ b/_config.yml
@@ -15,6 +15,9 @@ collections:
   guides:
     permalink: /:collection/:path/
     output: true
+  posts:
+    permalink: /blog/:path/
+    output: true
 
 # Build settings
 markdown: kramdown

From 53a6460f67caf816dddc1573466ab1fbee461947 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 29 Apr 2021 12:01:59 -0700
Subject: [PATCH 009/138] adjust posts permalink structure

---
 _config.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/_config.yml b/_config.yml
index 00ef7dd..fb65daf 100644
--- a/_config.yml
+++ b/_config.yml
@@ -16,7 +16,6 @@ collections:
     permalink: /:collection/:path/
     output: true
   posts:
-    permalink: /blog/:path/
     output: true
 
 # Build settings

From 76a8b05071400f74ae4a9c0c4b39a8b113e18381 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 29 Apr 2021 12:14:16 -0700
Subject: [PATCH 010/138] list posts in a comment in the footer

---
 _includes/footer.html | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/_includes/footer.html b/_includes/footer.html
index 026e917..9314106 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -11,3 +11,8 @@
     </div>
 </footer>
 <script src="{{ "/js/rustdoc.js" | absolute_url }}"></script>
+<!--
+{% for post in site.posts %}
+- {{ post.title }}: {{ post.url }}
+{% endfor %}
+-->

From fc6c440f0ebb00f06eeccfa77734a8579a0aaba5 Mon Sep 17 00:00:00 2001
From: Shing Lyu <shing.lyu@gmail.com>
Date: Thu, 29 Apr 2021 23:33:19 +0200
Subject: [PATCH 011/138] Update the broken Tokio documentation link (#66)

---
 _guides/client/basic.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_guides/client/basic.md b/_guides/client/basic.md
index a7694c0..2130b1d 100644
--- a/_guides/client/basic.md
+++ b/_guides/client/basic.md
@@ -114,7 +114,7 @@ And that's it! You can see the [full example here][example].
 
 [Client]: {{ site.docs_url }}/hyper/client/struct.Client.html
 [Tokio]: https://tokio.rs
-[Tokio-Futures]: https://tokio.rs/docs/getting-started/futures/
+[Tokio-Futures]: https://tokio.rs/tokio/tutorial/async
 [StatusCode]: {{ site.docs_url }}/hyper/struct.StatusCode.html
 [Response]: {{ site.docs_url }}/hyper/struct.Response.html
 [example]: {{ site.examples_url }}/client.rs

From 3dabf8d789e9061ca21af37d6c9cb43a9777f5a0 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 30 Apr 2021 17:46:22 -0700
Subject: [PATCH 012/138] adjust blog page

---
 _config.yml                           |  1 +
 _includes/footer.html                 |  5 -----
 _layouts/post.html                    | 11 +----------
 _posts/2021-04-29-is-this-thing-on.md |  4 +---
 4 files changed, 3 insertions(+), 18 deletions(-)

diff --git a/_config.yml b/_config.yml
index fb65daf..af1f714 100644
--- a/_config.yml
+++ b/_config.yml
@@ -16,6 +16,7 @@ collections:
     permalink: /:collection/:path/
     output: true
   posts:
+    permalink: /blog/:year/:month/:day/:title/
     output: true
 
 # Build settings
diff --git a/_includes/footer.html b/_includes/footer.html
index 9314106..026e917 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -11,8 +11,3 @@
     </div>
 </footer>
 <script src="{{ "/js/rustdoc.js" | absolute_url }}"></script>
-<!--
-{% for post in site.posts %}
-- {{ post.title }}: {{ post.url }}
-{% endfor %}
--->
diff --git a/_layouts/post.html b/_layouts/post.html
index 896ec93..61dfe89 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -12,16 +12,7 @@ <h1>{{ page.title }}</h1>
     </div>
     <div class="container">
       <div class="row">
-        <aside class="col-md-3 hyper-sidebar">
-          <nav>
-            <ul class="nav">
-            {% for post in site.posts %}
-              <li {% if post.url == page.url %}class="active"{% endif %}><a href="{{ post.url }}">{{ post.title }}</a></li>
-            {% endfor %}
-            </ul>
-          </nav>
-        </aside>
-        <article class="col-md-9 hyper-content hyper-post">
+        <article class="col-md align-self-center hyper-content hyper-post">
           {{ content }}
 
           <!--<p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>-->
diff --git a/_posts/2021-04-29-is-this-thing-on.md b/_posts/2021-04-29-is-this-thing-on.md
index 18e8824..703ce24 100644
--- a/_posts/2021-04-29-is-this-thing-on.md
+++ b/_posts/2021-04-29-is-this-thing-on.md
@@ -3,8 +3,6 @@ layout: post
 title: "Testing... Is this thing on?"
 ---
 
-# Testing... Is this thing on?
-
 Bear with us, we're checking the lights and sound system.
 
-Eventually, this will be a function blog for hyper.rs. Once we figure out how it works.
+Eventually, this will be a functioning blog for hyper.rs. Once we figure out how it works.

From 7bd680cb6af0dc6ecd72014f2c5e386523630e0f Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 4 May 2021 15:53:34 -0700
Subject: [PATCH 013/138] blog post styling

---
 _layouts/post.html | 11 ++++++-----
 css/main.scss      | 16 ++++++++++++++++
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/_layouts/post.html b/_layouts/post.html
index 61dfe89..ca78f2d 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -3,19 +3,20 @@
   <head>
     {% include head.html %}
   </head>
-  <body id="hyper">
+  <body id="hyper" class="hyper-blog">
     {% include header.html %}
     <div class="hyper-pageheader">
       <div class="container">
-        <h1>{{ page.title }}</h1>
+        <div class="col">
+          <h1>{{ page.title }}</h1>
+          <p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
+        </div>
       </div>
     </div>
     <div class="container">
       <div class="row">
-        <article class="col-md align-self-center hyper-content hyper-post">
+        <article class="col-md hyper-content">
           {{ content }}
-
-          <!--<p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>-->
         </article>
       </div>
     </div>
diff --git a/css/main.scss b/css/main.scss
index 662007e..ddb0f48 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -188,6 +188,22 @@ pre code {
     background: none;
 }
 
+/* blog styles */
+#hyper.hyper-blog .hyper-pageheader {
+    padding-bottom: 2rem;
+}
+
+#hyper.hyper-blog .hyper-pageheader .col {
+    margin-left: auto;
+    margin-right: auto;
+    max-width: 700px;
+}
+
+#hyper.hyper-blog .hyper-content {
+    margin-left: auto;
+    margin-right: auto;
+}
+
 /* code styles */
 .highlight  { background: $code-bg-color; }
 .highlight .c { color: #999988; font-style: italic } /* Comment */

From 928dc9236a6c6fc962c43dfa9a9b4809ccf6ec56 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 5 May 2021 16:02:56 -0700
Subject: [PATCH 014/138] blog post: welcome nox

---
 _posts/2021-05-06-welcome-anthony-ramine | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 _posts/2021-05-06-welcome-anthony-ramine

diff --git a/_posts/2021-05-06-welcome-anthony-ramine b/_posts/2021-05-06-welcome-anthony-ramine
new file mode 100644
index 0000000..fc37538
--- /dev/null
+++ b/_posts/2021-05-06-welcome-anthony-ramine
@@ -0,0 +1,12 @@
+---
+title: "Welcome Anthony Ramine"
+---
+
+I'm excited to announce that Anthony Ramine ([@nox](https://github.com/nox)) has joined the team of maintainers for hyper!
+
+- Implemented `CONNECT` support over HTTP/2
+- Added HTTP/0.9 optional support
+- Greater support for preserving header name cases
+- Issue triage and PR reviews ❤️
+
+Thank so much for the fantastic support so far!

From badec9db4093a04785b94a6212857e7c794ba2d5 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 6 May 2021 10:31:35 -0700
Subject: [PATCH 015/138] fix blog post extension

---
 ...elcome-anthony-ramine => 2021-05-06-welcome-anthony-ramine.md} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename _posts/{2021-05-06-welcome-anthony-ramine => 2021-05-06-welcome-anthony-ramine.md} (100%)

diff --git a/_posts/2021-05-06-welcome-anthony-ramine b/_posts/2021-05-06-welcome-anthony-ramine.md
similarity index 100%
rename from _posts/2021-05-06-welcome-anthony-ramine
rename to _posts/2021-05-06-welcome-anthony-ramine.md

From 95fa55d4a2aed4cf85ba359cc39d2ba7ccfd568a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Cevey?= <seb@cine7.net>
Date: Fri, 8 May 2020 14:48:43 +0100
Subject: [PATCH 016/138] Make basic guide code more consistent to avoid errors

Changes `resp` to be mutable in the first example too so the code matches the one below. Following the tutorial I got an error, because the second code sample was subtly different.
---
 _guides/client/basic.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_guides/client/basic.md b/_guides/client/basic.md
index 2130b1d..bee30a9 100644
--- a/_guides/client/basic.md
+++ b/_guides/client/basic.md
@@ -65,7 +65,7 @@ let client = Client::new();
 let uri = "http://httpbin.org/ip".parse()?;
 
 // Await the response...
-let resp = client.get(uri).await?;
+let mut resp = client.get(uri).await?;
 
 println!("Response: {}", resp.status());
 # Ok(())

From edfc16822eb0d3315d9b283b1c862369175d80db Mon Sep 17 00:00:00 2001
From: SamuelBonilla <pythonners@gmail.com>
Date: Fri, 7 Jan 2022 15:06:51 -0500
Subject: [PATCH 017/138] Update year

---
 _includes/footer.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_includes/footer.html b/_includes/footer.html
index 026e917..7ca8887 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -1,7 +1,7 @@
 <footer class="hyper-footer col-md-12">
     <div class="container">
         <div class="row">
-            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2021 hyper</div>
+            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2022 hyper</div>
             <div class="col-sm-6 text-center text-sm-right">
                 <a href="https://github.com/hyperium/hyperium.github.io/blob/master/{{ page.path }}">
                     edit this page on github

From 66904c4b48010ef7a2e52e34f30fdeaa8d47e607 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 8 Apr 2022 08:07:55 -0700
Subject: [PATCH 018/138] add twitter card meta values

---
 _includes/head.html | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/_includes/head.html b/_includes/head.html
index 5c23ca9..ebc4e4e 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -15,3 +15,8 @@
 <link rel="icon" href="./icons/favicon.ico" type="image/x-icon">
  
 <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
+
+<!-- twitter card -->
+<meta name="twitter:card" content="summary" />
+<meta name="twitter:site" content="@hyperium_rs" />
+<meta name="twitter:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}" />

From 2d43428687f13e0d496100cfe8895ead9790a004 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 8 Apr 2022 08:33:30 -0700
Subject: [PATCH 019/138] add orange image to twitter card

---
 _includes/head.html | 1 +
 1 file changed, 1 insertion(+)

diff --git a/_includes/head.html b/_includes/head.html
index ebc4e4e..1d7452d 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -20,3 +20,4 @@
 <meta name="twitter:card" content="summary" />
 <meta name="twitter:site" content="@hyperium_rs" />
 <meta name="twitter:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}" />
+<meta name="twitter:image" content="https://pbs.twimg.com/profile_banners/1260950338237956098/1589469871" />

From fb26e7588b773f98ac6d6762fb101e01c24f8341 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 8 Apr 2022 08:38:17 -0700
Subject: [PATCH 020/138] add excerpt to twitter card

---
 _includes/head.html | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/_includes/head.html b/_includes/head.html
index 1d7452d..2b29583 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -21,3 +21,6 @@
 <meta name="twitter:site" content="@hyperium_rs" />
 <meta name="twitter:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}" />
 <meta name="twitter:image" content="https://pbs.twimg.com/profile_banners/1260950338237956098/1589469871" />
+{% if page.excerpt %}
+<meta name="twitter:description" content="{{ page.excerpt }}" />
+{% endif %}

From 3fb5febcf2b0c22cc40dc8a77e0dc007d91fdbc8 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 8 Apr 2022 08:41:08 -0700
Subject: [PATCH 021/138] strip html from twitter card excerpt

---
 _includes/head.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_includes/head.html b/_includes/head.html
index 2b29583..6a88bf1 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -22,5 +22,5 @@
 <meta name="twitter:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}" />
 <meta name="twitter:image" content="https://pbs.twimg.com/profile_banners/1260950338237956098/1589469871" />
 {% if page.excerpt %}
-<meta name="twitter:description" content="{{ page.excerpt }}" />
+<meta name="twitter:description" content="{{ page.excerpt | strip_html }}" />
 {% endif %}

From 669efdd2672517730db22298fde7186d81c88e7f Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 7 Apr 2022 14:12:25 -0700
Subject: [PATCH 022/138] blog post: welcome acfoltzer

---
 _posts/2022-04-08-welcome-adam-foltzer.md | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 _posts/2022-04-08-welcome-adam-foltzer.md

diff --git a/_posts/2022-04-08-welcome-adam-foltzer.md b/_posts/2022-04-08-welcome-adam-foltzer.md
new file mode 100644
index 0000000..9c7ce76
--- /dev/null
+++ b/_posts/2022-04-08-welcome-adam-foltzer.md
@@ -0,0 +1,12 @@
+---
+title: "Welcome Adam Foltzer"
+---
+
+We'd like to welcome Adam Foltzer ([@acfoltzer](https://github.com/acfoltzer)) as a hyper Collaborator. He has done some great work improving edge-case HTTP/1 support, planning, and most importantly, brings a kind attitude. For instance:
+
+- [Ignore obs-text in HTTP/1 reason phrases](https://github.com/seanmonstar/httparse/pull/84)
+- [Refactor the httparse benchmarks to better identify performance changes](https://github.com/seanmonstar/httparse/pull/112)
+- [Allow multiple spaces in request and status lines](https://github.com/seanmonstar/httparse/pull/110)
+- [Add hyper extension to access `ReasonPhrase`](https://github.com/hyperium/hyper/pull/2792)
+
+Thanks for all you do for us, we're excited to have you aboard!

From a74bb80c22334aa2dea4cc93d781c8aa73dcde41 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 19 Aug 2022 16:38:23 -0700
Subject: [PATCH 023/138] adjust site title

---
 _config.yml | 2 +-
 index.md    | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/_config.yml b/_config.yml
index af1f714..d37eb18 100644
--- a/_config.yml
+++ b/_config.yml
@@ -1,5 +1,5 @@
 # Site settings
-title: hyper
+title: hyper - fast and safe HTTP for the Rust language
 baseurl: "/" # the subpath of your site, e.g. /blog/
 url: "https://hyper.rs" # the base hostname & protocol for your site
 
diff --git a/index.md b/index.md
index 8125c08..b5dedf1 100644
--- a/index.md
+++ b/index.md
@@ -1,5 +1,4 @@
 ---
-title: hyper.rs
 layout: home
 ---
 

From 0d78c11d3fc056c3cc64d69199cf7c1f64a6c886 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 14 Dec 2022 08:56:32 -0800
Subject: [PATCH 024/138] ci: switch from travis to GitHub Actions

---
 .github/workflows/CI.yml                      | 48 +++++++++++++++++++
 .../workflows/check_guides.sh                 |  0
 .travis.yml                                   | 12 -----
 3 files changed, 48 insertions(+), 12 deletions(-)
 create mode 100644 .github/workflows/CI.yml
 rename .travis.sh => .github/workflows/check_guides.sh (100%)
 delete mode 100644 .travis.yml

diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
new file mode 100644
index 0000000..17cd33f
--- /dev/null
+++ b/.github/workflows/CI.yml
@@ -0,0 +1,48 @@
+name: CI
+on:
+  pull_request:
+  push:
+    branches:
+      - master
+
+env:
+  RUST_BACKTRACE: 1
+
+permissions:
+  contents: read # to fetch code (actions/checkout)
+
+jobs:
+  ci-pass:
+    name: CI is green
+    runs-on: ubuntu-latest
+    needs:
+      - test
+    steps:
+      - run: exit 0
+
+  test:
+    name: Test ${{ matrix.rust }} on ${{ matrix.os }}
+    strategy:
+      matrix:
+        rust:
+          - stable
+          - beta
+
+        os:
+          - ubuntu-latest
+
+    runs-on: ${{ matrix.os }}
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v1
+
+      - name: Install Rust (${{ matrix.rust }})
+        uses: actions-rs/toolchain@v1
+        with:
+          profile: minimal
+          toolchain: ${{ matrix.rust }}
+          override: true
+
+      - name: Test
+        run: ./.github/workflows/check_guides.sh
diff --git a/.travis.sh b/.github/workflows/check_guides.sh
similarity index 100%
rename from .travis.sh
rename to .github/workflows/check_guides.sh
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index e8539bd..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: rust
-sudo: false
-dist: trusty
-matrix:
-    fast_finish: true
-    include:
-        - rust: nightly
-        - rust: beta
-        - rust: stable
-
-script:
-  - ./.travis.sh

From b1c15139717f029b8baef3b9b1c46a995659e1ee Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 3 Dec 2022 22:37:57 +0100
Subject: [PATCH 025/138] docs(server): update hello-world guide to 1.0

---
 _guides/server/hello-world.md | 122 ++++++++++++++++++++--------------
 1 file changed, 71 insertions(+), 51 deletions(-)

diff --git a/_guides/server/hello-world.md b/_guides/server/hello-world.md
index b64d6ce..0bc0e60 100644
--- a/_guides/server/hello-world.md
+++ b/_guides/server/hello-world.md
@@ -5,87 +5,100 @@ layout: guide
 
 Let's start by making a "Hello, World!" server, and expand from there.
 
-First, we need our dependencies. Let's tell Cargo about our dependencies by having this in the `Cargo.toml`.
+First we need to declare our dependencies, let's add the following to our `Cargo.toml`:
 
 ```toml
 [dependencies]
-hyper = { version = "0.14", features = ["full"] }
+hyper = { version = "1.0.0-rc.1", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
+http-body-util = "0.1.0-rc.1" 
 ```
 
-Now lets start on our `main.rs`, and add some imports:
+Next, we need to add some imports in our `main.rs` file:
 
 ```rust
-# extern crate hyper;
 use std::convert::Infallible;
 use std::net::SocketAddr;
-use hyper::{Body, Request, Response, Server};
-use hyper::service::{make_service_fn, service_fn};
+
+use http_body_util::Full;
+use hyper::body::Bytes;
+use hyper::server::conn::http1;
+use hyper::service::service_fn;
+use hyper::{Request, Response};
+use tokio::net::TcpListener;
 # fn main() {}
 ```
 
 ## Creating a Service
 
-A [`Service`][service] lets you define how to respond to incoming requests.
-While it is possible to implement the trait directly, there are a few patterns
-that are common when using Hyper. We've included some helpers for when these
-patterns fit our needs.
+The [`Service`][service] trait lets us define how our server will respond to 
+incoming requests. It represents an async function that takes a 
+[`Request`][request] and returns a [`Response`][response] or an error at some
+point in the future. 
 
-In this example, we don't have any state to carry around, so we really just
-need a simple `async` function:
+Hyper provides a utility for creating a `Service` from a function that should 
+serve most usecases: [`service_fn`][service_fn]. We will use this to create 
+a service from our `hello` function below when we're ready to start our 
+server.
 
 ```rust
-# extern crate hyper;
-# use std::convert::Infallible;
-# use hyper::{Body, Request, Response};
-# fn main() {}
-async fn hello_world(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
-    Ok(Response::new("Hello, World".into()))
+#use std::convert::Infallible;
+#use http_body_util::Full;
+#use hyper::body::Bytes;
+#use hyper::{Request, Response};
+async fn hello(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
+    Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
 }
 ```
 
-As soon as we get a request, nothing is stopping us from knowing the response
-immediately! That function will be used when starting our server.
-
-That new `Response` will by default have a `200 OK` status code, and the `Body`
-is able to tell that it is made from a static string, and is able to add a
-`Content-Length` header for us automatically.
+Using this function as a service, we tell our server to respond to all requests 
+with a default `200 OK` status. The response `Body` will contain our friendly
+greeting as a single chunk of bytes, and the `Content-Length` header will be 
+set automatically.
 
 ## Starting the Server
 
-Lastly, we need to hook up our `hello_world` service into a running hyper
-Server.
+Lastly, we need to hook up our `hello` service into a running hyper server.
 
-We'll dive in to the specifics of some of these things in another guide.
+We'll dive into the specifics of some of these things in another guide.
 
 ```rust
-# extern crate hyper;
-# extern crate tokio;
-# mod no_run {
-# use std::convert::Infallible;
-# use std::net::SocketAddr;
-# use hyper::{Body, Request, Response, Server};
-# use hyper::service::{make_service_fn, service_fn};
-# async fn hello_world(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
-#     Ok(Response::new("Hello, World".into()))
-# }
+#use std::convert::Infallible;
+#use std::net::SocketAddr;
+#
+#use http_body_util::Full;
+#use hyper::body::Bytes;
+#use hyper::server::conn::http1;
+#use hyper::service::service_fn;
+#use hyper::{Request, Response};
+#use tokio::net::TcpListener;
+#async fn hello(
+#    _: Request<hyper::body::Incoming>,
+#) -> Result<Response<Full<Bytes>>, Infallible> {
+#    Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
+#}
 #[tokio::main]
 async fn main() {
-    // We'll bind to 127.0.0.1:3000
     let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
 
-    // A `Service` is needed for every connection, so this
-    // creates one from our `hello_world` function.
-    let make_svc = make_service_fn(|_conn| async {
-        // service_fn converts our function into a `Service`
-        Ok::<_, Infallible>(service_fn(hello_world))
-    });
-
-    let server = Server::bind(&addr).serve(make_svc);
-
-    // Run this server for... forever!
-    if let Err(e) = server.await {
-        eprintln!("server error: {}", e);
+    // We create a TcpListener and bind it to 127.0.0.1:3000
+    let listener = TcpListener::bind(addr).await?;
+
+    // We start a loop to continuosly accept incoming connections
+    loop {
+        let (stream, _) = listener.accept().await?;
+
+        // Spawn a `tokio::task` to serve multiple connections concurrently
+        tokio::task::spawn(async move {
+            // Finally, we bind the incoming connection to our `hello_world` service
+            if let Err(err) = http1::Builder::new()
+                // `service_fn` converts our function in a `Service`
+                .serve_connection(stream, service_fn(hello))
+                .await
+            {
+                println!("Error serving connection: {:?}", err);
+            }
+        });
     }
 }
 # }
@@ -94,5 +107,12 @@ async fn main() {
 
 To see all the snippets put together, check out the [full example][example]!
 
-[service]: {{ site.docs_url }}/hyper/service/trait.Service.html
+Also, if `service_fn` doesn't meet your requirements and you'd like to implement 
+`Service` yourself, see this [`example`][impl service].
+
+[service]: {{ site.docs_url }}/hyper/1.0.0-rc.1/hyper/service/trait.Service.html
+[request]: {{ site.docs_url }}/hyper/1.0.0-rc.1/hyper/struct.Request.html
+[response]: {{ site.docs_url }}/hyper/1.0.0-rc.1/hyper/struct.Response.html
+[parts]: {{ site.docs_url }}/http/0.2.8/http/response/struct.Parts.html
 [example]: {{ site.examples_url }}/hello.rs
+[impl service]: {{ site.examples_url }}/service_struct_impl.rs

From 4307b65f88e6976ac7ab30231460dfa7845d0271 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Tue, 6 Dec 2022 19:34:45 +0100
Subject: [PATCH 026/138] docs(server): fix broken links, codeblock comments

---
 _config.yml                   |  2 +-
 _guides/server/hello-world.md | 51 ++++++++++++++++++-----------------
 2 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/_config.yml b/_config.yml
index d37eb18..5a26c69 100644
--- a/_config.yml
+++ b/_config.yml
@@ -31,7 +31,7 @@ relative_links:
   enabled: true
   collections: true
 
-docs_url: https://docs.rs/hyper/0.14.*
+docs_url: https://docs.rs/hyper/1.0.0-rc.1
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
 futures_url: https://docs.rs/futures/0.3.*
 hyper_tls_url: https://docs.rs/hyper-tls/*
diff --git a/_guides/server/hello-world.md b/_guides/server/hello-world.md
index 0bc0e60..4f6ea47 100644
--- a/_guides/server/hello-world.md
+++ b/_guides/server/hello-world.md
@@ -31,10 +31,10 @@ use tokio::net::TcpListener;
 
 ## Creating a Service
 
-The [`Service`][service] trait lets us define how our server will respond to 
+A [`Service`][service] lets us define how our server will respond to 
 incoming requests. It represents an async function that takes a 
-[`Request`][request] and returns a [`Response`][response] or an error at some
-point in the future. 
+[`Request`][request] and returns a `Future`. When the processing of this
+future is complete, it will resolve to a [`Response`][response] or an error.
 
 Hyper provides a utility for creating a `Service` from a function that should 
 serve most usecases: [`service_fn`][service_fn]. We will use this to create 
@@ -42,10 +42,10 @@ a service from our `hello` function below when we're ready to start our
 server.
 
 ```rust
-#use std::convert::Infallible;
-#use http_body_util::Full;
-#use hyper::body::Bytes;
-#use hyper::{Request, Response};
+# use std::convert::Infallible;
+# use http_body_util::Full;
+# use hyper::body::Bytes;
+# use hyper::{Request, Response};
 async fn hello(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
     Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
 }
@@ -63,20 +63,20 @@ Lastly, we need to hook up our `hello` service into a running hyper server.
 We'll dive into the specifics of some of these things in another guide.
 
 ```rust
-#use std::convert::Infallible;
-#use std::net::SocketAddr;
-#
-#use http_body_util::Full;
-#use hyper::body::Bytes;
-#use hyper::server::conn::http1;
-#use hyper::service::service_fn;
-#use hyper::{Request, Response};
-#use tokio::net::TcpListener;
-#async fn hello(
-#    _: Request<hyper::body::Incoming>,
-#) -> Result<Response<Full<Bytes>>, Infallible> {
-#    Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
-#}
+# use std::convert::Infallible;
+# use std::net::SocketAddr;
+# 
+# use http_body_util::Full;
+# use hyper::body::Bytes;
+# use hyper::server::conn::http1;
+# use hyper::service::service_fn;
+# use hyper::{Request, Response};
+# use tokio::net::TcpListener;
+# async fn hello(
+#     _: Request<hyper::body::Incoming>,
+# ) -> Result<Response<Full<Bytes>>, Infallible> {
+#     Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
+# }
 #[tokio::main]
 async fn main() {
     let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
@@ -108,11 +108,12 @@ async fn main() {
 To see all the snippets put together, check out the [full example][example]!
 
 Also, if `service_fn` doesn't meet your requirements and you'd like to implement 
-`Service` yourself, see this [`example`][impl service].
+`Service` yourself, see this [example][impl service].
 
-[service]: {{ site.docs_url }}/hyper/1.0.0-rc.1/hyper/service/trait.Service.html
-[request]: {{ site.docs_url }}/hyper/1.0.0-rc.1/hyper/struct.Request.html
-[response]: {{ site.docs_url }}/hyper/1.0.0-rc.1/hyper/struct.Response.html
+[service]: {{ site.docs_url }}/hyper/service/trait.Service.html
+[service_fn]: {{ site.docs_url }}/hyper/service/fn.service_fn.html
+[request]: {{ site.docs_url }}/hyper/struct.Request.html
+[response]: {{ site.docs_url }}/hyper/struct.Response.html
 [parts]: {{ site.docs_url }}/http/0.2.8/http/response/struct.Parts.html
 [example]: {{ site.examples_url }}/hello.rs
 [impl service]: {{ site.examples_url }}/service_struct_impl.rs

From b35b24ccf6acb7e07992c3c4edf02244434e6efa Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sun, 11 Dec 2022 22:16:45 +0100
Subject: [PATCH 027/138] docs(server): first iteration of echo guide

---
 _guides/server/echo.md        | 237 +++++++++++++++++++---------------
 _guides/server/hello-world.md |   8 +-
 2 files changed, 134 insertions(+), 111 deletions(-)

diff --git a/_guides/server/echo.md b/_guides/server/echo.md
index e454824..9f86ff7 100644
--- a/_guides/server/echo.md
+++ b/_guides/server/echo.md
@@ -2,7 +2,7 @@
 title: Echo, echo, echo
 ---
 
-You already have a [Hello World server](hello-world.md)? Excellent! Usually,
+You already have a [Hello World server](../hello-world)? Excellent! Usually,
 servers do more than just spit out the same body for every request. To
 exercise several more parts of hyper, this guide will go through
 building an echo server.
@@ -17,88 +17,106 @@ routing. We want to have a route explaining instructions on how to use
 our server, and another for receiving data. Oh, and we should also
 handle the case when someone asks for a route we don't know!
 
-We're going to be using more of the [futures][future-crate] crate, so let's add
-that as a dependency:
-
-```toml
-[dependencies]
-hyper = { version = "0.14", features = ["full"] }
-tokio = { version = "1", features = ["full"] }
-futures = "0.3"
-```
-
-Then, we need to add some to our imports:
+Before we get started we need to add some new imports:
 
 ```rust
-# extern crate hyper;
-# extern crate futures;
-use hyper::{Method, StatusCode};
+use hyper::{body::Body, Method, Request, Response, StatusCode};
+use http_body_util::{combinators::BoxBody, BodyExt, Full};
 # fn main() {}
 ```
 
-And make some changes to your `Service`, such as returning a `Future` of a `Response`,
-since we may not have one ready immediately:
+Next, we need to make some changes to our `Service` function, but as you can see
+it's still just an async function that takes a `Request` and returns a `Response`
+future, and you can pass it to your server just like we did for the `hello` service.
 
-```rust
-# extern crate futures;
-# extern crate hyper;
-# use futures::future::{self, Future};
-# use hyper::{Body, Method, Request, Response, StatusCode};
-#
-async fn echo(req: Request<Body>) -> Result<Response<Body>, hyper::Error> {
-    let mut response = Response::new(Body::empty());
+Unlike our `hello` service where we didn't care about the request body and 
+we always returned a single chunk of bytes containing our greeting, we're now
+going to want a bit more freedom in how we shape our response `Body`. To achieve
+this we will change the type of the `Body` in our `Response` to a boxed trait object. 
+We only care that the response body implements the [Body](https://docs.rs/http-body/1.0.0-rc1/http_body/trait.Body.html) trait, that its data is `Bytes` and its error is a `hyper::Error`.
 
+```rust
+# use std::net::SocketAddr;
+# 
+# use bytes::Bytes;
+# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
+# use hyper::server::conn::http1;
+# use hyper::service::service_fn;
+# use hyper::{body::Body, Method, Request, Response, StatusCode};
+# use tokio::net::TcpListener;
+async fn echo(
+    req: Request<hyper::body::Incoming>,
+) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
     match (req.method(), req.uri().path()) {
-        (&Method::GET, "/") => {
-            *response.body_mut() = Body::from("Try POSTing data to /echo");
-        },
+        (&Method::GET, "/") => Ok(Response::new(full(
+            "Try POSTing data to /echo",
+        ))),
         (&Method::POST, "/echo") => {
             // we'll be back
         },
-        _ => {
-            *response.status_mut() = StatusCode::NOT_FOUND;
-        },
-    };
 
-    Ok(response)
+        // Return 404 Not Found for other routes.
+        _ => {
+            let mut not_found = Response::new(empty());
+            *not_found.status_mut() = StatusCode::NOT_FOUND;
+            Ok(not_found)
+        }
+    }
+}
+// We create some utility functions to make Empty and Full bodies
+// fit our broadened Response body type.
+fn empty() -> BoxBody<Bytes, hyper::Error> {
+    Empty::<Bytes>::new()
+        .map_err(|never| match never {})
+        .boxed()
+}
+fn full<T: Into<Bytes>>(chunk: T) -> BoxBody<Bytes, hyper::Error> {
+    Full::new(chunk.into())
+        .map_err(|never| match never {})
+        .boxed()
 }
 # fn main() {}
 ```
 
-We built a super simple routing table just by matching on the `method`
-and `path` of an incoming `Request`. If someone requests `GET /`, our
-service will let them know they should try our echo powers out. We also
-are checking for `POST /echo`, but currently don't do anything about it.
+We built a super simple routing table just by matching on the `method` and `path` 
+of an incoming `Request`. If someone requests `GET /`, our service will let them 
+know they should try our echo powers out. We also check for `POST /echo`, but 
+currently don't do anything about it.
 
-Our third rule catches any other method and path combination, and
-changes the `StatusCode` of the `Response`. The default status of a
-`Response` is HTTP's `200 OK` (`StatusCode::OK`), which is correct for
-the other routes. But the third case will instead send back `404 Not
-Found`.
+Our third rule catches any other method and path combination, and changes the 
+`StatusCode` of the `Response`. The default status of a `Response` is HTTP’s 
+`200 OK` (`StatusCode::OK`), which is correct for the other routes. But the third 
+case will instead send back `404 Not Found`.
 
 ## Body Streams
 
-Now let's get that echo in place. We'll start with the simplest solution, and
-then make alterations exercising more complex things you can do with the
-`Body` streams.
+Now let's get that echo in place. An HTTP body is a stream of 
+`Frames`, each [Frame](https://docs.rs/http-body/1.0.0-rc1/http_body/struct.Frame.html) 
+containing parts of the `Body` data or trailers. So rather than reading the entire `Body` 
+into a buffer before sending our response, we can stream each frame as it arrives. 
+We'll start with the simplest solution, and then make alterations exercising more complex 
+things you can do with the `Body` streams.
 
 First up, plain echo. Both the `Request` and the `Response` have body streams,
-and by default, you can easily just pass the `Body` of the `Request` into the
-`Response`.
+and by default, you can easily pass the `Body` of the `Request` into a `Response`.
 
 ```rust
-# extern crate hyper;
-# use hyper::{Body, Method, Request, Response};
-# fn echo(req: Request<Body>) -> Response<Body> {
-#     let mut response = Response::default();
-#     match (req.method(), req.uri().path()) {
-// inside that match from before
-(&Method::POST, "/echo") => {
-    *response.body_mut() = req.into_body();
-},
-#         _ => unreachable!(),
-#     }
-#     response
+# use std::net::SocketAddr;
+# 
+# use bytes::Bytes;
+# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
+# use hyper::server::conn::http1;
+# use hyper::service::service_fn;
+# use hyper::{body::Body, Method, Request, Response, StatusCode};
+# use tokio::net::TcpListener;
+# async fn echo(
+#    req: Request<hyper::body::Incoming>,
+# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
+#    match (req.method(), req.uri().path()) {
+// Inside the match from before
+(&Method::POST, "/echo") => Ok(Response::new(req.into_body().boxed())),
+#        _ => unreachable!(),
+#    }
 # }
 # fn main() {}
 ```
@@ -106,49 +124,48 @@ and by default, you can easily just pass the `Body` of the `Request` into the
 Running our server now will echo any data we `POST` to `/echo`. That was easy.
 What if we wanted to uppercase all the text? We could use a `map` on our streams.
 
-### Body mapping
-
-We're going to need a couple of extra imports, so let's add those to the top of the file:
-
-```rust
-# extern crate futures;
-# extern crate hyper;
-use futures::TryStreamExt as _;
-# fn main() {}
-```
+## Body mapping
 
-A `Body` implements the `Stream` trait from futures, producing a bunch of
-`Bytes`s, as data comes in. `Bytes` is just a convenient type from hyper
-that represents a bunch of bytes. It can be easily converted into other
+Every data `Frame` of our body stream is a chunk of bytes, which we can conveniently
+represent using the `Bytes` type from hyper. It can be easily converted into other
 typical containers of bytes.
 
-Next, let's add a new `/echo/uppercase` route mapping the body to uppercase:
+Next, let's add a new `/echo/uppercase` route, mapping each byte in the data `Frame`s
+of our request body to uppercase, and returning the stream in our `Response`:
 
 ```rust
-# extern crate hyper;
-# extern crate futures;
-# use futures::TryStreamExt as _;
-# use hyper::{Body, Method, Request, Response};
-# fn echo(req: Request<Body>) -> Response<Body> {
-#     let mut response = Response::default();
-#     match (req.method(), req.uri().path()) {
+# use std::net::SocketAddr;
+# 
+# use bytes::Bytes;
+# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
+# use hyper::server::conn::http1;
+# use hyper::service::service_fn;
+# use hyper::{body::Body, Method, Request, Response, StatusCode};
+# use tokio::net::TcpListener;
+# async fn echo(
+#    req: Request<hyper::body::Incoming>,
+# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
+#    match (req.method(), req.uri().path()) {
 // Yet another route inside our match block...
 (&Method::POST, "/echo/uppercase") => {
-    // This is actually a new `futures::Stream`...
-    let mapping = req
-        .into_body()
-        .map_ok(|chunk| {
-            chunk.iter()
+    // Map this body's frame to a different type
+    let frame_stream = req.into_body().map_frame(|frame| {
+        let frame = if let Some(data) = frame.into_data() {
+            // Convert every byte in every Data frame to uppercase
+            data.iter()
                 .map(|byte| byte.to_ascii_uppercase())
-                .collect::<Vec<u8>>()
-        });
+                .collect::<Bytes>()
+        } else {
+            Bytes::new()
+        };
 
-    // Use `Body::wrap_stream` to convert it to a `Body`...
-    *response.body_mut() = Body::wrap_stream(mapping);
+        Frame::data(frame)
+    });
+
+    Ok(Response::new(frame_stream.boxed()))
 },
 #         _ => unreachable!(),
 #     }
-#     response
 # }
 # fn main() {}
 ```
@@ -164,33 +181,40 @@ back to us? We can't really stream the data as it comes in, since we need to
 find the end before we can respond. To do this, we can explore how to easily
 collect the full body.
 
-In this case, we can't really generate a `Response` immediately. Instead, we
-must wait for the full request body to be received.
-
-We want to concatenate the request body, and map the result into our `reverse` function, and return the eventual result. We can make use of the `hyper::body::to_bytes` utility function to make this easy.
+We want to collect the entire request body and map the result into our `reverse` 
+function, then return the eventual result. If we import the `http_body_util::BodyExt`
+extension trait, we can call the `collect` method on our body, which will drive the
+stream to completion, collecting all the data and trailer frames into a `Collected` type.
+We can easily turn the `Collected` body into bytes by calling its `into_bytes` method.
 
 ```rust
-# extern crate hyper;
-# use hyper::{Body, Method, Request, Response};
-# async fn echo(req: Request<Body>) -> Result<Response<Body>, hyper::Error> {
-#     let mut response = Response::default();
-#     match (req.method(), req.uri().path()) {
+# use std::net::SocketAddr;
+# 
+# use bytes::Bytes;
+# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
+# use hyper::server::conn::http1;
+# use hyper::service::service_fn;
+# use hyper::{body::Body, Method, Request, Response, StatusCode};
+# use tokio::net::TcpListener;
+# async fn echo(
+#    req: Request<hyper::body::Incoming>,
+# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
+#    match (req.method(), req.uri().path()) {
 // Yet another route inside our match block...
-(&Method::POST, "/echo/reverse") => {
-    // Await the full body to be concatenated into a single `Bytes`...
-    let full_body = hyper::body::to_bytes(req.into_body()).await?;
+(&Method::POST, "/echo/reversed") => {
+    // Await the whole body to be collected into a single `Bytes`...
+    let whole_body = req.collect().await?.to_bytes();
 
-    // Iterate the full body in reverse order and collect into a new Vec.
-    let reversed = full_body.iter()
+    // Iterate the whole body in reverse order and collect into a new Vec.
+    let reversed = whole_body.iter()
         .rev()
         .cloned()
         .collect::<Vec<u8>>();
 
-    *response.body_mut() = reversed.into();
+    Ok(Response::new(full(reversed_body)))
 },
 #         _ => unreachable!(),
 #     }
-#     Ok(response)
 # }
 # fn main() {}
 ```
@@ -198,4 +222,3 @@ We want to concatenate the request body, and map the result into our `reverse` f
 You can see a compiling [example here][example].
 
 [example]: {{ site.examples_url }}/echo.rs
-[future-crate]: https://github.com/rust-lang-nursery/futures-rs
diff --git a/_guides/server/hello-world.md b/_guides/server/hello-world.md
index 4f6ea47..4d9888d 100644
--- a/_guides/server/hello-world.md
+++ b/_guides/server/hello-world.md
@@ -60,7 +60,7 @@ set automatically.
 
 Lastly, we need to hook up our `hello` service into a running hyper server.
 
-We'll dive into the specifics of some of these things in another guide.
+We'll dive in to the specifics of some of these things in another guide.
 
 ```rust
 # use std::convert::Infallible;
@@ -84,13 +84,13 @@ async fn main() {
     // We create a TcpListener and bind it to 127.0.0.1:3000
     let listener = TcpListener::bind(addr).await?;
 
-    // We start a loop to continuosly accept incoming connections
+    // We start a loop to continuously accept incoming connections
     loop {
         let (stream, _) = listener.accept().await?;
 
-        // Spawn a `tokio::task` to serve multiple connections concurrently
+        // Spawn a tokio task to serve multiple connections concurrently
         tokio::task::spawn(async move {
-            // Finally, we bind the incoming connection to our `hello_world` service
+            // Finally, we bind the incoming connection to our `hello` service
             if let Err(err) = http1::Builder::new()
                 // `service_fn` converts our function in a `Service`
                 .serve_connection(stream, service_fn(hello))

From f7581675b45a43adac35f554dcd8e8da6ded771e Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sun, 11 Dec 2022 22:35:32 +0100
Subject: [PATCH 028/138] docs(server): clean up deps

---
 _guides/server/echo.md | 36 +++++++++---------------------------
 1 file changed, 9 insertions(+), 27 deletions(-)

diff --git a/_guides/server/echo.md b/_guides/server/echo.md
index 9f86ff7..b39db9c 100644
--- a/_guides/server/echo.md
+++ b/_guides/server/echo.md
@@ -20,8 +20,9 @@ handle the case when someone asks for a route we don't know!
 Before we get started we need to add some new imports:
 
 ```rust
-use hyper::{body::Body, Method, Request, Response, StatusCode};
-use http_body_util::{combinators::BoxBody, BodyExt, Full};
+use hyper::body::Frame;
+use hyper::{Method, StatusCode};
+use http_body_util::{combinators::BoxBody, BodyExt};
 # fn main() {}
 ```
 
@@ -36,14 +37,9 @@ this we will change the type of the `Body` in our `Response` to a boxed trait ob
 We only care that the response body implements the [Body](https://docs.rs/http-body/1.0.0-rc1/http_body/trait.Body.html) trait, that its data is `Bytes` and its error is a `hyper::Error`.
 
 ```rust
-# use std::net::SocketAddr;
-# 
 # use bytes::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::server::conn::http1;
-# use hyper::service::service_fn;
-# use hyper::{body::Body, Method, Request, Response, StatusCode};
-# use tokio::net::TcpListener;
+# use hyper::{Method, Request, Response, StatusCode};
 async fn echo(
     req: Request<hyper::body::Incoming>,
 ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
@@ -101,14 +97,9 @@ First up, plain echo. Both the `Request` and the `Response` have body streams,
 and by default, you can easily pass the `Body` of the `Request` into a `Response`.
 
 ```rust
-# use std::net::SocketAddr;
-# 
 # use bytes::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::server::conn::http1;
-# use hyper::service::service_fn;
-# use hyper::{body::Body, Method, Request, Response, StatusCode};
-# use tokio::net::TcpListener;
+# use hyper::{Method, Request, Response, StatusCode};
 # async fn echo(
 #    req: Request<hyper::body::Incoming>,
 # ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
@@ -134,14 +125,10 @@ Next, let's add a new `/echo/uppercase` route, mapping each byte in the data `Fr
 of our request body to uppercase, and returning the stream in our `Response`:
 
 ```rust
-# use std::net::SocketAddr;
-# 
 # use bytes::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::server::conn::http1;
-# use hyper::service::service_fn;
-# use hyper::{body::Body, Method, Request, Response, StatusCode};
-# use tokio::net::TcpListener;
+# use hyper::body::Frame;
+# use hyper::{Method, Request, Response, StatusCode};
 # async fn echo(
 #    req: Request<hyper::body::Incoming>,
 # ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
@@ -188,14 +175,9 @@ stream to completion, collecting all the data and trailer frames into a `Collect
 We can easily turn the `Collected` body into bytes by calling its `into_bytes` method.
 
 ```rust
-# use std::net::SocketAddr;
-# 
 # use bytes::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::server::conn::http1;
-# use hyper::service::service_fn;
-# use hyper::{body::Body, Method, Request, Response, StatusCode};
-# use tokio::net::TcpListener;
+# use hyper::{Method, Request, Response, StatusCode};
 # async fn echo(
 #    req: Request<hyper::body::Incoming>,
 # ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
@@ -206,7 +188,7 @@ We can easily turn the `Collected` body into bytes by calling its `into_bytes` m
     let whole_body = req.collect().await?.to_bytes();
 
     // Iterate the whole body in reverse order and collect into a new Vec.
-    let reversed = whole_body.iter()
+    let reversed_body = whole_body.iter()
         .rev()
         .cloned()
         .collect::<Vec<u8>>();

From 1236e11bf6913afad5bdd34571de8ae164862c0f Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sun, 11 Dec 2022 22:41:36 +0100
Subject: [PATCH 029/138] refactor(server): rephrasing

---
 _guides/server/echo.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/_guides/server/echo.md b/_guides/server/echo.md
index b39db9c..b468799 100644
--- a/_guides/server/echo.md
+++ b/_guides/server/echo.md
@@ -172,7 +172,8 @@ We want to collect the entire request body and map the result into our `reverse`
 function, then return the eventual result. If we import the `http_body_util::BodyExt`
 extension trait, we can call the `collect` method on our body, which will drive the
 stream to completion, collecting all the data and trailer frames into a `Collected` type.
-We can easily turn the `Collected` body into bytes by calling its `into_bytes` method.
+We can easily turn the `Collected` body into a single `Bytes` by calling its `into_bytes` 
+method.
 
 ```rust
 # use bytes::Bytes;

From 138b24beec452811713dcf3dcf0a1216464d8ee2 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Wed, 14 Dec 2022 22:03:50 +0100
Subject: [PATCH 030/138] refactor: split guides up into legacy and master

---
 _guides/{ => legacy}/client/advanced.md       |   0
 _guides/{ => legacy}/client/basic.md          |   0
 _guides/{ => legacy}/client/configuration.md  |   0
 _guides/{ => legacy}/client/index.md          |   0
 _guides/legacy/index.md                       |  23 ++
 _guides/{ => legacy}/server/echo.md           |   0
 .../{ => legacy}/server/graceful-shutdown.md  |   0
 _guides/{ => legacy}/server/hello-world.md    |   0
 _guides/{ => legacy}/server/index.md          |   0
 _guides/master/index.md                       |  23 ++
 _guides/master/server/echo.md                 | 207 ++++++++++++++++++
 _guides/master/server/graceful-shutdown.md    |  60 +++++
 _guides/master/server/hello-world.md          | 119 ++++++++++
 _guides/master/server/index.md                |   7 +
 14 files changed, 439 insertions(+)
 rename _guides/{ => legacy}/client/advanced.md (100%)
 rename _guides/{ => legacy}/client/basic.md (100%)
 rename _guides/{ => legacy}/client/configuration.md (100%)
 rename _guides/{ => legacy}/client/index.md (100%)
 create mode 100644 _guides/legacy/index.md
 rename _guides/{ => legacy}/server/echo.md (100%)
 rename _guides/{ => legacy}/server/graceful-shutdown.md (100%)
 rename _guides/{ => legacy}/server/hello-world.md (100%)
 rename _guides/{ => legacy}/server/index.md (100%)
 create mode 100644 _guides/master/index.md
 create mode 100644 _guides/master/server/echo.md
 create mode 100644 _guides/master/server/graceful-shutdown.md
 create mode 100644 _guides/master/server/hello-world.md
 create mode 100644 _guides/master/server/index.md

diff --git a/_guides/client/advanced.md b/_guides/legacy/client/advanced.md
similarity index 100%
rename from _guides/client/advanced.md
rename to _guides/legacy/client/advanced.md
diff --git a/_guides/client/basic.md b/_guides/legacy/client/basic.md
similarity index 100%
rename from _guides/client/basic.md
rename to _guides/legacy/client/basic.md
diff --git a/_guides/client/configuration.md b/_guides/legacy/client/configuration.md
similarity index 100%
rename from _guides/client/configuration.md
rename to _guides/legacy/client/configuration.md
diff --git a/_guides/client/index.md b/_guides/legacy/client/index.md
similarity index 100%
rename from _guides/client/index.md
rename to _guides/legacy/client/index.md
diff --git a/_guides/legacy/index.md b/_guides/legacy/index.md
new file mode 100644
index 0000000..3cf51c6
--- /dev/null
+++ b/_guides/legacy/index.md
@@ -0,0 +1,23 @@
+---
+title:  Getting Started
+layout: guide
+permalink: /guides/
+---
+
+hyper is an HTTP library for the Rust language.
+
+You can start using it by first adding it to your `Cargo.toml`:
+
+```toml
+[dependencies]
+hyper = "0.14"
+```
+
+- If building a web server, continue with the [Server guide][].
+- If trying to talk to a server, continue with the [Client guide][].
+
+You could also look at the [generated API documentaton][docs].
+
+[docs]: {{ site.docs_url }}
+[Server guide]: server/hello-world.md
+[Client guide]: client/basic.md
diff --git a/_guides/server/echo.md b/_guides/legacy/server/echo.md
similarity index 100%
rename from _guides/server/echo.md
rename to _guides/legacy/server/echo.md
diff --git a/_guides/server/graceful-shutdown.md b/_guides/legacy/server/graceful-shutdown.md
similarity index 100%
rename from _guides/server/graceful-shutdown.md
rename to _guides/legacy/server/graceful-shutdown.md
diff --git a/_guides/server/hello-world.md b/_guides/legacy/server/hello-world.md
similarity index 100%
rename from _guides/server/hello-world.md
rename to _guides/legacy/server/hello-world.md
diff --git a/_guides/server/index.md b/_guides/legacy/server/index.md
similarity index 100%
rename from _guides/server/index.md
rename to _guides/legacy/server/index.md
diff --git a/_guides/master/index.md b/_guides/master/index.md
new file mode 100644
index 0000000..b44dadd
--- /dev/null
+++ b/_guides/master/index.md
@@ -0,0 +1,23 @@
+---
+title:  Getting Started
+layout: guide
+permalink: /guides/
+---
+
+hyper is an HTTP library for the Rust language.
+
+You can start using it by first adding it to your `Cargo.toml`:
+
+```toml
+[dependencies]
+hyper = { version = "1.0.0-rc.1", features = ["full"] }
+```
+
+- If building a web server, continue with the [Server guide][].
+- If trying to talk to a server, continue with the [Client guide][].
+
+You could also look at the [generated API documentaton][docs].
+
+[docs]: {{ site.docs_url }}
+[Server guide]: server/hello-world.md
+[Client guide]: client/basic.md
diff --git a/_guides/master/server/echo.md b/_guides/master/server/echo.md
new file mode 100644
index 0000000..b468799
--- /dev/null
+++ b/_guides/master/server/echo.md
@@ -0,0 +1,207 @@
+---
+title: Echo, echo, echo
+---
+
+You already have a [Hello World server](../hello-world)? Excellent! Usually,
+servers do more than just spit out the same body for every request. To
+exercise several more parts of hyper, this guide will go through
+building an echo server.
+
+An echo server will listen for incoming connections and send back the
+request body as the response body on `POST` requests.
+
+## Routing
+
+First thing we will do, beyond renaming our service to `echo`, is setup some
+routing. We want to have a route explaining instructions on how to use
+our server, and another for receiving data. Oh, and we should also
+handle the case when someone asks for a route we don't know!
+
+Before we get started we need to add some new imports:
+
+```rust
+use hyper::body::Frame;
+use hyper::{Method, StatusCode};
+use http_body_util::{combinators::BoxBody, BodyExt};
+# fn main() {}
+```
+
+Next, we need to make some changes to our `Service` function, but as you can see
+it's still just an async function that takes a `Request` and returns a `Response`
+future, and you can pass it to your server just like we did for the `hello` service.
+
+Unlike our `hello` service where we didn't care about the request body and 
+we always returned a single chunk of bytes containing our greeting, we're now
+going to want a bit more freedom in how we shape our response `Body`. To achieve
+this we will change the type of the `Body` in our `Response` to a boxed trait object. 
+We only care that the response body implements the [Body](https://docs.rs/http-body/1.0.0-rc1/http_body/trait.Body.html) trait, that its data is `Bytes` and its error is a `hyper::Error`.
+
+```rust
+# use bytes::Bytes;
+# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
+# use hyper::{Method, Request, Response, StatusCode};
+async fn echo(
+    req: Request<hyper::body::Incoming>,
+) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
+    match (req.method(), req.uri().path()) {
+        (&Method::GET, "/") => Ok(Response::new(full(
+            "Try POSTing data to /echo",
+        ))),
+        (&Method::POST, "/echo") => {
+            // we'll be back
+        },
+
+        // Return 404 Not Found for other routes.
+        _ => {
+            let mut not_found = Response::new(empty());
+            *not_found.status_mut() = StatusCode::NOT_FOUND;
+            Ok(not_found)
+        }
+    }
+}
+// We create some utility functions to make Empty and Full bodies
+// fit our broadened Response body type.
+fn empty() -> BoxBody<Bytes, hyper::Error> {
+    Empty::<Bytes>::new()
+        .map_err(|never| match never {})
+        .boxed()
+}
+fn full<T: Into<Bytes>>(chunk: T) -> BoxBody<Bytes, hyper::Error> {
+    Full::new(chunk.into())
+        .map_err(|never| match never {})
+        .boxed()
+}
+# fn main() {}
+```
+
+We built a super simple routing table just by matching on the `method` and `path` 
+of an incoming `Request`. If someone requests `GET /`, our service will let them 
+know they should try our echo powers out. We also check for `POST /echo`, but 
+currently don't do anything about it.
+
+Our third rule catches any other method and path combination, and changes the 
+`StatusCode` of the `Response`. The default status of a `Response` is HTTP’s 
+`200 OK` (`StatusCode::OK`), which is correct for the other routes. But the third 
+case will instead send back `404 Not Found`.
+
+## Body Streams
+
+Now let's get that echo in place. An HTTP body is a stream of 
+`Frames`, each [Frame](https://docs.rs/http-body/1.0.0-rc1/http_body/struct.Frame.html) 
+containing parts of the `Body` data or trailers. So rather than reading the entire `Body` 
+into a buffer before sending our response, we can stream each frame as it arrives. 
+We'll start with the simplest solution, and then make alterations exercising more complex 
+things you can do with the `Body` streams.
+
+First up, plain echo. Both the `Request` and the `Response` have body streams,
+and by default, you can easily pass the `Body` of the `Request` into a `Response`.
+
+```rust
+# use bytes::Bytes;
+# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
+# use hyper::{Method, Request, Response, StatusCode};
+# async fn echo(
+#    req: Request<hyper::body::Incoming>,
+# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
+#    match (req.method(), req.uri().path()) {
+// Inside the match from before
+(&Method::POST, "/echo") => Ok(Response::new(req.into_body().boxed())),
+#        _ => unreachable!(),
+#    }
+# }
+# fn main() {}
+```
+
+Running our server now will echo any data we `POST` to `/echo`. That was easy.
+What if we wanted to uppercase all the text? We could use a `map` on our streams.
+
+## Body mapping
+
+Every data `Frame` of our body stream is a chunk of bytes, which we can conveniently
+represent using the `Bytes` type from hyper. It can be easily converted into other
+typical containers of bytes.
+
+Next, let's add a new `/echo/uppercase` route, mapping each byte in the data `Frame`s
+of our request body to uppercase, and returning the stream in our `Response`:
+
+```rust
+# use bytes::Bytes;
+# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
+# use hyper::body::Frame;
+# use hyper::{Method, Request, Response, StatusCode};
+# async fn echo(
+#    req: Request<hyper::body::Incoming>,
+# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
+#    match (req.method(), req.uri().path()) {
+// Yet another route inside our match block...
+(&Method::POST, "/echo/uppercase") => {
+    // Map this body's frame to a different type
+    let frame_stream = req.into_body().map_frame(|frame| {
+        let frame = if let Some(data) = frame.into_data() {
+            // Convert every byte in every Data frame to uppercase
+            data.iter()
+                .map(|byte| byte.to_ascii_uppercase())
+                .collect::<Bytes>()
+        } else {
+            Bytes::new()
+        };
+
+        Frame::data(frame)
+    });
+
+    Ok(Response::new(frame_stream.boxed()))
+},
+#         _ => unreachable!(),
+#     }
+# }
+# fn main() {}
+```
+
+And like that, we have two echo routes: `/echo` which does no transformation,
+and `/echo/uppercase` which returns all bytes after converting them to ASCII
+uppercase.
+
+## Buffering the Request Body
+
+What if we want our echo service to reverse the data it received and send it
+back to us? We can't really stream the data as it comes in, since we need to
+find the end before we can respond. To do this, we can explore how to easily
+collect the full body.
+
+We want to collect the entire request body and map the result into our `reverse` 
+function, then return the eventual result. If we import the `http_body_util::BodyExt`
+extension trait, we can call the `collect` method on our body, which will drive the
+stream to completion, collecting all the data and trailer frames into a `Collected` type.
+We can easily turn the `Collected` body into a single `Bytes` by calling its `into_bytes` 
+method.
+
+```rust
+# use bytes::Bytes;
+# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
+# use hyper::{Method, Request, Response, StatusCode};
+# async fn echo(
+#    req: Request<hyper::body::Incoming>,
+# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
+#    match (req.method(), req.uri().path()) {
+// Yet another route inside our match block...
+(&Method::POST, "/echo/reversed") => {
+    // Await the whole body to be collected into a single `Bytes`...
+    let whole_body = req.collect().await?.to_bytes();
+
+    // Iterate the whole body in reverse order and collect into a new Vec.
+    let reversed_body = whole_body.iter()
+        .rev()
+        .cloned()
+        .collect::<Vec<u8>>();
+
+    Ok(Response::new(full(reversed_body)))
+},
+#         _ => unreachable!(),
+#     }
+# }
+# fn main() {}
+```
+
+You can see a compiling [example here][example].
+
+[example]: {{ site.examples_url }}/echo.rs
diff --git a/_guides/master/server/graceful-shutdown.md b/_guides/master/server/graceful-shutdown.md
new file mode 100644
index 0000000..0f02760
--- /dev/null
+++ b/_guides/master/server/graceful-shutdown.md
@@ -0,0 +1,60 @@
+---
+title:  Gracefully Shutdown a Server
+layout: guide
+---
+
+hyper `Server`s have the ability to "gracefully" shutdown. This means stopping to accept new requests, and shutting down once all in-progress requests have completed.
+
+We're going to assume you already have server code working, such as from following the [Hello World](hello-world.md) or [Echo](echo.md) guides.
+
+The `Server` type has a `with_graceful_shutdown` method that is passed a `Future` of your choosing. Once that `Future` completes, the `Server` will start the shutdown process. It could be any `Future`, such as a `oneshot` channel. In this guide, we'll setup a signal handler to listen for the user pressing `CTRL+C`.
+
+First, let's create a `shutdown_signal` async function:
+
+```rust
+# extern crate tokio;
+async fn shutdown_signal() {
+    // Wait for the CTRL+C signal
+    tokio::signal::ctrl_c()
+        .await
+        .expect("failed to install CTRL+C signal handler");
+}
+# fn main() {}
+```
+
+Next, we can plug this into an existing server:
+
+```rust
+# extern crate hyper;
+# extern crate tokio;
+# mod no_run {
+# use std::convert::Infallible;
+# use std::net::SocketAddr;
+# use hyper::{Body, Request, Response, Server};
+# use hyper::service::{make_service_fn, service_fn};
+# async fn hello_world(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
+#     Ok(Response::new("Hello, World".into()))
+# }
+# async fn shutdown_signal() {}
+#[tokio::main]
+async fn main() {
+#    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
+#    let make_svc = make_service_fn(|_conn| async {
+#        Ok::<_, Infallible>(service_fn(hello_world))
+#    });
+    // Constructed `addr` and `make_svc` from your app above..
+
+    // And construct the `Server` like normal...
+    let server = Server::bind(&addr).serve(make_svc);
+
+    // And now add a graceful shutdown signal...
+    let graceful = server.with_graceful_shutdown(shutdown_signal());
+
+    // Run this server for... forever!
+    if let Err(e) = graceful.await {
+        eprintln!("server error: {}", e);
+    }
+}
+# }
+# fn main() {}
+```
diff --git a/_guides/master/server/hello-world.md b/_guides/master/server/hello-world.md
new file mode 100644
index 0000000..4d9888d
--- /dev/null
+++ b/_guides/master/server/hello-world.md
@@ -0,0 +1,119 @@
+---
+title:  Getting Started with a Server
+layout: guide
+---
+
+Let's start by making a "Hello, World!" server, and expand from there.
+
+First we need to declare our dependencies, let's add the following to our `Cargo.toml`:
+
+```toml
+[dependencies]
+hyper = { version = "1.0.0-rc.1", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
+http-body-util = "0.1.0-rc.1" 
+```
+
+Next, we need to add some imports in our `main.rs` file:
+
+```rust
+use std::convert::Infallible;
+use std::net::SocketAddr;
+
+use http_body_util::Full;
+use hyper::body::Bytes;
+use hyper::server::conn::http1;
+use hyper::service::service_fn;
+use hyper::{Request, Response};
+use tokio::net::TcpListener;
+# fn main() {}
+```
+
+## Creating a Service
+
+A [`Service`][service] lets us define how our server will respond to 
+incoming requests. It represents an async function that takes a 
+[`Request`][request] and returns a `Future`. When the processing of this
+future is complete, it will resolve to a [`Response`][response] or an error.
+
+Hyper provides a utility for creating a `Service` from a function that should 
+serve most usecases: [`service_fn`][service_fn]. We will use this to create 
+a service from our `hello` function below when we're ready to start our 
+server.
+
+```rust
+# use std::convert::Infallible;
+# use http_body_util::Full;
+# use hyper::body::Bytes;
+# use hyper::{Request, Response};
+async fn hello(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
+    Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
+}
+```
+
+Using this function as a service, we tell our server to respond to all requests 
+with a default `200 OK` status. The response `Body` will contain our friendly
+greeting as a single chunk of bytes, and the `Content-Length` header will be 
+set automatically.
+
+## Starting the Server
+
+Lastly, we need to hook up our `hello` service into a running hyper server.
+
+We'll dive in to the specifics of some of these things in another guide.
+
+```rust
+# use std::convert::Infallible;
+# use std::net::SocketAddr;
+# 
+# use http_body_util::Full;
+# use hyper::body::Bytes;
+# use hyper::server::conn::http1;
+# use hyper::service::service_fn;
+# use hyper::{Request, Response};
+# use tokio::net::TcpListener;
+# async fn hello(
+#     _: Request<hyper::body::Incoming>,
+# ) -> Result<Response<Full<Bytes>>, Infallible> {
+#     Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
+# }
+#[tokio::main]
+async fn main() {
+    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
+
+    // We create a TcpListener and bind it to 127.0.0.1:3000
+    let listener = TcpListener::bind(addr).await?;
+
+    // We start a loop to continuously accept incoming connections
+    loop {
+        let (stream, _) = listener.accept().await?;
+
+        // Spawn a tokio task to serve multiple connections concurrently
+        tokio::task::spawn(async move {
+            // Finally, we bind the incoming connection to our `hello` service
+            if let Err(err) = http1::Builder::new()
+                // `service_fn` converts our function in a `Service`
+                .serve_connection(stream, service_fn(hello))
+                .await
+            {
+                println!("Error serving connection: {:?}", err);
+            }
+        });
+    }
+}
+# }
+# fn main() {}
+```
+
+To see all the snippets put together, check out the [full example][example]!
+
+Also, if `service_fn` doesn't meet your requirements and you'd like to implement 
+`Service` yourself, see this [example][impl service].
+
+[service]: {{ site.docs_url }}/hyper/service/trait.Service.html
+[service_fn]: {{ site.docs_url }}/hyper/service/fn.service_fn.html
+[request]: {{ site.docs_url }}/hyper/struct.Request.html
+[response]: {{ site.docs_url }}/hyper/struct.Response.html
+[parts]: {{ site.docs_url }}/http/0.2.8/http/response/struct.Parts.html
+[example]: {{ site.examples_url }}/hello.rs
+[impl service]: {{ site.examples_url }}/service_struct_impl.rs
diff --git a/_guides/master/server/index.md b/_guides/master/server/index.md
new file mode 100644
index 0000000..86e9f22
--- /dev/null
+++ b/_guides/master/server/index.md
@@ -0,0 +1,7 @@
+---
+title: Server Guides
+permalink: /guides/server/
+---
+
+This is just placeholder page. It should probably become a table of
+contents for the server guides.

From 8eb1b176771a1af1a5245eef4537d2a0f4f927fc Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Wed, 14 Dec 2022 22:11:49 +0100
Subject: [PATCH 031/138] ci: rewrite script to test master and legacy

---
 .github/workflows/check_guides.sh | 70 ++++++++++++++++++-------------
 .gitignore                        |  3 +-
 2 files changed, 43 insertions(+), 30 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index 400cf78..9ccf2e7 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -1,37 +1,49 @@
 #!/bin/sh
 
-if [ ! -e tmp/Cargo.toml ]; then
-    if [ ! -d tmp ]; then
-        cargo new tmp
-    else
-        cargo init tmp
-    fi
-    cat >> tmp/Cargo.toml <<-EOF
-futures = "0.3"
-hyper = { version = "0.14", features = ["full"] }
-hyper-tls = "0.5"
-tokio = { version = "1", features = ["full"] }
+for value in legacy master
+do
+    if [ ! -e "$value/Cargo.toml" ]; then
+        if [ ! -d $value ]; then
+            cargo new $value
+        else
+            cargo init $value
+        fi
+        if [ $value = legacy ]; then
+            cat >> "$value/Cargo.toml" <<-EOF
+    futures = "0.3"
+    hyper = { version = "0.14", features = ["full"] }
+    hyper-tls = "0.5"
+    tokio = { version = "1", features = ["full"] }
 EOF
-    cargo build --manifest-path tmp/Cargo.toml
-fi
-
-test_file() {
-    echo "Testing: $f"
-    rustdoc --edition 2018 --test $1 -L tmp/target/debug/deps
-}
-
-if [ -n "$1" ]; then
-    test_file $1
-    exit $?
-fi
+            cargo build --manifest-path "$value/Cargo.toml"
+        fi
+        if [ $value = master ]; then
+            cat >> "$value/Cargo.toml" <<-EOF
+    hyper = { version = "1.0.0-rc.1", features = ["full"] }
+    tokio = { version = "1", features = ["full"] }
+    http-body-util = "0.1.0-rc.1" 
+EOF
+            cargo build --manifest-path "$value/Cargo.toml"
+        fi
+    fi
+    test_file() {
+        echo "Testing: $f"
+        rustdoc --edition 2018 --test $1 -L "$value/target/debug/deps"
+    }
 
-status=0
-for f in `git ls-files | grep '\.md$'`; do
-    test_file $f
-    s=$?
-    if [ "$s" != "0" ]; then
-        status=$s
+    if [ -n "$1" ]; then
+        test_file $1
+        exit $?
     fi
+
+    status=0
+    for f in `git ls-files | grep "^_guides\/$value.*\.md$"`; do
+        test_file $f
+        s=$?
+        if [ "$s" != "0" ]; then
+            status=$s
+        fi
+    done
 done
 
 exit $status
diff --git a/.gitignore b/.gitignore
index 7cc2d5f..31f4377 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 Gemfile*
 _site*
 .sass-cache
-tmp/
+/legacy
+/master

From 35b3147c59e62617aea3d422091410d5760bb693 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Wed, 14 Dec 2022 22:12:50 +0100
Subject: [PATCH 032/138] fix: master hello-world, revert legacy guides

---
 _guides/legacy/server/echo.md        | 218 +++++++++++++--------------
 _guides/legacy/server/hello-world.md | 111 ++++++--------
 _guides/master/server/hello-world.md |  12 +-
 3 files changed, 162 insertions(+), 179 deletions(-)

diff --git a/_guides/legacy/server/echo.md b/_guides/legacy/server/echo.md
index b468799..e454824 100644
--- a/_guides/legacy/server/echo.md
+++ b/_guides/legacy/server/echo.md
@@ -2,7 +2,7 @@
 title: Echo, echo, echo
 ---
 
-You already have a [Hello World server](../hello-world)? Excellent! Usually,
+You already have a [Hello World server](hello-world.md)? Excellent! Usually,
 servers do more than just spit out the same body for every request. To
 exercise several more parts of hyper, this guide will go through
 building an echo server.
@@ -17,97 +17,88 @@ routing. We want to have a route explaining instructions on how to use
 our server, and another for receiving data. Oh, and we should also
 handle the case when someone asks for a route we don't know!
 
-Before we get started we need to add some new imports:
+We're going to be using more of the [futures][future-crate] crate, so let's add
+that as a dependency:
+
+```toml
+[dependencies]
+hyper = { version = "0.14", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
+futures = "0.3"
+```
+
+Then, we need to add some to our imports:
 
 ```rust
-use hyper::body::Frame;
+# extern crate hyper;
+# extern crate futures;
 use hyper::{Method, StatusCode};
-use http_body_util::{combinators::BoxBody, BodyExt};
 # fn main() {}
 ```
 
-Next, we need to make some changes to our `Service` function, but as you can see
-it's still just an async function that takes a `Request` and returns a `Response`
-future, and you can pass it to your server just like we did for the `hello` service.
-
-Unlike our `hello` service where we didn't care about the request body and 
-we always returned a single chunk of bytes containing our greeting, we're now
-going to want a bit more freedom in how we shape our response `Body`. To achieve
-this we will change the type of the `Body` in our `Response` to a boxed trait object. 
-We only care that the response body implements the [Body](https://docs.rs/http-body/1.0.0-rc1/http_body/trait.Body.html) trait, that its data is `Bytes` and its error is a `hyper::Error`.
+And make some changes to your `Service`, such as returning a `Future` of a `Response`,
+since we may not have one ready immediately:
 
 ```rust
-# use bytes::Bytes;
-# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::{Method, Request, Response, StatusCode};
-async fn echo(
-    req: Request<hyper::body::Incoming>,
-) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
+# extern crate futures;
+# extern crate hyper;
+# use futures::future::{self, Future};
+# use hyper::{Body, Method, Request, Response, StatusCode};
+#
+async fn echo(req: Request<Body>) -> Result<Response<Body>, hyper::Error> {
+    let mut response = Response::new(Body::empty());
+
     match (req.method(), req.uri().path()) {
-        (&Method::GET, "/") => Ok(Response::new(full(
-            "Try POSTing data to /echo",
-        ))),
+        (&Method::GET, "/") => {
+            *response.body_mut() = Body::from("Try POSTing data to /echo");
+        },
         (&Method::POST, "/echo") => {
             // we'll be back
         },
-
-        // Return 404 Not Found for other routes.
         _ => {
-            let mut not_found = Response::new(empty());
-            *not_found.status_mut() = StatusCode::NOT_FOUND;
-            Ok(not_found)
-        }
-    }
-}
-// We create some utility functions to make Empty and Full bodies
-// fit our broadened Response body type.
-fn empty() -> BoxBody<Bytes, hyper::Error> {
-    Empty::<Bytes>::new()
-        .map_err(|never| match never {})
-        .boxed()
-}
-fn full<T: Into<Bytes>>(chunk: T) -> BoxBody<Bytes, hyper::Error> {
-    Full::new(chunk.into())
-        .map_err(|never| match never {})
-        .boxed()
+            *response.status_mut() = StatusCode::NOT_FOUND;
+        },
+    };
+
+    Ok(response)
 }
 # fn main() {}
 ```
 
-We built a super simple routing table just by matching on the `method` and `path` 
-of an incoming `Request`. If someone requests `GET /`, our service will let them 
-know they should try our echo powers out. We also check for `POST /echo`, but 
-currently don't do anything about it.
+We built a super simple routing table just by matching on the `method`
+and `path` of an incoming `Request`. If someone requests `GET /`, our
+service will let them know they should try our echo powers out. We also
+are checking for `POST /echo`, but currently don't do anything about it.
 
-Our third rule catches any other method and path combination, and changes the 
-`StatusCode` of the `Response`. The default status of a `Response` is HTTP’s 
-`200 OK` (`StatusCode::OK`), which is correct for the other routes. But the third 
-case will instead send back `404 Not Found`.
+Our third rule catches any other method and path combination, and
+changes the `StatusCode` of the `Response`. The default status of a
+`Response` is HTTP's `200 OK` (`StatusCode::OK`), which is correct for
+the other routes. But the third case will instead send back `404 Not
+Found`.
 
 ## Body Streams
 
-Now let's get that echo in place. An HTTP body is a stream of 
-`Frames`, each [Frame](https://docs.rs/http-body/1.0.0-rc1/http_body/struct.Frame.html) 
-containing parts of the `Body` data or trailers. So rather than reading the entire `Body` 
-into a buffer before sending our response, we can stream each frame as it arrives. 
-We'll start with the simplest solution, and then make alterations exercising more complex 
-things you can do with the `Body` streams.
+Now let's get that echo in place. We'll start with the simplest solution, and
+then make alterations exercising more complex things you can do with the
+`Body` streams.
 
 First up, plain echo. Both the `Request` and the `Response` have body streams,
-and by default, you can easily pass the `Body` of the `Request` into a `Response`.
+and by default, you can easily just pass the `Body` of the `Request` into the
+`Response`.
 
 ```rust
-# use bytes::Bytes;
-# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::{Method, Request, Response, StatusCode};
-# async fn echo(
-#    req: Request<hyper::body::Incoming>,
-# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
-#    match (req.method(), req.uri().path()) {
-// Inside the match from before
-(&Method::POST, "/echo") => Ok(Response::new(req.into_body().boxed())),
-#        _ => unreachable!(),
-#    }
+# extern crate hyper;
+# use hyper::{Body, Method, Request, Response};
+# fn echo(req: Request<Body>) -> Response<Body> {
+#     let mut response = Response::default();
+#     match (req.method(), req.uri().path()) {
+// inside that match from before
+(&Method::POST, "/echo") => {
+    *response.body_mut() = req.into_body();
+},
+#         _ => unreachable!(),
+#     }
+#     response
 # }
 # fn main() {}
 ```
@@ -115,44 +106,49 @@ and by default, you can easily pass the `Body` of the `Request` into a `Response
 Running our server now will echo any data we `POST` to `/echo`. That was easy.
 What if we wanted to uppercase all the text? We could use a `map` on our streams.
 
-## Body mapping
+### Body mapping
+
+We're going to need a couple of extra imports, so let's add those to the top of the file:
+
+```rust
+# extern crate futures;
+# extern crate hyper;
+use futures::TryStreamExt as _;
+# fn main() {}
+```
 
-Every data `Frame` of our body stream is a chunk of bytes, which we can conveniently
-represent using the `Bytes` type from hyper. It can be easily converted into other
+A `Body` implements the `Stream` trait from futures, producing a bunch of
+`Bytes`s, as data comes in. `Bytes` is just a convenient type from hyper
+that represents a bunch of bytes. It can be easily converted into other
 typical containers of bytes.
 
-Next, let's add a new `/echo/uppercase` route, mapping each byte in the data `Frame`s
-of our request body to uppercase, and returning the stream in our `Response`:
+Next, let's add a new `/echo/uppercase` route mapping the body to uppercase:
 
 ```rust
-# use bytes::Bytes;
-# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::body::Frame;
-# use hyper::{Method, Request, Response, StatusCode};
-# async fn echo(
-#    req: Request<hyper::body::Incoming>,
-# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
-#    match (req.method(), req.uri().path()) {
+# extern crate hyper;
+# extern crate futures;
+# use futures::TryStreamExt as _;
+# use hyper::{Body, Method, Request, Response};
+# fn echo(req: Request<Body>) -> Response<Body> {
+#     let mut response = Response::default();
+#     match (req.method(), req.uri().path()) {
 // Yet another route inside our match block...
 (&Method::POST, "/echo/uppercase") => {
-    // Map this body's frame to a different type
-    let frame_stream = req.into_body().map_frame(|frame| {
-        let frame = if let Some(data) = frame.into_data() {
-            // Convert every byte in every Data frame to uppercase
-            data.iter()
+    // This is actually a new `futures::Stream`...
+    let mapping = req
+        .into_body()
+        .map_ok(|chunk| {
+            chunk.iter()
                 .map(|byte| byte.to_ascii_uppercase())
-                .collect::<Bytes>()
-        } else {
-            Bytes::new()
-        };
+                .collect::<Vec<u8>>()
+        });
 
-        Frame::data(frame)
-    });
-
-    Ok(Response::new(frame_stream.boxed()))
+    // Use `Body::wrap_stream` to convert it to a `Body`...
+    *response.body_mut() = Body::wrap_stream(mapping);
 },
 #         _ => unreachable!(),
 #     }
+#     response
 # }
 # fn main() {}
 ```
@@ -168,36 +164,33 @@ back to us? We can't really stream the data as it comes in, since we need to
 find the end before we can respond. To do this, we can explore how to easily
 collect the full body.
 
-We want to collect the entire request body and map the result into our `reverse` 
-function, then return the eventual result. If we import the `http_body_util::BodyExt`
-extension trait, we can call the `collect` method on our body, which will drive the
-stream to completion, collecting all the data and trailer frames into a `Collected` type.
-We can easily turn the `Collected` body into a single `Bytes` by calling its `into_bytes` 
-method.
+In this case, we can't really generate a `Response` immediately. Instead, we
+must wait for the full request body to be received.
+
+We want to concatenate the request body, and map the result into our `reverse` function, and return the eventual result. We can make use of the `hyper::body::to_bytes` utility function to make this easy.
 
 ```rust
-# use bytes::Bytes;
-# use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::{Method, Request, Response, StatusCode};
-# async fn echo(
-#    req: Request<hyper::body::Incoming>,
-# ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
-#    match (req.method(), req.uri().path()) {
+# extern crate hyper;
+# use hyper::{Body, Method, Request, Response};
+# async fn echo(req: Request<Body>) -> Result<Response<Body>, hyper::Error> {
+#     let mut response = Response::default();
+#     match (req.method(), req.uri().path()) {
 // Yet another route inside our match block...
-(&Method::POST, "/echo/reversed") => {
-    // Await the whole body to be collected into a single `Bytes`...
-    let whole_body = req.collect().await?.to_bytes();
+(&Method::POST, "/echo/reverse") => {
+    // Await the full body to be concatenated into a single `Bytes`...
+    let full_body = hyper::body::to_bytes(req.into_body()).await?;
 
-    // Iterate the whole body in reverse order and collect into a new Vec.
-    let reversed_body = whole_body.iter()
+    // Iterate the full body in reverse order and collect into a new Vec.
+    let reversed = full_body.iter()
         .rev()
         .cloned()
         .collect::<Vec<u8>>();
 
-    Ok(Response::new(full(reversed_body)))
+    *response.body_mut() = reversed.into();
 },
 #         _ => unreachable!(),
 #     }
+#     Ok(response)
 # }
 # fn main() {}
 ```
@@ -205,3 +198,4 @@ method.
 You can see a compiling [example here][example].
 
 [example]: {{ site.examples_url }}/echo.rs
+[future-crate]: https://github.com/rust-lang-nursery/futures-rs
diff --git a/_guides/legacy/server/hello-world.md b/_guides/legacy/server/hello-world.md
index 4d9888d..b64d6ce 100644
--- a/_guides/legacy/server/hello-world.md
+++ b/_guides/legacy/server/hello-world.md
@@ -5,100 +5,87 @@ layout: guide
 
 Let's start by making a "Hello, World!" server, and expand from there.
 
-First we need to declare our dependencies, let's add the following to our `Cargo.toml`:
+First, we need our dependencies. Let's tell Cargo about our dependencies by having this in the `Cargo.toml`.
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.1", features = ["full"] }
+hyper = { version = "0.14", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
-http-body-util = "0.1.0-rc.1" 
 ```
 
-Next, we need to add some imports in our `main.rs` file:
+Now lets start on our `main.rs`, and add some imports:
 
 ```rust
+# extern crate hyper;
 use std::convert::Infallible;
 use std::net::SocketAddr;
-
-use http_body_util::Full;
-use hyper::body::Bytes;
-use hyper::server::conn::http1;
-use hyper::service::service_fn;
-use hyper::{Request, Response};
-use tokio::net::TcpListener;
+use hyper::{Body, Request, Response, Server};
+use hyper::service::{make_service_fn, service_fn};
 # fn main() {}
 ```
 
 ## Creating a Service
 
-A [`Service`][service] lets us define how our server will respond to 
-incoming requests. It represents an async function that takes a 
-[`Request`][request] and returns a `Future`. When the processing of this
-future is complete, it will resolve to a [`Response`][response] or an error.
+A [`Service`][service] lets you define how to respond to incoming requests.
+While it is possible to implement the trait directly, there are a few patterns
+that are common when using Hyper. We've included some helpers for when these
+patterns fit our needs.
 
-Hyper provides a utility for creating a `Service` from a function that should 
-serve most usecases: [`service_fn`][service_fn]. We will use this to create 
-a service from our `hello` function below when we're ready to start our 
-server.
+In this example, we don't have any state to carry around, so we really just
+need a simple `async` function:
 
 ```rust
+# extern crate hyper;
 # use std::convert::Infallible;
-# use http_body_util::Full;
-# use hyper::body::Bytes;
-# use hyper::{Request, Response};
-async fn hello(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
-    Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
+# use hyper::{Body, Request, Response};
+# fn main() {}
+async fn hello_world(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
+    Ok(Response::new("Hello, World".into()))
 }
 ```
 
-Using this function as a service, we tell our server to respond to all requests 
-with a default `200 OK` status. The response `Body` will contain our friendly
-greeting as a single chunk of bytes, and the `Content-Length` header will be 
-set automatically.
+As soon as we get a request, nothing is stopping us from knowing the response
+immediately! That function will be used when starting our server.
+
+That new `Response` will by default have a `200 OK` status code, and the `Body`
+is able to tell that it is made from a static string, and is able to add a
+`Content-Length` header for us automatically.
 
 ## Starting the Server
 
-Lastly, we need to hook up our `hello` service into a running hyper server.
+Lastly, we need to hook up our `hello_world` service into a running hyper
+Server.
 
 We'll dive in to the specifics of some of these things in another guide.
 
 ```rust
+# extern crate hyper;
+# extern crate tokio;
+# mod no_run {
 # use std::convert::Infallible;
 # use std::net::SocketAddr;
-# 
-# use http_body_util::Full;
-# use hyper::body::Bytes;
-# use hyper::server::conn::http1;
-# use hyper::service::service_fn;
-# use hyper::{Request, Response};
-# use tokio::net::TcpListener;
-# async fn hello(
-#     _: Request<hyper::body::Incoming>,
-# ) -> Result<Response<Full<Bytes>>, Infallible> {
-#     Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
+# use hyper::{Body, Request, Response, Server};
+# use hyper::service::{make_service_fn, service_fn};
+# async fn hello_world(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
+#     Ok(Response::new("Hello, World".into()))
 # }
 #[tokio::main]
 async fn main() {
+    // We'll bind to 127.0.0.1:3000
     let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
 
-    // We create a TcpListener and bind it to 127.0.0.1:3000
-    let listener = TcpListener::bind(addr).await?;
-
-    // We start a loop to continuously accept incoming connections
-    loop {
-        let (stream, _) = listener.accept().await?;
-
-        // Spawn a tokio task to serve multiple connections concurrently
-        tokio::task::spawn(async move {
-            // Finally, we bind the incoming connection to our `hello` service
-            if let Err(err) = http1::Builder::new()
-                // `service_fn` converts our function in a `Service`
-                .serve_connection(stream, service_fn(hello))
-                .await
-            {
-                println!("Error serving connection: {:?}", err);
-            }
-        });
+    // A `Service` is needed for every connection, so this
+    // creates one from our `hello_world` function.
+    let make_svc = make_service_fn(|_conn| async {
+        // service_fn converts our function into a `Service`
+        Ok::<_, Infallible>(service_fn(hello_world))
+    });
+
+    let server = Server::bind(&addr).serve(make_svc);
+
+    // Run this server for... forever!
+    if let Err(e) = server.await {
+        eprintln!("server error: {}", e);
     }
 }
 # }
@@ -107,13 +94,5 @@ async fn main() {
 
 To see all the snippets put together, check out the [full example][example]!
 
-Also, if `service_fn` doesn't meet your requirements and you'd like to implement 
-`Service` yourself, see this [example][impl service].
-
 [service]: {{ site.docs_url }}/hyper/service/trait.Service.html
-[service_fn]: {{ site.docs_url }}/hyper/service/fn.service_fn.html
-[request]: {{ site.docs_url }}/hyper/struct.Request.html
-[response]: {{ site.docs_url }}/hyper/struct.Response.html
-[parts]: {{ site.docs_url }}/http/0.2.8/http/response/struct.Parts.html
 [example]: {{ site.examples_url }}/hello.rs
-[impl service]: {{ site.examples_url }}/service_struct_impl.rs
diff --git a/_guides/master/server/hello-world.md b/_guides/master/server/hello-world.md
index 4d9888d..a1c3436 100644
--- a/_guides/master/server/hello-world.md
+++ b/_guides/master/server/hello-world.md
@@ -17,6 +17,9 @@ http-body-util = "0.1.0-rc.1"
 Next, we need to add some imports in our `main.rs` file:
 
 ```rust
+# extern crate tokio;
+# extern crate hyper;
+# extern crate http_body_util;
 use std::convert::Infallible;
 use std::net::SocketAddr;
 
@@ -42,10 +45,13 @@ a service from our `hello` function below when we're ready to start our
 server.
 
 ```rust
+# extern crate hyper;
+# extern crate http_body_util;
 # use std::convert::Infallible;
 # use http_body_util::Full;
 # use hyper::body::Bytes;
 # use hyper::{Request, Response};
+# fn main() {}
 async fn hello(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
     Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
 }
@@ -63,6 +69,10 @@ Lastly, we need to hook up our `hello` service into a running hyper server.
 We'll dive in to the specifics of some of these things in another guide.
 
 ```rust
+# extern crate tokio;
+# extern crate hyper;
+# extern crate http_body_util;
+# mod no_run {
 # use std::convert::Infallible;
 # use std::net::SocketAddr;
 # 
@@ -78,7 +88,7 @@ We'll dive in to the specifics of some of these things in another guide.
 #     Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
 # }
 #[tokio::main]
-async fn main() {
+async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
     let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
 
     // We create a TcpListener and bind it to 127.0.0.1:3000

From d226793b7a5572790246d41a56dac15e37fb7fc7 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Fri, 16 Dec 2022 19:59:12 +0100
Subject: [PATCH 033/138] fix(server): echo guide doc test errors

---
 .github/workflows/check_guides.sh |  1 +
 _guides/master/server/echo.md     | 35 ++++++++++++++++++++++++-------
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index 9ccf2e7..1c7d959 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -26,6 +26,7 @@ EOF
             cargo build --manifest-path "$value/Cargo.toml"
         fi
     fi
+    
     test_file() {
         echo "Testing: $f"
         rustdoc --edition 2018 --test $1 -L "$value/target/debug/deps"
diff --git a/_guides/master/server/echo.md b/_guides/master/server/echo.md
index b468799..4b79079 100644
--- a/_guides/master/server/echo.md
+++ b/_guides/master/server/echo.md
@@ -20,6 +20,8 @@ handle the case when someone asks for a route we don't know!
 Before we get started we need to add some new imports:
 
 ```rust
+# extern crate hyper;
+# extern crate http_body_util;
 use hyper::body::Frame;
 use hyper::{Method, StatusCode};
 use http_body_util::{combinators::BoxBody, BodyExt};
@@ -37,7 +39,9 @@ this we will change the type of the `Body` in our `Response` to a boxed trait ob
 We only care that the response body implements the [Body](https://docs.rs/http-body/1.0.0-rc1/http_body/trait.Body.html) trait, that its data is `Bytes` and its error is a `hyper::Error`.
 
 ```rust
-# use bytes::Bytes;
+# extern crate hyper;
+# extern crate http_body_util;
+# use hyper::body::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
 # use hyper::{Method, Request, Response, StatusCode};
 async fn echo(
@@ -49,6 +53,7 @@ async fn echo(
         ))),
         (&Method::POST, "/echo") => {
             // we'll be back
+            # Ok(Response::new(req.into_body().boxed()))
         },
 
         // Return 404 Not Found for other routes.
@@ -86,9 +91,9 @@ case will instead send back `404 Not Found`.
 
 ## Body Streams
 
-Now let's get that echo in place. An HTTP body is a stream of 
-`Frames`, each [Frame](https://docs.rs/http-body/1.0.0-rc1/http_body/struct.Frame.html) 
-containing parts of the `Body` data or trailers. So rather than reading the entire `Body` 
+Now let's get that echo in place. An HTTP body is a stream of `Frames`, each 
+[Frame](https://docs.rs/http-body/1.0.0-rc1/http_body/struct.Frame.html) containing 
+parts of the `Body` data or trailers. So rather than reading the entire `Body` 
 into a buffer before sending our response, we can stream each frame as it arrives. 
 We'll start with the simplest solution, and then make alterations exercising more complex 
 things you can do with the `Body` streams.
@@ -97,7 +102,9 @@ First up, plain echo. Both the `Request` and the `Response` have body streams,
 and by default, you can easily pass the `Body` of the `Request` into a `Response`.
 
 ```rust
-# use bytes::Bytes;
+# extern crate hyper;
+# extern crate http_body_util;
+# use hyper::body::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
 # use hyper::{Method, Request, Response, StatusCode};
 # async fn echo(
@@ -125,7 +132,9 @@ Next, let's add a new `/echo/uppercase` route, mapping each byte in the data `Fr
 of our request body to uppercase, and returning the stream in our `Response`:
 
 ```rust
-# use bytes::Bytes;
+# extern crate hyper;
+# extern crate http_body_util;
+# use hyper::body::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
 # use hyper::body::Frame;
 # use hyper::{Method, Request, Response, StatusCode};
@@ -154,6 +163,11 @@ of our request body to uppercase, and returning the stream in our `Response`:
 #         _ => unreachable!(),
 #     }
 # }
+# fn full<T: Into<Bytes>>(chunk: T) -> BoxBody<Bytes, hyper::Error> {
+#     Full::new(chunk.into())
+#         .map_err(|never| match never {})
+#         .boxed()
+# }
 # fn main() {}
 ```
 
@@ -176,7 +190,9 @@ We can easily turn the `Collected` body into a single `Bytes` by calling its `in
 method.
 
 ```rust
-# use bytes::Bytes;
+# extern crate hyper;
+# extern crate http_body_util;
+# use hyper::body::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
 # use hyper::{Method, Request, Response, StatusCode};
 # async fn echo(
@@ -199,6 +215,11 @@ method.
 #         _ => unreachable!(),
 #     }
 # }
+# fn full<T: Into<Bytes>>(chunk: T) -> BoxBody<Bytes, hyper::Error> {
+#     Full::new(chunk.into())
+#         .map_err(|never| match never {})
+#         .boxed()
+# }
 # fn main() {}
 ```
 

From f997aefd72a4df6eeafee8040c522ec8115ebd77 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Fri, 16 Dec 2022 22:14:05 +0100
Subject: [PATCH 034/138] feat: create new collection for 1.0 guides

---
 _config.yml                                   | 13 ++++++++++-
 _data/stable.yml                              | 19 +++++++++++++++
 _guides/{legacy => }/client/advanced.md       |  0
 _guides/{legacy => }/client/basic.md          |  0
 _guides/{legacy => }/client/configuration.md  |  0
 _guides/{legacy => }/client/index.md          |  0
 _guides/master/index.md                       | 23 -------------------
 _guides/{legacy => }/server/echo.md           |  0
 .../{legacy => }/server/graceful-shutdown.md  |  0
 _guides/{legacy => }/server/hello-world.md    |  0
 _guides/{legacy => }/server/index.md          |  0
 _includes/guide_ul.html                       | 20 +++++++++++-----
 _layouts/guide.html                           | 21 ++++++++++++-----
 {_guides/legacy => _stable}/index.md          |  2 +-
 {_guides/master => _stable}/server/echo.md    |  1 +
 .../server/graceful-shutdown.md               |  0
 .../master => _stable}/server/hello-world.md  |  0
 {_guides/master => _stable}/server/index.md   |  2 +-
 18 files changed, 63 insertions(+), 38 deletions(-)
 create mode 100644 _data/stable.yml
 rename _guides/{legacy => }/client/advanced.md (100%)
 rename _guides/{legacy => }/client/basic.md (100%)
 rename _guides/{legacy => }/client/configuration.md (100%)
 rename _guides/{legacy => }/client/index.md (100%)
 delete mode 100644 _guides/master/index.md
 rename _guides/{legacy => }/server/echo.md (100%)
 rename _guides/{legacy => }/server/graceful-shutdown.md (100%)
 rename _guides/{legacy => }/server/hello-world.md (100%)
 rename _guides/{legacy => }/server/index.md (100%)
 rename {_guides/legacy => _stable}/index.md (96%)
 rename {_guides/master => _stable}/server/echo.md (99%)
 rename {_guides/master => _stable}/server/graceful-shutdown.md (100%)
 rename {_guides/master => _stable}/server/hello-world.md (100%)
 rename {_guides/master => _stable}/server/index.md (82%)

diff --git a/_config.yml b/_config.yml
index 5a26c69..ea80da9 100644
--- a/_config.yml
+++ b/_config.yml
@@ -6,15 +6,26 @@ url: "https://hyper.rs" # the base hostname & protocol for your site
 defaults:
   -
     scope:
-      path: "_guides"
+      path: "_guides/"
       type: "guides"
     values:
       layout: "guide"
+  -
+    
+    scope:
+      path: "_stable/"
+      type: "guides"
+    values:
+      layout: "guide"
+  
 
 collections:
   guides:
     permalink: /:collection/:path/
     output: true
+  stable:
+    permalink: /:collection/:path/
+    output: true
   posts:
     permalink: /blog/:year/:month/:day/:title/
     output: true
diff --git a/_data/stable.yml b/_data/stable.yml
new file mode 100644
index 0000000..6f7e9f5
--- /dev/null
+++ b/_data/stable.yml
@@ -0,0 +1,19 @@
+- title: Guide
+  path: ""
+  guides:
+  - server
+  - client
+
+- title: Server
+  path: "/server"
+  guides:
+  - hello-world
+  - echo
+  - graceful-shutdown
+
+- title: Client
+  path: "/client"
+  guides:
+  - basic
+  - advanced
+  - configuration
diff --git a/_guides/legacy/client/advanced.md b/_guides/client/advanced.md
similarity index 100%
rename from _guides/legacy/client/advanced.md
rename to _guides/client/advanced.md
diff --git a/_guides/legacy/client/basic.md b/_guides/client/basic.md
similarity index 100%
rename from _guides/legacy/client/basic.md
rename to _guides/client/basic.md
diff --git a/_guides/legacy/client/configuration.md b/_guides/client/configuration.md
similarity index 100%
rename from _guides/legacy/client/configuration.md
rename to _guides/client/configuration.md
diff --git a/_guides/legacy/client/index.md b/_guides/client/index.md
similarity index 100%
rename from _guides/legacy/client/index.md
rename to _guides/client/index.md
diff --git a/_guides/master/index.md b/_guides/master/index.md
deleted file mode 100644
index b44dadd..0000000
--- a/_guides/master/index.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-title:  Getting Started
-layout: guide
-permalink: /guides/
----
-
-hyper is an HTTP library for the Rust language.
-
-You can start using it by first adding it to your `Cargo.toml`:
-
-```toml
-[dependencies]
-hyper = { version = "1.0.0-rc.1", features = ["full"] }
-```
-
-- If building a web server, continue with the [Server guide][].
-- If trying to talk to a server, continue with the [Client guide][].
-
-You could also look at the [generated API documentaton][docs].
-
-[docs]: {{ site.docs_url }}
-[Server guide]: server/hello-world.md
-[Client guide]: client/basic.md
diff --git a/_guides/legacy/server/echo.md b/_guides/server/echo.md
similarity index 100%
rename from _guides/legacy/server/echo.md
rename to _guides/server/echo.md
diff --git a/_guides/legacy/server/graceful-shutdown.md b/_guides/server/graceful-shutdown.md
similarity index 100%
rename from _guides/legacy/server/graceful-shutdown.md
rename to _guides/server/graceful-shutdown.md
diff --git a/_guides/legacy/server/hello-world.md b/_guides/server/hello-world.md
similarity index 100%
rename from _guides/legacy/server/hello-world.md
rename to _guides/server/hello-world.md
diff --git a/_guides/legacy/server/index.md b/_guides/server/index.md
similarity index 100%
rename from _guides/legacy/server/index.md
rename to _guides/server/index.md
diff --git a/_includes/guide_ul.html b/_includes/guide_ul.html
index bdfd151..4ee5b79 100644
--- a/_includes/guide_ul.html
+++ b/_includes/guide_ul.html
@@ -2,10 +2,18 @@
 <section class="guide-topic">
   <h4 class="guide-topic-title">{{ topic.title }}</h4>
   <ul class="nav">
-  {% for guide in  topic.guides %}
-    {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/guides" | append:"/" %}
-    {% assign p = site.guides | where:"url", guide_url | first %}
-    <li {% if guide_url == page.url %}class="active"{% endif %}><a href="{{ p.url }}">{{ p.title }} </a></li>
-  {% endfor %}
+  {% if page.collection == "guides" %}
+    {% for guide in  topic.guides %}
+      {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/guides" | append:"/" %}
+      {% assign p = site.guides | where:"url", guide_url | first %}
+      <li {% if guide_url == page.url %}class="active"{% endif %}><a href="{{ p.url }}">{{ p.title }} </a></li>
+    {% endfor %}
+  {% elsif page.collection == "stable" %}
+    {% for guide in  topic.guides %}
+      {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/stable" | append:"/" %}
+      {% assign p = site.stable | where:"url", guide_url | first %}
+      <li {% if guide_url == page.url %}class="active"{% endif %}><a href="{{ p.url }}">{{ p.title }} </a></li>
+    {% endfor %}
+  {% endif %}
   </ul>
-</section>
\ No newline at end of file
+</section>
diff --git a/_layouts/guide.html b/_layouts/guide.html
index ed8c5df..e1575f0 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -14,12 +14,21 @@ <h1>{{ page.title }}</h1>
       <div class="row">
         <aside class="col-md-3 hyper-sidebar">
           <nav>
-            {% assign topics = site.data.guides | first %}
-            {% for guides in topics.guides %}
-            {% assign topic_sub_url = guides | prepend:"/" %}
-            {% assign topic = site.data.guides | where: "path", topic_sub_url | first %}
-            {% include guide_ul.html topic=topic %}
-            {% endfor %}
+            {% if page.collection == "guides" %}
+              {% assign topics = site.data.guides | first %}
+              {% for guides in topics.guides %}
+                {% assign topic_sub_url = guides | prepend:"/" %}
+                {% assign topic = site.data.guides | where: "path", topic_sub_url | first %}
+                {% include guide_ul.html topic=topic %}
+              {% endfor %}
+            {% elsif page.collection == "stable" %}
+              {% assign topics = site.data.stable | first %}
+              {% for guides in topics.guides %}
+                {% assign topic_sub_url = guides | prepend:"/" %}
+                {% assign topic = site.data.stable | where: "path", topic_sub_url | first %}
+                {% include guide_ul.html topic=topic %}
+              {% endfor %}
+            {% endif %}
             <h4 class="guide-topic-title">
               <a href="{{ site.docs_url }}">API Reference</a>
             </h4>
diff --git a/_guides/legacy/index.md b/_stable/index.md
similarity index 96%
rename from _guides/legacy/index.md
rename to _stable/index.md
index 3cf51c6..d6e602e 100644
--- a/_guides/legacy/index.md
+++ b/_stable/index.md
@@ -1,7 +1,7 @@
 ---
 title:  Getting Started
 layout: guide
-permalink: /guides/
+permalink: /stable/
 ---
 
 hyper is an HTTP library for the Rust language.
diff --git a/_guides/master/server/echo.md b/_stable/server/echo.md
similarity index 99%
rename from _guides/master/server/echo.md
rename to _stable/server/echo.md
index 4b79079..7e4957f 100644
--- a/_guides/master/server/echo.md
+++ b/_stable/server/echo.md
@@ -1,5 +1,6 @@
 ---
 title: Echo, echo, echo
+layout: guide
 ---
 
 You already have a [Hello World server](../hello-world)? Excellent! Usually,
diff --git a/_guides/master/server/graceful-shutdown.md b/_stable/server/graceful-shutdown.md
similarity index 100%
rename from _guides/master/server/graceful-shutdown.md
rename to _stable/server/graceful-shutdown.md
diff --git a/_guides/master/server/hello-world.md b/_stable/server/hello-world.md
similarity index 100%
rename from _guides/master/server/hello-world.md
rename to _stable/server/hello-world.md
diff --git a/_guides/master/server/index.md b/_stable/server/index.md
similarity index 82%
rename from _guides/master/server/index.md
rename to _stable/server/index.md
index 86e9f22..4fa5cc8 100644
--- a/_guides/master/server/index.md
+++ b/_stable/server/index.md
@@ -1,6 +1,6 @@
 ---
 title: Server Guides
-permalink: /guides/server/
+permalink: /stable/server/
 ---
 
 This is just placeholder page. It should probably become a table of

From 92f613c5d6d5c63630dbc0edf96ea21588179ccf Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Fri, 16 Dec 2022 22:26:00 +0100
Subject: [PATCH 035/138] ci: update script to check both collections

---
 .github/workflows/check_guides.sh | 10 +++++-----
 .gitignore                        |  4 ++--
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index 1c7d959..08e85f6 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-for value in legacy master
+for value in guides stable
 do
     if [ ! -e "$value/Cargo.toml" ]; then
         if [ ! -d $value ]; then
@@ -8,7 +8,7 @@ do
         else
             cargo init $value
         fi
-        if [ $value = legacy ]; then
+        if [ $value = guides ]; then
             cat >> "$value/Cargo.toml" <<-EOF
     futures = "0.3"
     hyper = { version = "0.14", features = ["full"] }
@@ -17,7 +17,7 @@ do
 EOF
             cargo build --manifest-path "$value/Cargo.toml"
         fi
-        if [ $value = master ]; then
+        if [ $value = stable ]; then
             cat >> "$value/Cargo.toml" <<-EOF
     hyper = { version = "1.0.0-rc.1", features = ["full"] }
     tokio = { version = "1", features = ["full"] }
@@ -26,7 +26,7 @@ EOF
             cargo build --manifest-path "$value/Cargo.toml"
         fi
     fi
-    
+
     test_file() {
         echo "Testing: $f"
         rustdoc --edition 2018 --test $1 -L "$value/target/debug/deps"
@@ -38,7 +38,7 @@ EOF
     fi
 
     status=0
-    for f in `git ls-files | grep "^_guides\/$value.*\.md$"`; do
+    for f in `git ls-files | grep "^_$value\/.*\.md$"`; do
         test_file $f
         s=$?
         if [ "$s" != "0" ]; then
diff --git a/.gitignore b/.gitignore
index 31f4377..b7b4343 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
 Gemfile*
 _site*
 .sass-cache
-/legacy
-/master
+/guides
+/stable

From ea6e66b4a0fc9a42ef4c9f715a0dd9a651c27f98 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 12:55:28 +0100
Subject: [PATCH 036/138] feat(server): remove graceful-shutdoown from stable
 guides

---
 _stable/server/graceful-shutdown.md | 60 -----------------------------
 1 file changed, 60 deletions(-)
 delete mode 100644 _stable/server/graceful-shutdown.md

diff --git a/_stable/server/graceful-shutdown.md b/_stable/server/graceful-shutdown.md
deleted file mode 100644
index 0f02760..0000000
--- a/_stable/server/graceful-shutdown.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-title:  Gracefully Shutdown a Server
-layout: guide
----
-
-hyper `Server`s have the ability to "gracefully" shutdown. This means stopping to accept new requests, and shutting down once all in-progress requests have completed.
-
-We're going to assume you already have server code working, such as from following the [Hello World](hello-world.md) or [Echo](echo.md) guides.
-
-The `Server` type has a `with_graceful_shutdown` method that is passed a `Future` of your choosing. Once that `Future` completes, the `Server` will start the shutdown process. It could be any `Future`, such as a `oneshot` channel. In this guide, we'll setup a signal handler to listen for the user pressing `CTRL+C`.
-
-First, let's create a `shutdown_signal` async function:
-
-```rust
-# extern crate tokio;
-async fn shutdown_signal() {
-    // Wait for the CTRL+C signal
-    tokio::signal::ctrl_c()
-        .await
-        .expect("failed to install CTRL+C signal handler");
-}
-# fn main() {}
-```
-
-Next, we can plug this into an existing server:
-
-```rust
-# extern crate hyper;
-# extern crate tokio;
-# mod no_run {
-# use std::convert::Infallible;
-# use std::net::SocketAddr;
-# use hyper::{Body, Request, Response, Server};
-# use hyper::service::{make_service_fn, service_fn};
-# async fn hello_world(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
-#     Ok(Response::new("Hello, World".into()))
-# }
-# async fn shutdown_signal() {}
-#[tokio::main]
-async fn main() {
-#    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
-#    let make_svc = make_service_fn(|_conn| async {
-#        Ok::<_, Infallible>(service_fn(hello_world))
-#    });
-    // Constructed `addr` and `make_svc` from your app above..
-
-    // And construct the `Server` like normal...
-    let server = Server::bind(&addr).serve(make_svc);
-
-    // And now add a graceful shutdown signal...
-    let graceful = server.with_graceful_shutdown(shutdown_signal());
-
-    // Run this server for... forever!
-    if let Err(e) = graceful.await {
-        eprintln!("server error: {}", e);
-    }
-}
-# }
-# fn main() {}
-```

From dd0cf4d28e8222ec724e6d2f3177330eaecebac4 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 12:59:45 +0100
Subject: [PATCH 037/138] feat: 0.14/1.0 tabs, update 1.0 guides index

---
 _includes/header.html | 3 ++-
 _layouts/home.html    | 2 +-
 _stable/index.md      | 6 +++---
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/_includes/header.html b/_includes/header.html
index d8cce9d..830a0fb 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -5,7 +5,8 @@
         <li class="nav-item">
           <a class="navbar-brand" href="/">hyper.rs</a>
         </li>
-        <li class="nav-item"><a class="nav-link" href="/guides">Guides</a></li>
+        <li class="nav-item"><a class="nav-link" href="/stable">1.0 Guides</a></li>
+        <li class="nav-item"><a class="nav-link" href="/guides">0.14 Guides</a></li>
         <li class="nav-item"><a class="nav-link" href="https://github.com/hyperium/hyper">Source</a></li>
       </ul>
     </div>
diff --git a/_layouts/home.html b/_layouts/home.html
index a6e6e06..6d23998 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -9,7 +9,7 @@
       <div class="container">
         <h1 class="hyper-logo">hyper</h1>
         <p>Fast and safe HTTP for the Rust language.</p>
-        <p><a href="/guides" class="btn hyper-getstarted">Get Started</a></p>
+        <p><a href="/stable" class="btn hyper-getstarted">Get Started</a></p>
       </div>
     </section>
     <section class="container">
diff --git a/_stable/index.md b/_stable/index.md
index d6e602e..2224fea 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -10,7 +10,7 @@ You can start using it by first adding it to your `Cargo.toml`:
 
 ```toml
 [dependencies]
-hyper = "0.14"
+hyper = { version = "1.0.0-rc.1", features = ["full"] }
 ```
 
 - If building a web server, continue with the [Server guide][].
@@ -19,5 +19,5 @@ hyper = "0.14"
 You could also look at the [generated API documentaton][docs].
 
 [docs]: {{ site.docs_url }}
-[Server guide]: server/hello-world.md
-[Client guide]: client/basic.md
+[Server guide]: server/hello-world
+[Client guide]: client/basic

From 3bf482c7a852fda665e8aede972935449682f2af Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 13:14:34 +0100
Subject: [PATCH 038/138] fix: incorrect links in 0.14 guides

0.14 guides were linking to `master` for examples and `1.0` for docs
---
 _config.yml                     | 3 +++
 _guides/client/advanced.md      | 4 ++--
 _guides/client/basic.md         | 8 ++++----
 _guides/client/configuration.md | 2 +-
 _guides/index.md                | 2 +-
 _guides/server/echo.md          | 2 +-
 _guides/server/hello-world.md   | 4 ++--
 _stable/server/echo.md          | 3 ++-
 8 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/_config.yml b/_config.yml
index ea80da9..3fb1a88 100644
--- a/_config.yml
+++ b/_config.yml
@@ -46,3 +46,6 @@ docs_url: https://docs.rs/hyper/1.0.0-rc.1
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
 futures_url: https://docs.rs/futures/0.3.*
 hyper_tls_url: https://docs.rs/hyper-tls/*
+
+legacy_docs_url: https://docs.rs/hyper/0.14.23
+legacy_examples_url: https://github.com/hyperium/hyper/tree/0.14.x/examples
diff --git a/_guides/client/advanced.md b/_guides/client/advanced.md
index c041fb3..e7c5699 100644
--- a/_guides/client/advanced.md
+++ b/_guides/client/advanced.md
@@ -110,5 +110,5 @@ let (ip, headers) = futures::try_join!(ip_fut, headers_fut)?;
 ```
 
 [simple guide]: ./basic.md
-[Request]: {{ site.docs_url }}/hyper/struct.Request.html
-[Method]: {{ site.docs_url }}/hyper/struct.Method.html
+[Request]: {{ site.legacy_docs_url }}/hyper/struct.Request.html
+[Method]: {{ site.legacy_docs_url }}/hyper/struct.Method.html
diff --git a/_guides/client/basic.md b/_guides/client/basic.md
index bee30a9..f247e35 100644
--- a/_guides/client/basic.md
+++ b/_guides/client/basic.md
@@ -112,9 +112,9 @@ while let Some(chunk) = resp.body_mut().data().await {
 
 And that's it! You can see the [full example here][example].
 
-[Client]: {{ site.docs_url }}/hyper/client/struct.Client.html
+[Client]: {{ site.legacy_docs_url }}/hyper/client/struct.Client.html
 [Tokio]: https://tokio.rs
 [Tokio-Futures]: https://tokio.rs/tokio/tutorial/async
-[StatusCode]: {{ site.docs_url }}/hyper/struct.StatusCode.html
-[Response]: {{ site.docs_url }}/hyper/struct.Response.html
-[example]: {{ site.examples_url }}/client.rs
+[StatusCode]: {{ site.legacy_docs_url }}/hyper/struct.StatusCode.html
+[Response]: {{ site.legacy_docs_url }}/hyper/struct.Response.html
+[example]: {{ site.legacy_examples_url }}/client.rs
diff --git a/_guides/client/configuration.md b/_guides/client/configuration.md
index c773454..87db61f 100644
--- a/_guides/client/configuration.md
+++ b/_guides/client/configuration.md
@@ -39,5 +39,5 @@ ideas of things that could be connectors:
 - Proxies
 - In-memory streams (such as for testing)
 
-[`Client`]: {{ site.docs_url }}/hyper/client/struct.Client.html
+[`Client`]: {{ site.legacy_docs_url }}/hyper/client/struct.Client.html
 [hyper-tls]: {{ site.hyper_tls_url }}
diff --git a/_guides/index.md b/_guides/index.md
index 3cf51c6..c807b80 100644
--- a/_guides/index.md
+++ b/_guides/index.md
@@ -18,6 +18,6 @@ hyper = "0.14"
 
 You could also look at the [generated API documentaton][docs].
 
-[docs]: {{ site.docs_url }}
+[docs]: {{ site.legacy_docs_url }}
 [Server guide]: server/hello-world.md
 [Client guide]: client/basic.md
diff --git a/_guides/server/echo.md b/_guides/server/echo.md
index e454824..98cf2b5 100644
--- a/_guides/server/echo.md
+++ b/_guides/server/echo.md
@@ -197,5 +197,5 @@ We want to concatenate the request body, and map the result into our `reverse` f
 
 You can see a compiling [example here][example].
 
-[example]: {{ site.examples_url }}/echo.rs
+[example]: {{ site.legacy_examples_url }}/echo.rs
 [future-crate]: https://github.com/rust-lang-nursery/futures-rs
diff --git a/_guides/server/hello-world.md b/_guides/server/hello-world.md
index b64d6ce..f102f25 100644
--- a/_guides/server/hello-world.md
+++ b/_guides/server/hello-world.md
@@ -94,5 +94,5 @@ async fn main() {
 
 To see all the snippets put together, check out the [full example][example]!
 
-[service]: {{ site.docs_url }}/hyper/service/trait.Service.html
-[example]: {{ site.examples_url }}/hello.rs
+[service]: {{ site.legacy_docs_url }}/hyper/service/trait.Service.html
+[example]: {{ site.legacy_examples_url }}/hello.rs
diff --git a/_stable/server/echo.md b/_stable/server/echo.md
index 7e4957f..b7e6c20 100644
--- a/_stable/server/echo.md
+++ b/_stable/server/echo.md
@@ -54,7 +54,7 @@ async fn echo(
         ))),
         (&Method::POST, "/echo") => {
             // we'll be back
-            # Ok(Response::new(req.into_body().boxed()))
+# Ok(Response::new(req.into_body().boxed()))
         },
 
         // Return 404 Not Found for other routes.
@@ -65,6 +65,7 @@ async fn echo(
         }
     }
 }
+
 // We create some utility functions to make Empty and Full bodies
 // fit our broadened Response body type.
 fn empty() -> BoxBody<Bytes, hyper::Error> {

From ea314239e0e09fa626b586a4307a4513b7f3440b Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 13:30:57 +0100
Subject: [PATCH 039/138] feat: rename old guides to legacy

---
 .github/workflows/check_guides.sh | 4 ++--
 .gitignore                        | 2 +-
 _config.yml                       | 4 ++--
 _data/{guides.yml => legacy.yml}  | 0
 _guides/client/index.md           | 2 +-
 _guides/index.md                  | 2 +-
 _guides/server/index.md           | 2 +-
 _includes/guide_ul.html           | 6 +++---
 _includes/header.html             | 2 +-
 _layouts/guide.html               | 7 ++++---
 10 files changed, 16 insertions(+), 15 deletions(-)
 rename _data/{guides.yml => legacy.yml} (100%)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index 08e85f6..dcfabd1 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-for value in guides stable
+for value in legacy stable
 do
     if [ ! -e "$value/Cargo.toml" ]; then
         if [ ! -d $value ]; then
@@ -8,7 +8,7 @@ do
         else
             cargo init $value
         fi
-        if [ $value = guides ]; then
+        if [ $value = legacy ]; then
             cat >> "$value/Cargo.toml" <<-EOF
     futures = "0.3"
     hyper = { version = "0.14", features = ["full"] }
diff --git a/.gitignore b/.gitignore
index b7b4343..102b94e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
 Gemfile*
 _site*
 .sass-cache
-/guides
+/legacy
 /stable
diff --git a/_config.yml b/_config.yml
index 3fb1a88..d87107d 100644
--- a/_config.yml
+++ b/_config.yml
@@ -6,7 +6,7 @@ url: "https://hyper.rs" # the base hostname & protocol for your site
 defaults:
   -
     scope:
-      path: "_guides/"
+      path: "_legacy/"
       type: "guides"
     values:
       layout: "guide"
@@ -20,7 +20,7 @@ defaults:
   
 
 collections:
-  guides:
+  legacy:
     permalink: /:collection/:path/
     output: true
   stable:
diff --git a/_data/guides.yml b/_data/legacy.yml
similarity index 100%
rename from _data/guides.yml
rename to _data/legacy.yml
diff --git a/_guides/client/index.md b/_guides/client/index.md
index 443558b..149150e 100644
--- a/_guides/client/index.md
+++ b/_guides/client/index.md
@@ -1,6 +1,6 @@
 ---
 title: Client Guides
-permalink: /guides/client/
+permalink: /legacy/client/
 ---
 
 This is just placeholder page. It should probably become a table of
diff --git a/_guides/index.md b/_guides/index.md
index c807b80..bfb7f69 100644
--- a/_guides/index.md
+++ b/_guides/index.md
@@ -1,7 +1,7 @@
 ---
 title:  Getting Started
 layout: guide
-permalink: /guides/
+permalink: /legacy/
 ---
 
 hyper is an HTTP library for the Rust language.
diff --git a/_guides/server/index.md b/_guides/server/index.md
index 86e9f22..d7fc699 100644
--- a/_guides/server/index.md
+++ b/_guides/server/index.md
@@ -1,6 +1,6 @@
 ---
 title: Server Guides
-permalink: /guides/server/
+permalink: /legacy/server/
 ---
 
 This is just placeholder page. It should probably become a table of
diff --git a/_includes/guide_ul.html b/_includes/guide_ul.html
index 4ee5b79..527f87f 100644
--- a/_includes/guide_ul.html
+++ b/_includes/guide_ul.html
@@ -2,10 +2,10 @@
 <section class="guide-topic">
   <h4 class="guide-topic-title">{{ topic.title }}</h4>
   <ul class="nav">
-  {% if page.collection == "guides" %}
+  {% if page.collection == "legacy" %}
     {% for guide in  topic.guides %}
-      {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/guides" | append:"/" %}
-      {% assign p = site.guides | where:"url", guide_url | first %}
+      {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/legacy" | append:"/" %}
+      {% assign p = site.legacy | where:"url", guide_url | first %}
       <li {% if guide_url == page.url %}class="active"{% endif %}><a href="{{ p.url }}">{{ p.title }} </a></li>
     {% endfor %}
   {% elsif page.collection == "stable" %}
diff --git a/_includes/header.html b/_includes/header.html
index 830a0fb..cacccdd 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -6,7 +6,7 @@
           <a class="navbar-brand" href="/">hyper.rs</a>
         </li>
         <li class="nav-item"><a class="nav-link" href="/stable">1.0 Guides</a></li>
-        <li class="nav-item"><a class="nav-link" href="/guides">0.14 Guides</a></li>
+        <li class="nav-item"><a class="nav-link" href="/legacy">0.14 Guides</a></li>
         <li class="nav-item"><a class="nav-link" href="https://github.com/hyperium/hyper">Source</a></li>
       </ul>
     </div>
diff --git a/_layouts/guide.html b/_layouts/guide.html
index e1575f0..d179bd4 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -14,11 +14,12 @@ <h1>{{ page.title }}</h1>
       <div class="row">
         <aside class="col-md-3 hyper-sidebar">
           <nav>
-            {% if page.collection == "guides" %}
-              {% assign topics = site.data.guides | first %}
+            {{page.collection | jsonify }}
+            {% if page.collection == "legacy" %}
+              {% assign topics = site.data.legacy | first %}
               {% for guides in topics.guides %}
                 {% assign topic_sub_url = guides | prepend:"/" %}
-                {% assign topic = site.data.guides | where: "path", topic_sub_url | first %}
+                {% assign topic = site.data.legacy | where: "path", topic_sub_url | first %}
                 {% include guide_ul.html topic=topic %}
               {% endfor %}
             {% elsif page.collection == "stable" %}

From c2aaddd317aa8303db285d9ced99712d324cbe5b Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 13:35:57 +0100
Subject: [PATCH 040/138] feat: rename _guides to _legacy

---
 _layouts/guide.html                              | 1 -
 {_guides => _legacy}/client/advanced.md          | 1 +
 {_guides => _legacy}/client/basic.md             | 1 +
 {_guides => _legacy}/client/configuration.md     | 1 +
 {_guides => _legacy}/client/index.md             | 0
 {_guides => _legacy}/index.md                    | 0
 {_guides => _legacy}/server/echo.md              | 1 +
 {_guides => _legacy}/server/graceful-shutdown.md | 0
 {_guides => _legacy}/server/hello-world.md       | 0
 {_guides => _legacy}/server/index.md             | 0
 10 files changed, 4 insertions(+), 1 deletion(-)
 rename {_guides => _legacy}/client/advanced.md (99%)
 rename {_guides => _legacy}/client/basic.md (99%)
 rename {_guides => _legacy}/client/configuration.md (98%)
 rename {_guides => _legacy}/client/index.md (100%)
 rename {_guides => _legacy}/index.md (100%)
 rename {_guides => _legacy}/server/echo.md (99%)
 rename {_guides => _legacy}/server/graceful-shutdown.md (100%)
 rename {_guides => _legacy}/server/hello-world.md (100%)
 rename {_guides => _legacy}/server/index.md (100%)

diff --git a/_layouts/guide.html b/_layouts/guide.html
index d179bd4..440fa96 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -14,7 +14,6 @@ <h1>{{ page.title }}</h1>
       <div class="row">
         <aside class="col-md-3 hyper-sidebar">
           <nav>
-            {{page.collection | jsonify }}
             {% if page.collection == "legacy" %}
               {% assign topics = site.data.legacy | first %}
               {% for guides in topics.guides %}
diff --git a/_guides/client/advanced.md b/_legacy/client/advanced.md
similarity index 99%
rename from _guides/client/advanced.md
rename to _legacy/client/advanced.md
index e7c5699..828f0b3 100644
--- a/_guides/client/advanced.md
+++ b/_legacy/client/advanced.md
@@ -1,5 +1,6 @@
 ---
 title: Advanced Client Usage
+layout: guide
 ---
 
 Once you've done all the setup in the [simple guide][], you probably
diff --git a/_guides/client/basic.md b/_legacy/client/basic.md
similarity index 99%
rename from _guides/client/basic.md
rename to _legacy/client/basic.md
index f247e35..5dfb764 100644
--- a/_guides/client/basic.md
+++ b/_legacy/client/basic.md
@@ -1,5 +1,6 @@
 ---
 title: Getting Started with a Client
+layout: guide
 ---
 
 To start with, we'll just get a simple `GET` request to a webpage working,
diff --git a/_guides/client/configuration.md b/_legacy/client/configuration.md
similarity index 98%
rename from _guides/client/configuration.md
rename to _legacy/client/configuration.md
index 87db61f..5ca3a28 100644
--- a/_guides/client/configuration.md
+++ b/_legacy/client/configuration.md
@@ -1,5 +1,6 @@
 ---
 title: Client Configuration
+layout: guide
 ---
 
 ## Using TLS
diff --git a/_guides/client/index.md b/_legacy/client/index.md
similarity index 100%
rename from _guides/client/index.md
rename to _legacy/client/index.md
diff --git a/_guides/index.md b/_legacy/index.md
similarity index 100%
rename from _guides/index.md
rename to _legacy/index.md
diff --git a/_guides/server/echo.md b/_legacy/server/echo.md
similarity index 99%
rename from _guides/server/echo.md
rename to _legacy/server/echo.md
index 98cf2b5..113a134 100644
--- a/_guides/server/echo.md
+++ b/_legacy/server/echo.md
@@ -1,5 +1,6 @@
 ---
 title: Echo, echo, echo
+layout: guide
 ---
 
 You already have a [Hello World server](hello-world.md)? Excellent! Usually,
diff --git a/_guides/server/graceful-shutdown.md b/_legacy/server/graceful-shutdown.md
similarity index 100%
rename from _guides/server/graceful-shutdown.md
rename to _legacy/server/graceful-shutdown.md
diff --git a/_guides/server/hello-world.md b/_legacy/server/hello-world.md
similarity index 100%
rename from _guides/server/hello-world.md
rename to _legacy/server/hello-world.md
diff --git a/_guides/server/index.md b/_legacy/server/index.md
similarity index 100%
rename from _guides/server/index.md
rename to _legacy/server/index.md

From 017cef51d71098735b94f92d28ab7115ef78965c Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 18:11:57 +0100
Subject: [PATCH 041/138] feat: update main index to 1.0

---
 index.md | 37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/index.md b/index.md
index b5dedf1..bfe96df 100644
--- a/index.md
+++ b/index.md
@@ -3,30 +3,41 @@ layout: home
 ---
 
 ```rust
-# extern crate hyper;
 # extern crate tokio;
+# extern crate hyper;
+# extern crate http_body_util;
 # mod no_run {
-use std::{convert::Infallible, net::SocketAddr};
-use hyper::{Body, Request, Response, Server};
-use hyper::service::{make_service_fn, service_fn};
+use std::{convert::Infallible, net::SocketAddr, error::Error};
+use http_body_util::Full;
+use hyper::{Request, Response, body::Bytes, service::service_fn};
+use hyper::server::conn::http1;
+use tokio::net::TcpListener;
 
-async fn handle(_: Request<Body>) -> Result<Response<Body>, Infallible> {
-    Ok(Response::new("Hello, World!".into()))
+async fn hello(
+    _: Request<hyper::body::Incoming>,
+) -> Result<Response<Full<Bytes>>, Infallible> {
+    Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
 }
 
 #[tokio::main]
-async fn main() {
+async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
     let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
 
-    let make_svc = make_service_fn(|_conn| async {
-        Ok::<_, Infallible>(service_fn(handle))
-    });
+    let listener = TcpListener::bind(addr).await?;
 
-    let server = Server::bind(&addr).serve(make_svc);
+    loop {
+        let (stream, _) = listener.accept().await?;
 
-    if let Err(e) = server.await {
-        eprintln!("server error: {}", e);
+        tokio::task::spawn(async move {
+            if let Err(err) = http1::Builder::new()
+                .serve_connection(stream, service_fn(hello))
+                .await
+            {
+                println!("Error serving connection: {:?}", err);
+            }
+        });
     }
 }
 # }
+# fn main() {}
 ```

From e552838089d8a76d7119518fc52414da392e97db Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 18:12:31 +0100
Subject: [PATCH 042/138] feat: link to correct api docs in guide main index

---
 _layouts/guide.html | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/_layouts/guide.html b/_layouts/guide.html
index 440fa96..4372bcb 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -30,7 +30,11 @@ <h1>{{ page.title }}</h1>
               {% endfor %}
             {% endif %}
             <h4 class="guide-topic-title">
-              <a href="{{ site.docs_url }}">API Reference</a>
+              {% if page.collection == "legacy" %}
+                <a href="{{ site.legacy_docs_url }}">API Reference</a>
+              {% elsif page.collection == "stable" %}
+                <a href="{{ site.docs_url }}">API Reference</a>
+              {% endif %}
             </h4>
           </nav>
         </aside>

From 8fa3fe7b0983b760ab13de89a1dcac1027b66c8a Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 18:19:50 +0100
Subject: [PATCH 043/138] feat: add note about /stable being 1.0 docs

---
 _stable/index.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/_stable/index.md b/_stable/index.md
index 2224fea..ee07521 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -4,6 +4,9 @@ layout: guide
 permalink: /stable/
 ---
 
+***Note:** these guides are for the upcoming version `1.0` of hyper,
+click [here](/legacy) to see the `0.14` guides.*
+
 hyper is an HTTP library for the Rust language.
 
 You can start using it by first adding it to your `Cargo.toml`:

From 85f13d2d84f9ed1c3df56e9a1005d404251c1845 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 18:30:43 +0100
Subject: [PATCH 044/138] feat: add note to home about transition to 1.0

---
 _layouts/home.html | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/_layouts/home.html b/_layouts/home.html
index 6d23998..bcea960 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -13,8 +13,13 @@ <h1 class="hyper-logo">hyper</h1>
       </div>
     </section>
     <section class="container">
-    <div class="row">
-      <div class="col-md-6">
+      <div class="row">
+        <div class="col-md-6">
+        <p class="lead">
+          <b>Note:</b> hyper is planning a stable <code>1.0</code> release at the end of January 2023.
+          These guides will be gradually transitioned to <code>1.0</code>, but if you're looking for
+          guides for <code>0.14</code> you can find them <a href="/legacy">here</a>.
+        </p>
         <p class="lead">hyper is a fast HTTP implementation written in and for Rust.</p>
         <ul>
             <li>A <strong>Client</strong> for talking to web services.</li>

From ad7b6b8d4c915f204e8ef2b5ca0ed1e43ed461fb Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 17 Dec 2022 18:35:52 +0100
Subject: [PATCH 045/138] feat: add link to 1.0 roadmap

---
 _layouts/home.html | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/_layouts/home.html b/_layouts/home.html
index bcea960..8d5e36f 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -18,7 +18,9 @@ <h1 class="hyper-logo">hyper</h1>
         <p class="lead">
           <b>Note:</b> hyper is planning a stable <code>1.0</code> release at the end of January 2023.
           These guides will be gradually transitioned to <code>1.0</code>, but if you're looking for
-          guides for <code>0.14</code> you can find them <a href="/legacy">here</a>.
+          guides for <code>0.14</code> you can find them <a href="/legacy">here</a>. If you'd like to
+          learn more about the move to <code>1.0</code>, 
+          <a href="https://seanmonstar.com/post/680802159018803200/hyper-10-roadmap">this</a> is a good place to start.
         </p>
         <p class="lead">hyper is a fast HTTP implementation written in and for Rust.</p>
         <ul>

From f5227ef706f3fd5555a576040eb922a6bef06c74 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Tue, 20 Dec 2022 23:08:52 +0100
Subject: [PATCH 046/138] feat: use versions in guide urls

---
 _config.yml             | 4 ++--
 _includes/guide_ul.html | 4 ++--
 _includes/header.html   | 4 ++--
 _layouts/home.html      | 4 ++--
 _legacy/client/index.md | 2 +-
 _legacy/index.md        | 2 +-
 _legacy/server/index.md | 2 +-
 _stable/index.md        | 4 ++--
 _stable/server/index.md | 2 +-
 9 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/_config.yml b/_config.yml
index d87107d..2441177 100644
--- a/_config.yml
+++ b/_config.yml
@@ -21,10 +21,10 @@ defaults:
 
 collections:
   legacy:
-    permalink: /:collection/:path/
+    permalink: /guides/0.14/:path/
     output: true
   stable:
-    permalink: /:collection/:path/
+    permalink: /guides/1/:path/
     output: true
   posts:
     permalink: /blog/:year/:month/:day/:title/
diff --git a/_includes/guide_ul.html b/_includes/guide_ul.html
index 527f87f..e8533af 100644
--- a/_includes/guide_ul.html
+++ b/_includes/guide_ul.html
@@ -4,13 +4,13 @@ <h4 class="guide-topic-title">{{ topic.title }}</h4>
   <ul class="nav">
   {% if page.collection == "legacy" %}
     {% for guide in  topic.guides %}
-      {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/legacy" | append:"/" %}
+      {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/guides/0.14" | append:"/" %}
       {% assign p = site.legacy | where:"url", guide_url | first %}
       <li {% if guide_url == page.url %}class="active"{% endif %}><a href="{{ p.url }}">{{ p.title }} </a></li>
     {% endfor %}
   {% elsif page.collection == "stable" %}
     {% for guide in  topic.guides %}
-      {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/stable" | append:"/" %}
+      {% assign guide_url = guide | prepend:"/" | prepend: topic.path | prepend:"/guides/1" | append:"/" %}
       {% assign p = site.stable | where:"url", guide_url | first %}
       <li {% if guide_url == page.url %}class="active"{% endif %}><a href="{{ p.url }}">{{ p.title }} </a></li>
     {% endfor %}
diff --git a/_includes/header.html b/_includes/header.html
index cacccdd..4980d34 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -5,8 +5,8 @@
         <li class="nav-item">
           <a class="navbar-brand" href="/">hyper.rs</a>
         </li>
-        <li class="nav-item"><a class="nav-link" href="/stable">1.0 Guides</a></li>
-        <li class="nav-item"><a class="nav-link" href="/legacy">0.14 Guides</a></li>
+        <li class="nav-item"><a class="nav-link" href="/guides/1">1.0 Guides</a></li>
+        <li class="nav-item"><a class="nav-link" href="/guides/0.14">0.14 Guides</a></li>
         <li class="nav-item"><a class="nav-link" href="https://github.com/hyperium/hyper">Source</a></li>
       </ul>
     </div>
diff --git a/_layouts/home.html b/_layouts/home.html
index 8d5e36f..1613cc1 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -9,7 +9,7 @@
       <div class="container">
         <h1 class="hyper-logo">hyper</h1>
         <p>Fast and safe HTTP for the Rust language.</p>
-        <p><a href="/stable" class="btn hyper-getstarted">Get Started</a></p>
+        <p><a href="/guides/1" class="btn hyper-getstarted">Get Started</a></p>
       </div>
     </section>
     <section class="container">
@@ -18,7 +18,7 @@ <h1 class="hyper-logo">hyper</h1>
         <p class="lead">
           <b>Note:</b> hyper is planning a stable <code>1.0</code> release at the end of January 2023.
           These guides will be gradually transitioned to <code>1.0</code>, but if you're looking for
-          guides for <code>0.14</code> you can find them <a href="/legacy">here</a>. If you'd like to
+          guides for <code>0.14</code> you can find them <a href="/guides/0.14">here</a>. If you'd like to
           learn more about the move to <code>1.0</code>, 
           <a href="https://seanmonstar.com/post/680802159018803200/hyper-10-roadmap">this</a> is a good place to start.
         </p>
diff --git a/_legacy/client/index.md b/_legacy/client/index.md
index 149150e..bb4b840 100644
--- a/_legacy/client/index.md
+++ b/_legacy/client/index.md
@@ -1,6 +1,6 @@
 ---
 title: Client Guides
-permalink: /legacy/client/
+permalink: /0.14/client
 ---
 
 This is just placeholder page. It should probably become a table of
diff --git a/_legacy/index.md b/_legacy/index.md
index bfb7f69..e58433f 100644
--- a/_legacy/index.md
+++ b/_legacy/index.md
@@ -1,7 +1,7 @@
 ---
 title:  Getting Started
 layout: guide
-permalink: /legacy/
+permalink: /guides/0.14/
 ---
 
 hyper is an HTTP library for the Rust language.
diff --git a/_legacy/server/index.md b/_legacy/server/index.md
index d7fc699..388c281 100644
--- a/_legacy/server/index.md
+++ b/_legacy/server/index.md
@@ -1,6 +1,6 @@
 ---
 title: Server Guides
-permalink: /legacy/server/
+permalink: /0.14/server
 ---
 
 This is just placeholder page. It should probably become a table of
diff --git a/_stable/index.md b/_stable/index.md
index ee07521..72ab722 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -1,11 +1,11 @@
 ---
 title:  Getting Started
 layout: guide
-permalink: /stable/
+permalink: /guides/1/
 ---
 
 ***Note:** these guides are for the upcoming version `1.0` of hyper,
-click [here](/legacy) to see the `0.14` guides.*
+click [here](/guides/0.14) to see the `0.14` guides.*
 
 hyper is an HTTP library for the Rust language.
 
diff --git a/_stable/server/index.md b/_stable/server/index.md
index 4fa5cc8..8c61af2 100644
--- a/_stable/server/index.md
+++ b/_stable/server/index.md
@@ -1,6 +1,6 @@
 ---
 title: Server Guides
-permalink: /stable/server/
+permalink: /1/server/
 ---
 
 This is just placeholder page. It should probably become a table of

From 41592d3adb55314830042430b84a3c4f3b29c2a9 Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Wed, 21 Dec 2022 15:51:56 +0100
Subject: [PATCH 047/138] feat: redirect from old urls to new 0.14 urls

---
 _config.yml                         | 3 +++
 _legacy/client/advanced.md          | 2 ++
 _legacy/client/basic.md             | 2 ++
 _legacy/client/configuration.md     | 2 ++
 _legacy/client/index.md             | 2 ++
 _legacy/index.md                    | 2 ++
 _legacy/server/echo.md              | 2 ++
 _legacy/server/graceful-shutdown.md | 2 ++
 _legacy/server/hello-world.md       | 2 ++
 _legacy/server/index.md             | 2 ++
 10 files changed, 21 insertions(+)

diff --git a/_config.yml b/_config.yml
index 2441177..b87a627 100644
--- a/_config.yml
+++ b/_config.yml
@@ -42,6 +42,9 @@ relative_links:
   enabled: true
   collections: true
 
+plugins:
+  - jekyll-redirect-from
+  
 docs_url: https://docs.rs/hyper/1.0.0-rc.1
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
 futures_url: https://docs.rs/futures/0.3.*
diff --git a/_legacy/client/advanced.md b/_legacy/client/advanced.md
index 828f0b3..f8cc7ae 100644
--- a/_legacy/client/advanced.md
+++ b/_legacy/client/advanced.md
@@ -1,6 +1,8 @@
 ---
 title: Advanced Client Usage
 layout: guide
+redirect_from: 
+    - /guides/client/advanced
 ---
 
 Once you've done all the setup in the [simple guide][], you probably
diff --git a/_legacy/client/basic.md b/_legacy/client/basic.md
index 5dfb764..44926f3 100644
--- a/_legacy/client/basic.md
+++ b/_legacy/client/basic.md
@@ -1,6 +1,8 @@
 ---
 title: Getting Started with a Client
 layout: guide
+redirect_from: 
+    - /guides/client/basic
 ---
 
 To start with, we'll just get a simple `GET` request to a webpage working,
diff --git a/_legacy/client/configuration.md b/_legacy/client/configuration.md
index 5ca3a28..be09c28 100644
--- a/_legacy/client/configuration.md
+++ b/_legacy/client/configuration.md
@@ -1,6 +1,8 @@
 ---
 title: Client Configuration
 layout: guide
+redirect_from: 
+    - /guides/client/configuration
 ---
 
 ## Using TLS
diff --git a/_legacy/client/index.md b/_legacy/client/index.md
index bb4b840..65a8e67 100644
--- a/_legacy/client/index.md
+++ b/_legacy/client/index.md
@@ -1,6 +1,8 @@
 ---
 title: Client Guides
 permalink: /0.14/client
+redirect_from: 
+    - /guides/client/
 ---
 
 This is just placeholder page. It should probably become a table of
diff --git a/_legacy/index.md b/_legacy/index.md
index e58433f..c6a229b 100644
--- a/_legacy/index.md
+++ b/_legacy/index.md
@@ -2,6 +2,8 @@
 title:  Getting Started
 layout: guide
 permalink: /guides/0.14/
+redirect_from: 
+    - /guides/
 ---
 
 hyper is an HTTP library for the Rust language.
diff --git a/_legacy/server/echo.md b/_legacy/server/echo.md
index 113a134..e083e96 100644
--- a/_legacy/server/echo.md
+++ b/_legacy/server/echo.md
@@ -1,6 +1,8 @@
 ---
 title: Echo, echo, echo
 layout: guide
+redirect_from: 
+    - /guides/server/echo
 ---
 
 You already have a [Hello World server](hello-world.md)? Excellent! Usually,
diff --git a/_legacy/server/graceful-shutdown.md b/_legacy/server/graceful-shutdown.md
index 0f02760..1edcb90 100644
--- a/_legacy/server/graceful-shutdown.md
+++ b/_legacy/server/graceful-shutdown.md
@@ -1,6 +1,8 @@
 ---
 title:  Gracefully Shutdown a Server
 layout: guide
+redirect_from: 
+    - /guides/server/graceful-shutdown
 ---
 
 hyper `Server`s have the ability to "gracefully" shutdown. This means stopping to accept new requests, and shutting down once all in-progress requests have completed.
diff --git a/_legacy/server/hello-world.md b/_legacy/server/hello-world.md
index f102f25..e195caa 100644
--- a/_legacy/server/hello-world.md
+++ b/_legacy/server/hello-world.md
@@ -1,6 +1,8 @@
 ---
 title:  Getting Started with a Server
 layout: guide
+redirect_from: 
+    - /guides/server/hello-world
 ---
 
 Let's start by making a "Hello, World!" server, and expand from there.
diff --git a/_legacy/server/index.md b/_legacy/server/index.md
index 388c281..3c0b37f 100644
--- a/_legacy/server/index.md
+++ b/_legacy/server/index.md
@@ -1,6 +1,8 @@
 ---
 title: Server Guides
 permalink: /0.14/server
+redirect_from: 
+    - /guides/server/
 ---
 
 This is just placeholder page. It should probably become a table of

From 96a701e2d46e9a79ced4b1f2ed4f0b5e3aaf0c34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?=
 <29732646+oddgrd@users.noreply.github.com>
Date: Tue, 27 Dec 2022 21:14:45 +0100
Subject: [PATCH 048/138] guides: add 1.0 version of basic client guide (#76)

---
 _config.yml             |   3 +-
 _stable/client/basic.md | 232 ++++++++++++++++++++++++++++++++++++++++
 _stable/client/index.md |   8 ++
 3 files changed, 242 insertions(+), 1 deletion(-)
 create mode 100644 _stable/client/basic.md
 create mode 100644 _stable/client/index.md

diff --git a/_config.yml b/_config.yml
index b87a627..b1fb4a2 100644
--- a/_config.yml
+++ b/_config.yml
@@ -47,8 +47,9 @@ plugins:
   
 docs_url: https://docs.rs/hyper/1.0.0-rc.1
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
-futures_url: https://docs.rs/futures/0.3.*
+http_body_util_url: https://docs.rs/http-body-util/0.1.0-rc.1
 hyper_tls_url: https://docs.rs/hyper-tls/*
 
+futures_url: https://docs.rs/futures/0.3.*
 legacy_docs_url: https://docs.rs/hyper/0.14.23
 legacy_examples_url: https://github.com/hyperium/hyper/tree/0.14.x/examples
diff --git a/_stable/client/basic.md b/_stable/client/basic.md
new file mode 100644
index 0000000..c83ca51
--- /dev/null
+++ b/_stable/client/basic.md
@@ -0,0 +1,232 @@
+---
+title: Getting Started with a Client
+layout: guide
+---
+
+To start with, we'll just get a simple `GET` request to a webpage working,
+so we can see all the moving parts. First, we need our dependencies.
+Let's tell Cargo about our dependencies by having this in the Cargo.toml.
+
+## Dependencies
+
+```toml
+[dependencies]
+hyper = { version = "1.0.0-rc.1", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
+http-body-util = "0.1.0-rc.1"
+```
+
+Now, we need to import pieces to use from our dependencies:
+
+```rust
+# extern crate http_body_util;
+# extern crate hyper;
+# extern crate tokio;
+use http_body_util::Empty;
+use hyper::Request;
+use hyper::body::Bytes;
+use tokio::net::TcpStream;
+# fn main() {}
+```
+
+## Runtime
+
+Now, we'll make a request in the `main` of our program. This may seem
+like a bit of work just to make a simple request, and you'd be correct,
+but the point here is just to show all the setup required. Once you have this,
+you are set to make thousands of client requests efficiently.
+
+We have to setup some sort of runtime. You can use whichever async runtime you'd
+like, but for this guide we're going to use tokio. If you've never used futures 
+in Rust before, you may wish to read through [Tokio's guide on Futures][Tokio-Futures].
+
+```rust
+# extern crate tokio;
+# mod no_run {
+#[tokio::main]
+async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+    // This is where we will setup our HTTP client requests.
+
+    Ok(())
+}
+# }
+# fn main() {}
+```
+
+## Setup
+
+To get started we'll need to get a few things setup. For this guide we're
+going to send a GET [`Request`][Request] to [http://httpbin.org/ip](http://httpbin.org/ip), 
+which will return a `200 OK` and the Requester's IP address in the body. 
+
+We need to open a TCP connection to the remote host using a hostname and port,
+which in this case is `httpbin.org` and the default port for HTTP: `80`. With our
+connection opened, we pass it in to the `client::conn::http1::handshake` function,
+performing a handshake to verify the remote is ready to receive our requests. 
+
+A successful handshake will give us a [Connection][Connection] future that processes
+all HTTP state, and a [SendRequest][SendRequest] struct that we can use to send our 
+`Request`s on the connection. 
+
+To start driving the HTTP state we have to poll the `Connection`, so to finish our 
+setup we'll spawn a `tokio::task` and `await` it.
+
+```rust
+# extern crate http_body_util;
+# extern crate hyper;
+# extern crate tokio;
+# use http_body_util::Empty;
+# use hyper::body::Bytes;
+# use hyper::Request;
+# use tokio::net::TcpStream;
+# async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+// Parse our URL...
+let url = "http://httpbin.org/ip".parse::<hyper::Uri>()?;
+
+// Get the host and the port
+let host = url.host().expect("uri has no host");
+let port = url.port_u16().unwrap_or(80);
+
+let address = format!("{}:{}", host, port);
+
+// Open a TCP connection to the remote host
+let stream = TcpStream::connect(address).await?;
+
+// Perform a TCP handshake
+let (mut sender, conn) = hyper::client::conn::http1::handshake(stream).await?;
+
+// Spawn a task to poll the connection, driving the HTTP state
+tokio::task::spawn(async move {
+    if let Err(err) = conn.await {
+        println!("Connection failed: {:?}", err);
+    }
+});
+# let authority = url.authority().unwrap().clone();
+# let req = Request::builder()
+#     .uri(url)
+#     .header(hyper::header::HOST, authority.as_str())
+#     .body(Empty::<Bytes>::new())?;
+# let mut res = sender.send_request(req).await?;
+# Ok(())
+# }
+# fn main() {}
+```
+
+## GET
+
+Now that we've set up our connection, we're ready to construct and send our first `Request`! 
+Since `SendRequest` doesn't require absolute-form `URI`s we are required to include a `HOST` 
+header in our requests. And while we can send our `Request` with an empty `Body`, we need to
+explicitly set it, which we'll do with the [`Empty`][Empty] utility struct.
+
+All we need to do now is pass the `Request` to `SendRequest::send_request`, this returns a 
+future which will resolve to the [`Response`][Response] from `httpbin.org`. We'll print the
+status of the response to see that it returned the expected `200 OK` status.
+
+```rust
+# extern crate http_body_util;
+# extern crate hyper;
+# extern crate tokio;
+# use http_body_util::Empty;
+# use hyper::body::Bytes;
+# use hyper::Request;
+# use tokio::net::TcpStream;
+# async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+# let url = "http://httpbin.org/ip".parse::<hyper::Uri>()?;
+# let host = url.host().expect("uri has no host");
+# let port = url.port_u16().unwrap_or(80);
+# let addr = format!("{}:{}", host, port);
+# let stream = TcpStream::connect(addr).await?;
+# let (mut sender, conn) = hyper::client::conn::http1::handshake(stream).await?;
+# tokio::task::spawn(async move {
+# if let Err(err) = conn.await {
+# println!("Connection failed: {:?}", err);
+# }
+# });
+// The authority of our URL will be the hostname of the httpbin remote
+let authority = url.authority().unwrap().clone();
+
+// Create an HTTP request with an empty body and a HOST header
+let req = Request::builder()
+    .uri(url)
+    .header(hyper::header::HOST, authority.as_str())
+    .body(Empty::<Bytes>::new())?;
+
+// Await the response...
+let mut res = sender.send_request(req).await?;
+
+println!("Response status: {}", res.status());
+# Ok(())
+# }
+# fn main() {}
+```
+
+## Response bodies
+
+We know that sending a GET `Request` to `httpbin.org/ip` will return our IP address in
+the `Response` body. To see the returned body, we'll simply write it to `stdout`.
+
+Bodies in hyper are asynchronous streams of [`Frame`][Frame]s, so we don't have to wait for the
+whole body to arrive, buffering it into memory, and then writing it out. We can simply 
+`await` each `Frame` and write them directly to `stdout` as they arrive!
+
+In addition to importing `stdout`, we'll need to make use of the `BodyExt` trait:
+
+```rust
+# extern crate http_body_util;
+# extern crate tokio;
+use http_body_util::BodyExt;
+use tokio::io::{stdout, AsyncWriteExt as _};
+```
+
+```rust
+# extern crate http_body_util;
+# extern crate hyper;
+# extern crate tokio;
+# use http_body_util::{BodyExt, Empty};
+# use hyper::body::Bytes;
+# use hyper::Request;
+# use tokio::net::TcpStream;
+# use tokio::io::{self, AsyncWriteExt as _};
+# async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+# let url = "http://httpbin.org/ip".parse::<hyper::Uri>()?;
+# let host = url.host().expect("uri has no host");
+# let port = url.port_u16().unwrap_or(80);
+# let addr = format!("{}:{}", host, port);
+# let stream = TcpStream::connect(addr).await?;
+# let (mut sender, conn) = hyper::client::conn::http1::handshake(stream).await?;
+# tokio::task::spawn(async move {
+#     if let Err(err) = conn.await {
+#         println!("Connection failed: {:?}", err);
+#     }
+# });
+# let authority = url.authority().unwrap().clone();
+# let req = Request::builder()
+# .uri(url)
+# .header(hyper::header::HOST, authority.as_str())
+# .body(Empty::<Bytes>::new())?;
+# let mut res = sender.send_request(req).await?;
+// Stream the body, writing each frame to stdout as it arrives
+while let Some(next) = res.frame().await {
+    let frame = next?;
+    if let Some(chunk) = frame.data_ref() {
+        io::stdout().write_all(&chunk).await?;
+    }
+}
+# Ok(())
+# }
+# fn main() {}
+```
+And that's it! You can see the [full example here][example].
+
+[Tokio]: https://tokio.rs
+[Tokio-Futures]: https://tokio.rs/tokio/tutorial/async
+[StatusCode]: {{ site.docs_url }}/hyper/struct.StatusCode.html
+[Response]: {{ site.docs_url }}/hyper/struct.Response.html
+[Request]: {{ site.docs_url }}/hyper/struct.Request.html
+[Connection]: {{ site.docs_url }}/hyper/client/conn/http1/struct.Connection.html
+[SendRequest]: {{ site.docs_url }}/hyper/client/conn/http1/struct.SendRequest.html
+[Frame]: {{ site.docs_url }}/hyper/body/struct.Frame.html
+[Empty]: {{ site.http_body_util_url }}/http_body_util/struct.Empty.html
+
+[example]: {{ site.examples_url }}/client.rs
diff --git a/_stable/client/index.md b/_stable/client/index.md
new file mode 100644
index 0000000..bd6b487
--- /dev/null
+++ b/_stable/client/index.md
@@ -0,0 +1,8 @@
+---
+title: Client Guides
+permalink: /1/client/
+---
+
+This is just placeholder page. It should probably become a table of
+contents for the client guides.
+

From 08c4c66d8fae807e9531d918f99cad097c98046b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?=
 <29732646+oddgrd@users.noreply.github.com>
Date: Fri, 6 Jan 2023 22:22:23 +0100
Subject: [PATCH 049/138] feat: update guides to rc 2 (#79)

---
 .github/workflows/check_guides.sh | 4 ++--
 _config.yml                       | 4 ++--
 _stable/client/basic.md           | 4 ++--
 _stable/index.md                  | 2 +-
 _stable/server/echo.md            | 2 +-
 _stable/server/hello-world.md     | 4 ++--
 6 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index dcfabd1..2512554 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -19,9 +19,9 @@ EOF
         fi
         if [ $value = stable ]; then
             cat >> "$value/Cargo.toml" <<-EOF
-    hyper = { version = "1.0.0-rc.1", features = ["full"] }
+    hyper = { version = "1.0.0-rc.2", features = ["full"] }
     tokio = { version = "1", features = ["full"] }
-    http-body-util = "0.1.0-rc.1" 
+    http-body-util = "0.1.0-rc.2" 
 EOF
             cargo build --manifest-path "$value/Cargo.toml"
         fi
diff --git a/_config.yml b/_config.yml
index b1fb4a2..d0d83e2 100644
--- a/_config.yml
+++ b/_config.yml
@@ -45,9 +45,9 @@ relative_links:
 plugins:
   - jekyll-redirect-from
   
-docs_url: https://docs.rs/hyper/1.0.0-rc.1
+docs_url: https://docs.rs/hyper/1.0.0-rc.2
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
-http_body_util_url: https://docs.rs/http-body-util/0.1.0-rc.1
+http_body_util_url: https://docs.rs/http-body-util/0.1.0-rc.2
 hyper_tls_url: https://docs.rs/hyper-tls/*
 
 futures_url: https://docs.rs/futures/0.3.*
diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index c83ca51..1b90655 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -11,9 +11,9 @@ Let's tell Cargo about our dependencies by having this in the Cargo.toml.
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.1", features = ["full"] }
+hyper = { version = "1.0.0-rc.2", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
-http-body-util = "0.1.0-rc.1"
+http-body-util = "0.1.0-rc.2"
 ```
 
 Now, we need to import pieces to use from our dependencies:
diff --git a/_stable/index.md b/_stable/index.md
index 72ab722..ebed969 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -13,7 +13,7 @@ You can start using it by first adding it to your `Cargo.toml`:
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.1", features = ["full"] }
+hyper = { version = "1.0.0-rc.2", features = ["full"] }
 ```
 
 - If building a web server, continue with the [Server guide][].
diff --git a/_stable/server/echo.md b/_stable/server/echo.md
index b7e6c20..4f9068a 100644
--- a/_stable/server/echo.md
+++ b/_stable/server/echo.md
@@ -148,7 +148,7 @@ of our request body to uppercase, and returning the stream in our `Response`:
 (&Method::POST, "/echo/uppercase") => {
     // Map this body's frame to a different type
     let frame_stream = req.into_body().map_frame(|frame| {
-        let frame = if let Some(data) = frame.into_data() {
+        let frame = if let Ok(data) = frame.into_data() {
             // Convert every byte in every Data frame to uppercase
             data.iter()
                 .map(|byte| byte.to_ascii_uppercase())
diff --git a/_stable/server/hello-world.md b/_stable/server/hello-world.md
index a1c3436..7133431 100644
--- a/_stable/server/hello-world.md
+++ b/_stable/server/hello-world.md
@@ -9,9 +9,9 @@ First we need to declare our dependencies, let's add the following to our `Cargo
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.1", features = ["full"] }
+hyper = { version = "1.0.0-rc.2", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
-http-body-util = "0.1.0-rc.1" 
+http-body-util = "0.1.0-rc.2" 
 ```
 
 Next, we need to add some imports in our `main.rs` file:

From c9eb0dbb21257f30d7a912fe026f777b317af03b Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 12 Jan 2023 17:52:06 -0500
Subject: [PATCH 050/138] teach checking for limits on request bodies (#80)

---
 _legacy/server/echo.md | 17 +++++++++++++++--
 _stable/server/echo.md | 13 ++++++++++++-
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/_legacy/server/echo.md b/_legacy/server/echo.md
index e083e96..0788b80 100644
--- a/_legacy/server/echo.md
+++ b/_legacy/server/echo.md
@@ -170,16 +170,29 @@ collect the full body.
 In this case, we can't really generate a `Response` immediately. Instead, we
 must wait for the full request body to be received.
 
-We want to concatenate the request body, and map the result into our `reverse` function, and return the eventual result. We can make use of the `hyper::body::to_bytes` utility function to make this easy.
+We want to concatenate the request body, and map the result into our `reverse`
+function, and return the eventual result. We can make use of the
+`hyper::body::to_bytes` utility function to make this easy.
+
+> Note: You must always be careful not to buffer without a max bounds. We'll
+> set a 64kb maximum here.
 
 ```rust
 # extern crate hyper;
-# use hyper::{Body, Method, Request, Response};
+# use hyper::{body::HttpBody, Body, Method, Request, Response};
 # async fn echo(req: Request<Body>) -> Result<Response<Body>, hyper::Error> {
 #     let mut response = Response::default();
 #     match (req.method(), req.uri().path()) {
 // Yet another route inside our match block...
 (&Method::POST, "/echo/reverse") => {
+    // Protect our server from massive bodies.
+    let upper = req.body().size_hint().upper().unwrap_or(u64::MAX);
+    if upper > 1024 * 64 {
+        let mut resp = Response::new(Body::from("Body too big"));
+        *resp.status_mut() = hyper::StatusCode::PAYLOAD_TOO_LARGE;
+        return Ok(resp);
+    }
+
     // Await the full body to be concatenated into a single `Bytes`...
     let full_body = hyper::body::to_bytes(req.into_body()).await?;
 
diff --git a/_stable/server/echo.md b/_stable/server/echo.md
index 4f9068a..658f0b6 100644
--- a/_stable/server/echo.md
+++ b/_stable/server/echo.md
@@ -191,18 +191,29 @@ stream to completion, collecting all the data and trailer frames into a `Collect
 We can easily turn the `Collected` body into a single `Bytes` by calling its `into_bytes` 
 method.
 
+> Note: You must always be careful not to buffer without a max bounds. We'll
+> set a 64kb maximum here.
+
 ```rust
 # extern crate hyper;
 # extern crate http_body_util;
 # use hyper::body::Bytes;
 # use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
-# use hyper::{Method, Request, Response, StatusCode};
+# use hyper::{body::Body, Method, Request, Response, StatusCode};
 # async fn echo(
 #    req: Request<hyper::body::Incoming>,
 # ) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
 #    match (req.method(), req.uri().path()) {
 // Yet another route inside our match block...
 (&Method::POST, "/echo/reversed") => {
+    // Protect our server from massive bodies.
+    let upper = req.body().size_hint().upper().unwrap_or(u64::MAX);
+    if upper > 1024 * 64 {
+        let mut resp = Response::new(full("Body too big"));
+        *resp.status_mut() = hyper::StatusCode::PAYLOAD_TOO_LARGE;
+        return Ok(resp);
+    }
+
     // Await the whole body to be collected into a single `Bytes`...
     let whole_body = req.collect().await?.to_bytes();
 

From 9688d22a0239f81fbed5ef27629d3c99f0faf6f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?=
 <29732646+oddgrd@users.noreply.github.com>
Date: Tue, 17 Jan 2023 17:35:01 +0100
Subject: [PATCH 051/138] ci: add workflow to fetch contrib docs nightly (#78)

* ci: add workflow to fetch contrib docs

* actions: update contrib

* feat: convert doc titles to frontmatter in CI

also start implementing the contrib section, but it might need a new layout

* ci: fix path to docs

* actions: update contrib

* ci: split up commands

* refactor: delete old docs with underscores

* ci: convert readme to index

* actions: update contrib

* feat: implement the contrib section in the website

* ci: fix svg link

* ci: revert svg link fix

* ci: test out the pull request action

* doc: update contrib docs

* ci: update permissions

* feat: lowercase internal links

* doc: update contrib docs

* ci: lowercase link names, comment commands

* ci: add back contents write permission

* ci: don't lowercase MSRV, it's not used as a link

this is not ideal, but the script to lowercase links could be changed to allow MSRV name to be capitalized and links to be lowercased should we want to use MSRV as a link

* doc: update contrib docs

* ci: add contributing.md to the contrib docs

* doc: update contrib docs

* feat: add contributing to _data

Co-authored-by: github-actions <github-actions@github.com>
---
 .github/workflows/CI.yml      |   2 +
 .github/workflows/contrib.yml |  97 ++++++++
 _config.yml                   |  10 +-
 _contrib/code-of-conduct.md   |  24 ++
 _contrib/commits.md           |  68 ++++++
 _contrib/contributing.md      |  14 ++
 _contrib/governance.md        | 114 ++++++++++
 _contrib/index.md             |   7 +
 _contrib/issues.md            | 117 ++++++++++
 _contrib/maintainers.md       |  36 +++
 _contrib/msrv.md              |  12 +
 _contrib/pull-requests.md     |  52 +++++
 _contrib/roadmap.md           | 407 ++++++++++++++++++++++++++++++++++
 _contrib/tenets.md            | 101 +++++++++
 _contrib/vision-arch.svg      |   4 +
 _contrib/vision.md            | 233 +++++++++++++++++++
 _data/contrib.yml             |  14 ++
 _includes/guide_ul.html       |   6 +
 _includes/header.html         |   1 +
 _layouts/guide.html           |   3 +
 20 files changed, 1321 insertions(+), 1 deletion(-)
 create mode 100644 .github/workflows/contrib.yml
 create mode 100644 _contrib/code-of-conduct.md
 create mode 100644 _contrib/commits.md
 create mode 100644 _contrib/contributing.md
 create mode 100644 _contrib/governance.md
 create mode 100644 _contrib/index.md
 create mode 100644 _contrib/issues.md
 create mode 100644 _contrib/maintainers.md
 create mode 100644 _contrib/msrv.md
 create mode 100644 _contrib/pull-requests.md
 create mode 100644 _contrib/roadmap.md
 create mode 100644 _contrib/tenets.md
 create mode 100644 _contrib/vision-arch.svg
 create mode 100644 _contrib/vision.md
 create mode 100644 _data/contrib.yml

diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index 17cd33f..1c7eed3 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -4,6 +4,8 @@ on:
   push:
     branches:
       - master
+    paths-ignore:
+      - "_contrib/**"
 
 env:
   RUST_BACKTRACE: 1
diff --git a/.github/workflows/contrib.yml b/.github/workflows/contrib.yml
new file mode 100644
index 0000000..73f2620
--- /dev/null
+++ b/.github/workflows/contrib.yml
@@ -0,0 +1,97 @@
+name: contrib
+on:
+  schedule:
+    - cron: '15 3 * * *'
+  workflow_dispatch:
+
+permissions:
+  contents: write # to update _contrib
+  pull-requests: write # to send the updated _contrib PRs
+  
+jobs:
+  update-contrib:
+    name: Update _contrib
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout website
+        uses: actions/checkout@v3
+        with:
+          persist-credentials: false
+
+      - name: Checkout hyper
+        uses: actions/checkout@v3
+        with:
+          persist-credentials: false
+          repository: hyperium/hyper
+          path: hyper
+
+      - name: Copy CONTRIBUTING.md into docs
+        run: |
+          sed -i -e 's|./docs/||g' hyper/CONTRIBUTING.md
+          cp -a hyper/CONTRIBUTING.md hyper/docs
+      
+      # Insert frontmatter borders, replace markdown header with
+      # frontmatter title and insert layout: guide
+      - name: Convert doc titles to frontmatter 
+        run: |
+          for f in hyper/docs/*.md; do
+            sed -i -e '1i ---' \
+            -e '1s/#/title:/' \
+            -e '2i layout: guide' \
+            -e '2i ---' $f;
+          done
+
+      # Use the hyper docs readme as the index page of contrib,
+      # and insert permalink: /contrib/ in the frontmatter
+      - name: Convert readme to index
+        run: |
+          sed -i -e '4i permalink: /contrib/' hyper/docs/README.md
+          mv hyper/docs/README.md hyper/docs/index.md
+
+      # Lowercase the internal links so they will correctly point to
+      # the lowercased filenames.
+      - name: Lowercase internal links
+        run: |
+          for filename in hyper/docs/*.md; do
+            # cut `.md` from the filename before search and replace
+            filename=${filename::-3};
+
+            for file in hyper/docs/*.md; do
+              # don't lowercase MSRV
+              if [[ "${filename##*/}" == 'MSRV' ]]; then
+                continue
+              fi
+
+              # match instances of only the filename, not including
+              # the parent path, and convert them to lowercase
+              sed -i -e "s|${filename##*/}|\L\0|g" $file;
+            done
+          done
+
+      - name: Lowercase filenames and replace underscores
+        run: |
+          for f in hyper/docs/*; do
+            mv -vn "$f" "$(echo "$f" | tr '[:upper:]' '[:lower:]' | tr '_' '-')"; 
+          done
+
+      - name: Copy docs to contrib
+        run: |  
+          mkdir -p _contrib
+          cp -a hyper/docs/. _contrib/
+
+      - uses: gr2m/create-or-update-pull-request-action@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          author: github-actions <github-actions@github.com>
+          branch: actions/update-contrib
+          title: 'doc: update contrib docs'
+          body: >
+            The _contrib docs are likely out of date. This is an automatically 
+            generated PR by the `contrib.yml` GitHub workflow, which clones the docs
+            from the main repo, implements the changes in _contrib then submits a new 
+            PR or updates an existing PR.
+          commit-message: 'doc: update contrib docs'
+          path: _contrib/
+
diff --git a/_config.yml b/_config.yml
index d0d83e2..d494421 100644
--- a/_config.yml
+++ b/_config.yml
@@ -11,12 +11,17 @@ defaults:
     values:
       layout: "guide"
   -
-    
     scope:
       path: "_stable/"
       type: "guides"
     values:
       layout: "guide"
+  -
+    scope:
+      path: "_contrib/"
+      type: "guides"
+    values:
+      layout: "guide"
   
 
 collections:
@@ -29,6 +34,9 @@ collections:
   posts:
     permalink: /blog/:year/:month/:day/:title/
     output: true
+  contrib:
+    permalink: /contrib/:path/
+    output: true
 
 # Build settings
 markdown: kramdown
diff --git a/_contrib/code-of-conduct.md b/_contrib/code-of-conduct.md
new file mode 100644
index 0000000..09955a1
--- /dev/null
+++ b/_contrib/code-of-conduct.md
@@ -0,0 +1,24 @@
+---
+title: Code of Conduct
+layout: guide
+---
+
+## Be Kind
+
+- Don't be mean.
+- Insulting anyone is prohibited.
+- Harassment of any kind is prohibited.
+- If another person feels uncomfortable with your remarks, stop it.
+- If a moderator deems your comment or conduct as inappropriate, stop it.
+- Disagreeing is fine, but keep it to technical arguments. Never attack the person.
+- Give the benefit of the doubt. Assume good intentions.
+- Show empathy. There are 3 interpretations to any message: what we thought, what we said, and what they understand.
+- This does mean we exclude people who are not kind. We are happy to make that sacrifice.
+
+## Or Else
+
+- Violations of the Code of Conduct will result in 1 warning.
+- If the violation is major, a moderator may just ban immediately.
+- If a warning has already been given, a moderator will ban the offender.
+- There is no process for appealing a ban.
+- Any violations can be reported to sean@seanmonstar.com.
diff --git a/_contrib/commits.md b/_contrib/commits.md
new file mode 100644
index 0000000..67aabe3
--- /dev/null
+++ b/_contrib/commits.md
@@ -0,0 +1,68 @@
+---
+title: Git Commit Guidelines
+layout: guide
+---
+
+We have very precise rules over how our git commit messages can be formatted.  This leads to **more
+readable messages** that are easy to follow when looking through the **project history**.  But also,
+we use the git commit messages to **generate the change log**.
+
+## Commit Message Format
+Each commit message consists of a **header**, a **body** and a **footer**.  The header has a special
+format that includes a **type**, a **scope** and a **subject**:
+
+```
+<type>(<scope>): <subject>
+<BLANK LINE>
+<body>
+<BLANK LINE>
+<footer>
+```
+
+Any line of the commit message cannot be longer 100 characters! This allows the message to be easier
+to read on github as well as in various git tools.
+
+## Type
+Must be one of the following:
+
+* **feat**: A new feature
+* **fix**: A bug fix
+* **docs**: Documentation only changes
+* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing
+  semi-colons, etc)
+* **refactor**: A code change that neither fixes a bug or adds a feature
+* **perf**: A code change that improves performance
+* **test**: Adding missing tests
+* **chore**: Changes to the build process or auxiliary tools and libraries such as documentation
+    generation
+
+## Scope
+The scope should refer to a module in hyper that is being touched. Examples:
+
+* client
+* server
+* http1
+* http2
+* ffi
+* upgrade
+* examples
+
+## Subject
+
+The subject contains succinct description of the change:
+
+* use the imperative, present tense: "change" not "changed" nor "changes"
+* don't capitalize first letter
+* no dot (.) at the end
+
+## Body
+
+Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes"
+The body should include the motivation for the change and contrast this with previous behavior.
+
+## Footer
+
+The footer should contain any information about **Breaking Changes** and is also the place to
+reference GitHub issues that this commit **Closes**.
+
+The last line of commits introducing breaking changes should be in the form `BREAKING CHANGE: <desc>`
diff --git a/_contrib/contributing.md b/_contrib/contributing.md
new file mode 100644
index 0000000..39db483
--- /dev/null
+++ b/_contrib/contributing.md
@@ -0,0 +1,14 @@
+---
+title: Contributing to Hyper
+layout: guide
+---
+
+You want to contribute? You're awesome! Don't know where to start? Check the [list of easy issues](https://github.com/hyperium/hyper/issues?q=is%3Aopen+is%3Aissue+label%3AE-easy).
+
+[easy tag]: https://github.com/hyperium/hyper/issues?q=label%3AE-easy+is%3Aopen
+
+
+## [Pull Requests](pull_requests.md)
+
+- [Submitting a Pull Request](pull_requests.md#submitting-a-pull-request)
+- [Commit Guidelines](commits.md)
diff --git a/_contrib/governance.md b/_contrib/governance.md
new file mode 100644
index 0000000..2a64bec
--- /dev/null
+++ b/_contrib/governance.md
@@ -0,0 +1,114 @@
+---
+title: Governance
+layout: guide
+---
+
+## Making decisions
+
+There's two main pieces to the way decisions are made in hyper:
+
+1. A decision-making framework
+2. The people who apply it
+
+The people are described [lower down in this document](#roles).
+
+### Decision-making framework
+
+We start with the users. The project wouldn't exist without them, and it exists
+in order to enable users to do amazing things with HTTP. We listen to our
+users. Some actively contribute their thoughts, but many others we must seek
+out to learn about their usage, joys, and headaches. Those insights allow our
+experts to determine the best solutions for the users.
+
+We then define a set of [tenets](./tenets.md), which are guiding principles
+that can be used to measure aspects of individual decisions. It should be
+possible to identify one or more tenets that apply to why a decision is made.
+And the set helps us balance which priorities are more important for our users.
+
+We combine the usecases with the tenets to come up with a [vision](./vision.md)
+that provides a longer-term plan of what hyper _should_ look like.
+
+Finally, we define a [roadmap](./roadmap.md) that describes what the
+short-term, tactical changes to bring hyper closer in line with the vision.
+
+## Roles
+
+These are the roles people can fill when participating in the project. A list
+of the people in each role is available in [maintainers](./maintainers.md).
+
+### Contributor
+
+A contributor is anyone who contributes their time to provide value for the
+project. This could be in the form of code, documentation, filing issues,
+discussing designs, or helping others on the issue tracker or in chat.
+
+All contributors MUST follow the [Code of Conduct][coc].
+
+👋  **New here?** [This could be you!][contrib]
+
+
+### Triager
+
+Triagers assess issues on the issue tracker. They help make sure the work is
+well organized, and are critical for making new issue reporters feeling
+welcome.
+
+Responsibilities:
+
+- Adhere to the [Code of Conduct][coc]
+- Follow the [triager's guide][triage-guide]
+
+Privileges:
+
+- Can edit, label, and close issues
+- Member of the organization
+- Can be assigned issues and pull requests
+
+How to become:
+
+- Make a few [contributions][contrib] to the project, to show you can follow
+  the [Code of Conduct][coc].
+- Self-nominate by making a pull request adding yourself to the
+  [list](./maintainers.md#triagers).
+
+
+### Collaborator
+
+Collaborators are contributors who have been helping out in a consistent basis.
+
+Responsibilities:
+
+- Be exemplars of the [Code of Conduct][coc]
+- Internalize the [vision](./vision.md)
+- Reviewing pull requests from other contributors
+- Provide feedback on proposed features and design documents
+- [Welcome new contributors][triage-guide]
+- Answer questions in issues and/or chat
+- Mentor contributors to become members
+
+Privileges:
+
+- Can review and merge pull requests
+- Can trigger re-runs of CI, and approve CI for first-time contributors
+- Can assign issues and pull requests to other organization members
+
+How to become:
+
+- Work at fulfilling the above responsibilities.
+- Any collaborator may nominate a contributor who has been around for some time
+  and is already filling the responsibilities.
+- Another collaborator must second the nomination.
+- If there are no objections, a maintainer will welcome the new collaborator.
+
+Don't be afraid to ask a collaborator for what you could work on to reach this
+goal!
+
+### Maintainer
+
+Maintainers are the project admins. Besides being a collaborator, they take care
+of house-keeping duties, help lead the direction, and have the final authority when
+required.
+
+[coc]: ./code_of_conduct.md
+[contrib]: ../contributing.md
+[triage-guide]: ./issues.md#triaging
diff --git a/_contrib/index.md b/_contrib/index.md
new file mode 100644
index 0000000..c94aaee
--- /dev/null
+++ b/_contrib/index.md
@@ -0,0 +1,7 @@
+---
+title: Developing hyper
+layout: guide
+permalink: /contrib/
+---
+
+This is a set of documents outline how hyper is developed, how to contribute or get involved, various processes we use, and internal design explanations.
diff --git a/_contrib/issues.md b/_contrib/issues.md
new file mode 100644
index 0000000..587acf7
--- /dev/null
+++ b/_contrib/issues.md
@@ -0,0 +1,117 @@
+---
+title: Issues
+layout: guide
+---
+
+The [issue tracker][issues] for hyper is where we track all features, bugs, and discuss proposals.
+
+## Triaging
+
+Once an issue has been opened, it is normal for there to be discussion
+around it. Some contributors may have differing opinions about the issue,
+including whether the behavior being seen is a bug or a feature. This
+discussion is part of the process and should be kept focused, helpful, and
+professional.
+
+The objective of helping with triaging issues is to help reduce the issue
+backlog and keep the issue tracker healthy, while enabling newcomers another
+meaningful way to get engaged and contribute.
+
+### Acknowledge
+
+Acknowledge the human. This is meant actively, such as giving a welcome, or
+thanks for a detailed report, or any other greeting that makes the person feel
+that their contribution (issues are contributions!) is valued. It also is meant
+to be internalized, and be sure to always [treat the person kindly][COC]
+throughout the rest of the steps of triaging.
+
+### Ask for more info
+
+Frequently, we need more information than was originally provided to fully
+evaluate an issue.
+
+If it is a bug report, ask follow up questions that help us get a [minimum
+reproducible example][MRE]. This may take several round-trip questions. Once
+all the details are gathered, it may be helpful to edit the original issue text
+to include them all.
+
+### Categorize
+
+Once enough information has been gathered, the issue should be categorized
+with [labels](#labels). Ideally, most issues should be labelled with an area,
+effort, and severity. An issue _can_ have multiple areas, pick what fits. There
+should be only one severity, and the descriptions of each should help to pick
+the right one. The hardest label to select is "effort". If after reading the
+descriptions of each effort level, you're still unsure, you can ping a
+maintainer to pick one.
+
+### Adjust the title
+
+An optional step when triaging is to adjust the title once more information is
+known. Sometimes an issue starts as a question, and through discussion, it
+turns out to be a feature request, or a bug report. In those cases, the title
+should be changed from a question, and the title should be a succinct action to
+be taken. For example, a question about an non-existent configuration option
+may be reworded to "Add option to Client to do Zed".
+
+### Mentoring
+
+The last part of triaging is to try to make the issue a learning experience.
+After a discussion with the reporter, it would be good to ask if they are now
+interested in submitting the change described in the issue.
+
+Otherwise, it would be best to leave the issue with a series of steps for
+anyone else to try to write the change. That could be pointing out that a
+design proposal is needed, addressing certain points. Or, if the required
+changes are mostly know, a list of links to modules and functions where code
+needs to be changed, and to what. That way we mentor newcomers to become
+successful contributors of new [pull requests][PRs].
+
+## Labels
+
+Issues are organized with a set of labels. Most labels follow a system of being prefixed by a "type".
+
+### Area
+
+The area labels describe what part of hyper is relevant.
+
+- **A-body**: streaming request and response bodies.
+- **A-client**: the HTTP client.
+- **A-dependencies**: library dependencies.
+- **A-docs**: documentation.
+- **A-error**: error reporting and types.
+- **A-ffi**: the C API.
+- **A-http1**: the HTTP/1 specifics.
+- **A-http2**: the HTTP/2 specifics.
+- **A-server**: the HTTP server.
+- **A-tests**: the unit and integration tests.
+
+### Blocked
+
+These labels indicate an issue is "blocked" for some reason.
+
+- **B-breaking-change**: a breaking change that is waiting for the next semver-compatible release.
+- **B-rfc**: request for comments. More discussion is needed to explore the design.
+- **B-upstream**: waiting on something in a dependency or the compiler.
+
+### Effort
+
+The effort labels are a best-guess at roughly how much effort and knowledge of hyper is needed to accomplish the task.
+
+- **E-easy**: a great starting point for a new contributor.
+- **E-medium**: some knowledge of how hyper internals work would be useful.
+- **E-hard**: likely requires a deeper understanding of how hyper internals work.
+
+### Severity
+
+The severity marks how _severe_ the issue is. Note this isn't "importance" or "priority".
+
+- **S-bug**: something is wrong, this is bad!
+- **S-feature**: this is a new feature request, adding something new.
+- **S-performance**: make existing working code go faster.
+- **S-refactor**: improve internal code to help readability and maintenance.
+
+[issues]: https://github.com/hyperium/hyper/issues
+[COC]: ./code_of_conduct.md
+[PRs]: ./pull_requests.md
+[MRE]: https://en.wikipedia.org/wiki/Minimal_reproducible_example
diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
new file mode 100644
index 0000000..bb576f9
--- /dev/null
+++ b/_contrib/maintainers.md
@@ -0,0 +1,36 @@
+---
+title: The People
+layout: guide
+---
+
+To see what these roles do, and how to become one, look at [governance](./governance.md).
+
+## Triagers
+
+- Eray Karatay (@programatik29)
+- Oddbjørn Grødem (@oddgrd)
+
+## Collaborators
+
+- Sean McArthur (@seanmonstar)
+- Steven Fackler (@sfackler)
+- Oliver Gould (@olix0r)
+- Eliza Weisman (@hawkw)
+- Lucio Franco (@LucioFranco)
+- Anthony Ramine (@nox)
+- David Pedersen (@davidpdrsn)
+- Adam Foltzer (@acfoltzer)
+
+<details>
+<summary>Emeriti</summary>
+
+### Collaborator emeriti
+
+- Jonathan Reem (@reem)
+- Carl Lerche (@carllerche)
+
+</details>
+
+## Maintainers
+
+- Sean McArthur (@seanmonstar)
diff --git a/_contrib/msrv.md b/_contrib/msrv.md
new file mode 100644
index 0000000..a1ab95b
--- /dev/null
+++ b/_contrib/msrv.md
@@ -0,0 +1,12 @@
+---
+title: Minimum Support Rust Version (MSRV)
+layout: guide
+---
+
+hyper's current policy is to always support a Rust version at least 6 months
+old. That is, a compiler version released within the last 6 months can compile
+hyper. It is possible that an older compiler can work, but that is not
+guaranteed. We try to increase the MSRV responsibly, only when a significant
+new feature is needed.
+
+The current MSRV is: **1.56**.
diff --git a/_contrib/pull-requests.md b/_contrib/pull-requests.md
new file mode 100644
index 0000000..3b3a0f7
--- /dev/null
+++ b/_contrib/pull-requests.md
@@ -0,0 +1,52 @@
+---
+title: Pull Requests
+layout: guide
+---
+
+Pull requests are the way to submit changes to the hyper repository.
+
+## Submitting a Pull Request
+
+In most cases, it a good idea to discuss a potential change in an
+[issue](issues.md). This will allow other contributors to provide guidance and
+feedback _before_ significant code work is done, and can increase the
+likelihood of getting the pull request merged.
+
+### Tests
+
+If the change being proposed alters code (as opposed to only documentation for
+example), it is either adding new functionality to hyper or it is fixing
+existing, broken functionality. In both of these cases, the pull request should
+include one or more tests to ensure that hyper does not regress in the future.
+
+### Commits
+
+Once code, tests, and documentation have been written, a commit needs to be
+made. Following the [commit guidelines](commits.md) will help with the review
+process by making your change easier to understand, and makes it easier for
+hyper to produce a valuable changelog with each release.
+
+However, if your message doesn't perfectly match the guidelines, **do not
+worry!** The person that eventually merges can easily fixup the message at that
+time.
+
+### Opening the Pull Request
+
+From within GitHub, open a new pull request from your personal branch.
+
+Once opened, pull requests are usually reviewed within a few days.
+
+### Discuss and Update
+
+You will probably get feedback or requests for changes to your Pull Request.
+This is a big part of the submission process so don't be discouraged! Some
+contributors may sign off on the Pull Request right away, others may have more
+detailed comments or feedback. This is a necessary part of the process in order
+to evaluate whether the changes are correct and necessary.
+
+Any community member can review a PR and you might get conflicting feedback.
+Keep an eye out for comments from code owners to provide guidance on
+conflicting feedback.
+
+You don't need to close the PR and create a new one to address feedback. You
+may simply push new commits to the existing branch.
diff --git a/_contrib/roadmap.md b/_contrib/roadmap.md
new file mode 100644
index 0000000..061a6df
--- /dev/null
+++ b/_contrib/roadmap.md
@@ -0,0 +1,407 @@
+---
+title: hyper 1.0 Roadmap
+layout: guide
+---
+
+## Goal
+
+Align current hyper to the [hyper vision][vision].
+
+The vision outlines a decision-making framework, use-cases, and general shape
+of hyper. This roadmap describes the currently known problems with hyper, and
+then shows what changes are needed to make hyper 1.0 look more like what is in
+the vision.
+
+## Known Issues
+
+
+> **Note**: These known issues are as of hyper v0.14.x. After v1.0 is released,
+ideally these issues will have been solved. Keeping this history may be helpful
+to Future Us, though.
+
+### Higher-level Client and Server problems
+
+Both the higher-level `Client` and `Server` types have stability concerns.
+
+For the `hyper::Server`:
+
+- The `Accept` trait is complex, and too easy to get wrong. If used with TLS, a slow TLS handshake
+  can affect all other new connections waiting for it to finish.
+- The `MakeService<&IO>` is confusing. The bounds are an assault on the eyes.
+- The `MakeService` API doesn't allow to easily annotate the HTTP connection with `tracing`.
+- Graceful shutdown doesn't give enough control.
+
+
+It's more common for people to simply use `hyper::server::conn` at this point,
+than to bother with the `hyper::Server`.
+
+While the `hyper::Client` is much easier to use, problems still exist:
+
+- The whole `Connect` design isn't stable.
+  - ALPN and proxies can provide surprising extra configuration of connections.
+  - Some `Connect` implementations may wish to view the path, in addition to the scheme, host, and port.
+  - Wants `runtime` feature
+- The Pool could be made more general or composable. At the same time, more customization is
+  desired, and it's not clear
+how to expose it yet.
+
+
+### Runtime woes
+
+hyper has been able to support different runtimes, but it has sometimes awkward
+default support for Tokio.
+
+- The `runtime` cargo-feature isn't additive
+- Built-in Tokio support can be confusing
+- Executors and Timers
+  - The `runtime` feature currently enables a few options that require a timer, such as timeouts and
+    keepalive intervals. It implicitly relies on Tokio's timer context. This can be quite confusing.
+- IO traits
+  - Should we publicly depend on Tokio's traits?
+  - `futures-io`?
+    - Definitely nope.
+    - Not stable. (0.3?)
+    - No uninitialized memory.
+  - Eventual `std` traits?
+    - They've been in design for years.
+    - We cannot base our schedule on them.
+    - When they are stable, we can:
+      - Provide a bridge in `hyper-util`.
+      - Consider a 2.0 of hyper.
+  - Define our own traits, provide util wrappers?
+
+### Forwards-compatibility
+
+There's a concern about forwards-compatibility. We want to be able to add
+support for new HTTP features without needing a new major version. While most
+of `http` and `hyper` are prepared for that, there's two potential problems.
+
+- New frames on an HTTP stream (body)
+   - Receiving a new frame type would require a new trait method
+     - There's no way to implement a "receive unknown frame" that hyper doesn't know about.
+   - Sending an unknown frame type would be even harder.
+     - Besides being able to pass an "unknown" type through the trait, the user would need to be
+       able to describe how that frame is encoded in HTTP/2/3.
+- New HTTP versions
+  - HTTP/3 will require a new transport abstraction. It's not as simple as just using some
+    `impl AsyncRead + AsyncWrite`. While HTTP/2 bundled the concept of stream creation internally,
+    and thus could be managed wholly on top of a read-write transport, HTTP/3 is different. Stream
+    creation is shifted to the QUIC protocol, and HTTP/3 needs to be able to use that directly.
+  - This means the existing `Connection` types for both client and server will not be able to
+    accept a QUIC transport so we can add HTTP/3 support.
+
+### Errors
+
+It's not easy to match for specific errors.
+
+The `Error::source()` can leak an internal dependency. For example, a
+`hyper::Error` may wrap an `h2::Error`. Users can downcast the source at
+runtime, and hyper internally changing the version of its `h2` dependency can
+cause runtime breakage for users.
+
+Formatting errors is in conflict with the current expected norm. The
+`fmt::Display` implementation for `hyper::Error` currently prints its own
+message, and then prints the message of any wrapped source error. The Errors
+Working Group currently recommends that errors only print their own message
+(link?). This conflict means that error "reporters", which crawl a source chain
+and print each error, has a lot of duplicated information.
+
+```
+error fetching website: error trying to connect: tcp connect error: Connection refused (os error 61)
+tcp connect error: Connection refused (os error 61)
+Connection refused (os error 61)
+```
+
+While there is a good reason for why hyper's `Error` types do this, at the very
+least, it _is_ unfortunate.
+
+### You call hyper, or hyper calls you?
+
+> Note: this problem space, of who calls whom, will be explored more deeply in
+> a future article.
+
+At times, it's been wondered whether hyper should call user code, or if user
+code should call hyper. For instance, should a `Service` be called with a
+request when the connection receives one, or should the user always poll for
+the next request.
+
+There's a similar question around sending a message body. Should hyper ask the
+body for more data to write, or should the user call a `write` method directly?
+
+These both get at a root topic about [write
+observability](https://github.com/hyperium/hyper/issues/2181). How do you know
+when a response, or when body data, has been written successfully? This is
+desirable for metrics, or for triggering other side-effects. 
+
+The `Service` trait also has some other frequently mentioned issues. Does
+`poll_ready` pull its complexity weight for servers? What about returning
+errors, what does that mean? Ideally users would turn all errors into
+appropriate `http::Response`s. But in HTTP/2 and beyond, stream errors are
+different from HTTP Server Error responses. Could the `Service::Error` type do
+more to encourage best practices?
+
+## Design
+
+The goal is to get hyper closer to the [vision][], using that to determine the
+best way to solve the known issues above. The main thrust of the proposed
+changes are to make hyper more **Flexible** and stable.
+
+In order to keep hyper **Understandable**, however, the proposed changes *must*
+be accompanied by providing utilities that solve the common usage patterns,
+documentation explaining how to use the more flexible pieces, and guides on how
+to reach for the `hyper-util`ity belt.
+
+The majority of the changes are smaller and can be contained to the *Public
+API* section, since they usually only apply to a single module or type. But the
+biggest changes are explained in detail here.
+
+### Split per HTTP version
+
+The existing `Connection` types, both for the client and server, abstract over
+HTTP version by requiring a generic `AsyncRead + AsyncWrite` transport type.
+But as we figure out HTTP/3, that needs to change. So to prepare now, the
+`Connection` types will be split up.
+
+For example, there will now be `hyper::server::conn::http1::Connection` and
+`hyper::server::conn::http2::Connection` types.
+
+These specific types will still have a very similar looking API that, as the
+vision describes, provides **Correct** connection management as it pertains to
+HTTP.
+
+There will be still be a type to wrap the different versions. It will no longer
+be generic over the transport type, to prepare for being able to wrap HTTP/3
+connections. Exactly how it will wrap, either by using internal trait objects,
+or an `enum Either` style, or using a `trait Connection` that each type
+implements, is something to be determined. It's likely that this "auto" type
+will start in `hyper-util`.
+
+### Focus on the `Connection` level
+
+As mentioned in the *Known Issues*, the higher-level `Client` and `Server` have
+stability and complexity problems. Therefore, for hyper 1.0, the main API will
+focus on the "lower-level" connection types. The `Client` and `Server` helpers
+will be moved to `hyper-util`.
+
+## Public API
+
+### body
+
+The `Body` struct is removed. Its internal "variants" are [separated into
+distinct types](https://github.com/hyperium/hyper/issues/2345), and can start
+in either `hyper-util` or `http-body-util`.
+
+The exported trait `HttpBody` is renamed to `Body`.
+
+A single `Body` implementation in `hyper` is the one provided by receiving
+client responses and server requests. It has the name `Streaming`.
+
+> **Unresolved**: Other names can be considered during implementation. Another
+> option is to not publicly name the implementation, but return `Response<impl
+Body>`s.
+
+The `Body` trait will be experimented on to see about making it possible to
+return more frame types beyonds just data and trailers.
+
+> **Unresolved**: What exactly this looks like will only be known after
+> experimentation.
+
+### client
+
+The high-level `hyper::Client` will be removed, along with the
+`hyper::client::connect` module. They will be explored more in `hyper-util`.
+
+As described in *Design*, the `client::conn` module will gain `http1` and
+`http2` sub-modules, providing per-version `SendRequest`, `Connection`, and
+`Builder` structs. An `auto` version can be explored in `hyper-util`.
+
+### error
+
+The `hyper::Error` struct remains in place.
+
+All errors returned from `Error::source()` are made opaque. They are wrapped an
+internal `Opaque` newtype that still allows printing, but prevents downcasting
+to the internal dependency.
+
+A new `hyper::error::Code` struct is defined. It is an opaque struct, with
+associated constants defining various code variants.
+
+> Alternative: define a non-exhaustive enum. It's not clear that this is
+> definitely better, though. Keeping it an opaque struct means we can add
+> secondary parts to the code in the future, or add bit flags, or similar
+> extensions.
+
+The purpose of `Code` is to provide an abstraction over the kind of error that
+is encountered. The `Code` could be some behavior noticed inside hyper, such as
+an incomplete HTTP message. Or it can be "translated" from the underlying
+protocol, if it defines protocol level errors. For example, an
+`h2::Reason::CANCEL`.
+
+### rt
+
+The `Executor` trait stays in here.
+
+Define a new trait `Timer`, which describes a way for users to provide a source
+of sleeping/timeout futures. Similar to `Executor`, a new generic is added to
+connection builders to provide a `Timer`.
+
+### server
+
+The higher-level `hyper::Server` struct, its related `Builder`, and the
+`Accept` trait are all removed.
+
+The `AddrStream` struct will be completely removed, as it provides no value but
+causes binary bloat.
+
+Similar to `client`, and as describe in the *Design*, the `conn` modules will
+be expanded to support `http1` and `http2` submodules. An `auto` version can be
+explored in `hyper-util`.
+
+### service
+
+A vendored and simplified `Service` trait will be explored.
+
+The error type for `Service`s used for a server will explore having the return
+type changed from any error to one that can become a `hyper::error::Code`.
+
+> **Unresolved**: Both of the above points are not set in stone. We will
+> explore and decide if they are the best outcome during development.
+
+The `MakeService` pieces will be removed.
+
+### Cargo Features
+
+Remove the `stream` feature. The `Stream` trait is not stable, and we cannot
+depend on an unstable API.
+
+Remove the `tcp` and `runtime` features. The automatic executor and timer parts
+are handled by providing implementations of `Executor` and `Timer`. The
+`connect` and `Accept` parts are also moving to `hyper-util`.
+
+### Public Dependencies
+
+- `http`
+- `http-body`
+- `bytes`
+
+Cannot be public while "unstable":
+
+- `tracing`
+
+## `hyper-util`
+
+
+### body
+
+A channel implementation of `Body` that has an API to know when the data has
+been successfully written is provided in `hyper_util::body::channel`.
+
+### client
+
+A `Pool` struct that implements `Service` is provided. It fills a similar role
+as the previous `hyper::Client`.
+
+> **Note**: The `Pool` might be something that goes into the `tower` crate
+> instead. Or it might stay here as a slightly more specialized racing-connect
+> pool. We'll find out as we go.
+
+A `connect` submodule that mostly mirrors the existing `hyper::client::connect`
+module is moved here. Connectors can be used as a source to provide `Service`s
+used by the `Pool`.
+
+### rt
+
+We can provide Tokio-backed implementations of `Executor` and `Timer`.
+
+### server
+
+A `GracefulShutdown` helper is provided, to allow for similar style of graceful
+shutdown as the previous `hyper::Server` did, but with better control.
+
+# Appendix
+
+## Unresolved Questions
+
+There are some parts of the proposal which are not fully resolved. They are
+mentioned in Design and API sections above, but also collected here for easy
+finding. While they all have _plans_, they are more exploratory parts of the
+API, and thus they have a higher possibility of changing as we implement them.
+
+The goal is to have these questions resolved and removed from the document by
+the time there is a [Release Candidate][timeline].
+
+### Should there be `hyper::io` traits?
+
+Depending on `tokio` just for `AsyncRead` and `AsyncWrite` is convenient, but
+can be confusing for users integrating hyper with other runtimes. It also ties
+our version directly to Tokio. We can consider having vendored traits, and
+providing Tokio wrappers in `hyper-util`.
+
+### Should returned body types be `impl Body`?
+
+### How could the `Body` trait prepare for unknown frames?
+
+We will experiment with this, and keep track of those experiments in a
+dedicated issue. It might be possible to use something like this:
+
+```rust
+pub trait Body {
+    type Data;
+    fn poll_frame(..) -> Result<Option<Frame<Self::Data>>>;
+}
+
+pub struct Frame<T>(Kind<T>);
+
+enum Kind<T> {
+   Data(T),
+   Trailers(HeaderMap),
+   Unknown(Box<dyn FrameThingy>),
+}
+```
+
+### Should there be a simplified `hyper::Service` trait, or should hyper depend on `tower-service`?
+
+- There's still a few uncertain decisions around tower, such as if it should be
+  changed to `async fn call`, and if `poll_ready` is the best way to handle
+  backpressure.
+- It's not clear that the backpressure is something needed at the `Server`
+  boundary, thus meaning we should remove `poll_ready` from hyper.
+- It's not 100% clear if we should keep the service pattern, or use a
+  pull-based API. This will be explored in a future blog post.
+
+## FAQ
+
+### Why did you pick _that_ name? Why not this other better name?
+
+Naming is hard. We certainly should solve it, but discussion for particular
+names for structs and traits should be scoped to the specific issues. This
+document is to define the shape of the library API.
+
+### Should I publicly depend on `hyper-util`?
+
+The `hyper-util` crate will not reach 1.0 when `hyper` does. Some types and
+traits are being moved to `hyper-util`. As with any pre-1.0 crate, you _can_
+publicly depend on it, but it is explicitly less stable.
+
+In most cases, it's recommended to not publicly expose your dependency on
+`hyper-util`. If you depend on a trait, such as used by the moved higher-level
+`Client` or `Server`, it may be better for your users to define your own
+abstraction, and then make an internal adapter.
+
+### Isn't this making hyper harder?
+
+We are making hyper more **flexible**. As noted in the [vision][], most use
+cases of hyper require it to be flexible. That _can_ mean that the exposed API
+is lower level, and that it feels more complicated. It should still be
+**understandable**.
+
+But the hyper 1.0 effort is more than just the single `hyper` crate. Many
+useful helpers will be migrated to a `hyper-util` crate, and likely improved in
+the process. The [timeline][] also points out that we will have a significant
+documentation push. While the flexible pieces will be in hyper to compose how
+they need, we will also write guides for the [hyper.rs][] showing people how to
+accomplish the most common tasks.
+
+[timeline]: https://seanmonstar.com/post/676912131372875776/hyper-10-timeline
+[vision]: https://github.com/hyperium/hyper/pull/2772
+[hyper.rs]: https://hyper.rs
diff --git a/_contrib/tenets.md b/_contrib/tenets.md
new file mode 100644
index 0000000..d5e56c1
--- /dev/null
+++ b/_contrib/tenets.md
@@ -0,0 +1,101 @@
+---
+title: Charter
+layout: guide
+---
+
+> hyper is a protective and efficient HTTP library for all.
+
+# Tenets
+
+Tenets are guiding principles. They guide how decisions are made for the whole
+project. Ideally, we do all of them all the time. In some cases, though, we may
+be forced to decide between slightly penalizing one goal or another. In that
+case, we tend to support those goals that come earlier in the list over those
+that come later (but every case is different).
+
+## 0. Open
+
+hyper is open source, always. The success of hyper depends on the health of the
+community building and using it. All contributions are in the open. We don't
+maintain private versions, and don't include features that aren't useful to
+others.
+
+[We prioritize kindness](./code_of_conduct.md), compassion and empathy towards all
+contributors. Technical skill is not a substitute for human decency.
+
+### Examples
+
+It's not usually hard for an open source library to stay open and also meet its
+other priorities. Here's some instances where being **Open** would be more
+important than **Correct** or **Fast**:
+
+- Say an individual were to bring forward a contribution that makes hyper more
+  correct, or faster, perhaps fixing some serious bug. But in doing so, they
+  also insulted people, harassed other contributors or users, or shamed
+  everyone for the previous code. They felt their contribution was "invaluable".
+  We would not accept such a contribution, instead banning the user and
+  rewriting the code amongst the kind collaborators of the project.
+
+- Say someone brings a contribution that adds a new feature useful for
+  performance or correctness, but their work accomplishes this by integrating
+  hyper with a proprietary library. We would not accept such a contribution,
+  because we don't want such a feature limited only to those users willing to
+  compromise openness, and we don't want to bifurcate the ecosystem between those
+  who make that compromise and those who don't.
+
+## 1. Correct
+
+hyper is a memory safe and precise implementation of the HTTP specification.
+Memory safety is vital in a core Internet technology. Following the HTTP
+specifications correctly protects users. It makes the software durable to the
+“real world”. Where feasible, hyper enforces correct usage.
+
+This is more than just "don't write bugs". hyper actively protects the user.
+
+### Examples
+
+- Even though we follow the **HTTP/\*** specs, hyper doesn't blindly implement
+  everything without considering if it is safe to do so.
+
+## 2. Fast
+
+A fast experience delights users. A faster network library means a faster
+application, resulting in delighting our users’ users. Whether with one request,
+or millions.
+
+Being _fast_ means we improve throughput, drive down CPU usage, and improve
+sustainability.
+
+Fast _enough_. We don't sacrifice sanity for speed.
+
+## 3. HTTP/*
+
+hyper is specifically focused on HTTP. Supporting new HTTP versions is in scope,
+but supporting separate protocols is not.
+
+This also defines what the abstraction layer is: the API is designed around
+sending and receiving HTTP messages.
+
+## 4. Flexible
+
+hyper enables as many usecases as possible. It has no opinion on application
+structure, and makes few assumptions about its environment. This includes being
+portable to different operating systems.
+
+### Examples
+
+- While we choose safer defaults to be **Correct**, hyper includes options to
+  _allow_ different behavior, when the user requires them.
+- Providing choice usually makes things more complex, so being **Flexible** does
+  mean it's less _easy_. That can sometimes conflict with simplest way of making
+  hyper **Understandable**.
+
+## 5. Understandable
+
+hyper is [no more complicated than it has to
+be](https://en.wikipedia.org/wiki/Occam%27s_razor). HTTP is not simple. It may
+not be as "easy" as 1-line to do everything, but it shouldn't be "hard" to find
+the answers.
+
+From logical and misuse-resistant APIs, to stellar documentation, to transparent
+metrics.
diff --git a/_contrib/vision-arch.svg b/_contrib/vision-arch.svg
new file mode 100644
index 0000000..c0a8f9b
--- /dev/null
+++ b/_contrib/vision-arch.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Do not edit this file with editors other than diagrams.net -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="401px" height="381px" viewBox="-0.5 -0.5 401 381" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2022-03-14T15:24:10.980Z&quot; agent=&quot;5.0 (Windows)&quot; etag=&quot;5GW9xmoXkXI_t_oHIfuD&quot; version=&quot;16.5.3&quot;&gt;&lt;diagram id=&quot;2mAnZI3o06idv06jzYpb&quot; name=&quot;Page-1&quot;&gt;3Zddb9sgFIZ/jS8n2WA7zuWafmwX+5BSadfEHAdUbCxM4mS/fjjGXyGtWi1ps0mWBS8HDjy8MtjDi3z3oEjJvkkKwkM+3Xn41kMoCBHymsen+1aZ+34rrBWnNmgQlvw3WLEL23AK1SRQSyk0L6diKosCUj3RiFKynoZlUkyzlmQNjrBMiXDVX5xq1qpJ5A/6F+Br1mUOuvXlpAu2QsUIlfVIwnceXigpdVvKdwsQDbyOS9vv/pnWfmIKCv2aDiy+xejx5/dSRWi2Lasn/Fh+sqNsidjYBaeCNwO2U9b7joOSm4JCM5Tv4ZuacQ3LkqRNa2123mhM58LUAlN0p9blAaVhN5LsVB9A5qDV3oT0zrHYrG+Cua3Xwy4EidXYaAdiqxG78et+6IGNKVg8b0CFHVQVKLOgD0eFrw5V6KDyUCxM1hvKt6a4bopsXxp4+LN5SiW17EJMxlHUh9M9NiKauXTxu9KNHLpM6zL4O1IZF2IhhVSHvjjLMpSmRq+0kk8waqHxKo7iy7DF0QnnovdkG7ts0ZnBQvwM2Nl85fvnAdub9GrAzlyw+B8EG/rXBjZxwH798QLY4M1gaQQJDU+BTdAKxxf6FIThKz+z4aXAzk8cYkdYq5rnghRwgEOUttfXM3ktwEfneuIi6f04RnI5Jt2tfAQFdpButLFE4/p781abQvMc/gMP9nf5Cxz1pjpc/Q9tox8ofPcH&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="10" y="90" width="180" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 120px; margin-left: 11px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">client</div></div></div></foreignObject><text x="100" y="124" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">client</text></switch></g><rect x="210" y="90" width="180" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 120px; margin-left: 211px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">server</div></div></div></foreignObject><text x="300" y="124" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">server</text></switch></g><rect x="10" y="170" width="380" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 200px; margin-left: 11px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>hyper::proto</div></div></div></div></foreignObject><text x="200" y="204" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">hyper::proto</text></switch></g><rect x="10" y="250" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 280px; margin-left: 11px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">http1</div></div></div></foreignObject><text x="70" y="284" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">http1</text></switch></g><rect x="140" y="250" width="120" height="60" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 280px; margin-left: 141px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">h2</div></div></div></foreignObject><text x="200" y="284" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">h2</text></switch></g><rect x="270" y="250" width="120" height="60" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 280px; margin-left: 271px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">h3</div></div></div></foreignObject><text x="330" y="284" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">h3</text></switch></g><rect x="10" y="340" width="380" height="40" rx="6" ry="6" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 360px; margin-left: 11px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">IO</div></div></div></foreignObject><text x="200" y="364" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">IO</text></switch></g><path d="M 0 80 L 0 80 L 400 80 L 400 80" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 80 L 0 320 L 400 320 L 400 80" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="10" y="0" width="380" height="60" rx="9" ry="9" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 30px; margin-left: 11px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">executor / runtime</div></div></div></foreignObject><text x="200" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">executor / runtime</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
diff --git a/_contrib/vision.md b/_contrib/vision.md
new file mode 100644
index 0000000..f6b503b
--- /dev/null
+++ b/_contrib/vision.md
@@ -0,0 +1,233 @@
+---
+title: hyper Vision
+layout: guide
+---
+
+## Purpose
+
+This is an overview of what the shape of hyper looks like, but also somewhat
+zoomed out, so that the _vision_ can survive while the exact minute details
+might shift and change over time.
+
+### Charter
+
+> hyper is a protective and efficient HTTP library for all.
+
+### Tenets
+
+Tenets are guiding principles. They guide how decisions are made for the whole
+project. Ideally, we do all of them all the time. In some cases, though, we may
+be forced to decide between slightly penalizing one goal or another. In that
+case, we tend to support those goals that come earlier in the list over those
+that come later (but every case is different).
+
+0. Open
+1. Correct
+2. Fast
+3. HTTP/\*
+4. Flexible
+5. Understandable
+
+There's a lot more detail about each in [tenets](./tenets.md).
+
+## Use Cases
+
+Who are the *users* of hyper? How would they use hyper?
+
+### Low-Level Client Library (curl, reqwest, aws-sdk)
+
+These client libraries care that hyper is **Flexible**, since they are
+expressing their own opinion on how a more-featured HTTP client should act.
+This includes opinions on connection establishment, management, pooling, HTTP
+version options, and even runtimes.
+
+curl's main reason for using hyper is that it is **Safe**.
+
+### Web Server Frameworks (deno, axum)
+
+These are using hyper's server feature to expose a different, higher-level API
+to users. Besides the obvious requirements, these require that hyper is
+**Fast**. Servers are costly, handling more requests faster is important to
+them.
+
+That hyper is **Flexible** is also important, in that it needs to be flexible
+enough for them to build a server framework, and allow them to express their
+own opinions about API to their users.
+
+### Services and Proxies (linkerd, cloudflare, fastly)
+
+These are using hyper directly, likely both the client and server, in order to
+build efficient and powerful services, applications, and tools for their end
+users. They care greatly that hyper is **Correct**, since web traffic can
+stretch the limits of what is valid HTTP, and exercise less-common parts of the
+specifications.
+
+They also require hyper to be **Fast**, for similar reasons that the web server
+frameworks do.
+
+### New Rust Web Developers
+
+These are developers who are either new to Rust, or new to web servers, and
+have reached for hyper to start with.
+
+It's likely that these users don't have strong opinions about how an HTTP
+server or client should work, just that it _should_ handle all the things they
+normally assume it would. For these users, it would be best to quickly help
+them compare their own expectations with hyper's capabilities, and may
+suggest reaching for higher-level, _easier_ libraries instead.
+
+Those that stick around after that recommendation are users that wish both to
+learn at a lower level, and to pick and choose what batteries they plug in to
+hyper as they move along. While they do care about the other tenets, that hyper
+is **Understandable** is of extra importance to them.
+
+## The Library
+
+So with all that context in mind, what does hyper, the library, actually look
+like? This doesn't highlight what _is_ and _isn't_ present. What currently
+needs to change to reach this vision is left to individual version roadmaps.
+
+### Layers
+
+In all cases, a user brings their own runtime and IO to work with hyper. The IO
+is provided to hyper, and hyper acts on top of it. hyper returns `Future`s that
+the user then decides how to poll, likely involving their runtime options.
+
+![architecture diagram](./vision-arch.svg)
+
+
+#### Protocol Codecs
+
+hyper has dedicated codecs for the major HTTP versions. Each is internally
+designed to be **Correct** and **Fast** when it comes to encoding and decoding.
+
+The individual codecs may be implemented as sub-crates, with a less-stable
+promise, to support the **Flexible** needs of some users who wish to build
+their own connection management, or customize encoding and decoding beyond what
+is officially supported.
+
+#### Connection State Management
+
+A **Correct** implementation includes more than just enforcing certain
+characters when encoding and decoding. Order of frames, and flags in certain
+frames can affect the state of the connection. Some examples of things enforced
+at this layer:
+
+- If a message has a `content-length`, enforce only that many bytes are read or
+  written.
+- Reading a `Response` before a `Request` is even written implies a mismatched
+  reply that should be interpreted as an error.
+- The presence of some headers, such as `Connection: close`, or the absence of
+  others, such as `content-length` and `transfer-encoding`, can mean that the
+  connection should terminate after the current message.
+- HTTP/2 and HTTP/3 may send connection-level frames that don't pertain to any
+  specific transaction, and must be read and handled regardless of if a user is
+  currently checking for a message.
+
+#### HTTP Role and Version Abstraction
+
+This is the public API layer. Methods exposed are around sending and receiving
+`http::Request`s and `http::Response`s, not around framing specifics of the
+different versions. These are built around a client or server `Connection`
+interface.
+
+By exposing this layer publicly, we take care of the **Correct** tenet, by not
+forcing the user to send the specific frames themselves. The API should be
+designed in a way that a user cannot easily (if at all) create an _incorrect_
+HTTP connection.
+
+Motivated by the **Flexible** tenet, there _are_ version-specific options that
+can be configured at this level, and version-specific functionality can usually
+be handled via `http::Extensions`.
+
+### Not quite stable, but utile (useful)
+
+Beyond what is directly in the hyper crate, there are useful (utile) parts that
+may not meet hyper's stability promise. Developing, experimenting, and exposing
+those parts is the purpose of the `hyper-util` crate. That crate does not have
+the same stability level as hyper. However, the goal is that things that other
+libraries might want to expose as a public dependency do not live in
+`hyper-util` forever, but rather stabilize and get promoted into `hyper`.
+
+Exactly what gets put into `hyper-util` presently is kept in the roadmap
+documents.
+
+### Stability Promise
+
+What even is hyper's stability promise? Does it mean we are "done"? No. Will we
+ever make breaking changes again? Probably. We'll still follow the [semantic
+versioning](https://semver.org).
+
+Prior to 1.0, hyper has already only done breaking changes once a year. So 1
+year isn't much of a promise. We'll have significant more use and understanding
+after a few years, and that could prompt some redesign.
+
+As of this writing, we'll promise that _major_ versions of hyper are stable for
+3 years. New features will come out in _minor_ versions frequently. If it is
+determined necessary to make breaking changes to the API, we'll save them for
+after the 3 years.
+
+hyper also establishes a Minimum Supported Rust Version (MSRV). hyper will
+support Rust versions at least 6 months old. If a new Rust version is released
+with a feature hyper wishes to use, we won't do so until at least 6 months
+afterwards. hyper will only ever require a new Rust version as a _minor_
+release (1.x), not as a patch (1.x.y).
+
+## Security
+
+The security of hyper is a large part of what makes hyper _protective_. We make
+hyper secure via the combined efforts of being **Correct**, focusing on
+**HTTP/\***, and making it all **Understandable**.
+
+### Memory Safety
+
+Being **Correct** requires that hyper be memory-safe. Using the Rust language
+gets us most of the way there. But there is the ability to write `unsafe`
+Rust. Does being **Correct** mean that we can _never_ write `unsafe` code
+anywhere? Even if it helps make hyper **Fast**? We can, carefully.
+
+How do we balance the two, so that hyper is secure?
+
+hyper prefers not to have large modules of intertwined `unsafe` code. hyper
+does allow small `unsafe` blocks, no more than a few lines, where it's easier
+to verify that the `unsafe` code was written **Correctly**.
+
+### Meticulous Testing
+
+hyper's test suite grows and grows. There's a lot that needs to be right.
+Parsers, encoders, state machines. When easily isolated, those pieces have
+internal unit tests. But hyper also keeps a large list of growing integration
+tests that make sure all the parts are **Correct**.
+
+Making writing new tests easy is a high priority. Investing in the testing
+infrastructure is a proven way to make sure hyper stays **Correct** and secure.
+
+### Constant Fuzzing
+
+One thing is to know specific cases to test for. But we can't know all the
+inputs or states that *might* cause a bug. That's why hyper has rounds of
+fuzzing built into its CI. It's also why hyper signs up for and uses resources
+to provide *constant*, around-the-clock fuzzing, always looking for something
+that hyper should be hardened against.
+
+### Security Process
+
+hyper has an outlined
+[SECURITY](https://github.com/hyperium/hyper/blob/master/SECURITY.md) process,
+so we can safely report and fix issues.
+
+## Non-goals
+
+After writing this up, it is easier to articulate what sorts of things many
+might associate with an HTTP library, but which are explicitly *not* for hyper.
+These are all things that are definitely **out of scope**.
+
+- TLS: We learned early that bundling TLS directly in hyper [has
+  problems](https://github.com/hyperium/hyper/issues/985). People also have
+  very strong opinions about which TLS implementation to use. The design of
+  hyper allows users to bring their own TLS.
+- Routing
+- Cookies
+- Not-HTTP: WebSockets, or other protocols that are built next to HTTP. It
+  should be possible to _use_ hyper to upgrade, but the actual next-protocol
+  should be handled by a different library.
diff --git a/_data/contrib.yml b/_data/contrib.yml
new file mode 100644
index 0000000..f6f93ca
--- /dev/null
+++ b/_data/contrib.yml
@@ -0,0 +1,14 @@
+- title: Contributing 
+  path: ""
+  docs:
+  - code-of-conduct 
+  - commits
+  - contributing
+  - governance
+  - issues
+  - maintainers
+  - msrv
+  - pull-requests
+  - roadmap
+  - tenets
+  - vision
diff --git a/_includes/guide_ul.html b/_includes/guide_ul.html
index e8533af..aafa83d 100644
--- a/_includes/guide_ul.html
+++ b/_includes/guide_ul.html
@@ -14,6 +14,12 @@ <h4 class="guide-topic-title">{{ topic.title }}</h4>
       {% assign p = site.stable | where:"url", guide_url | first %}
       <li {% if guide_url == page.url %}class="active"{% endif %}><a href="{{ p.url }}">{{ p.title }} </a></li>
     {% endfor %}
+  {% elsif page.collection == "contrib" %}
+    {% for doc in topic.docs %}
+      {% assign doc_url = doc | prepend:"/" | prepend:"/contrib" | append:"/" %}
+      {% assign p = site.contrib | where:"url", doc_url | first %}
+      <li {% if doc_url == page.url %}class="active"{% endif %}><a href="{{ p.url }}">{{ p.title }} </a></li>
+    {% endfor %}
   {% endif %}
   </ul>
 </section>
diff --git a/_includes/header.html b/_includes/header.html
index 4980d34..729edc6 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -7,6 +7,7 @@
         </li>
         <li class="nav-item"><a class="nav-link" href="/guides/1">1.0 Guides</a></li>
         <li class="nav-item"><a class="nav-link" href="/guides/0.14">0.14 Guides</a></li>
+        <li class="nav-item"><a class="nav-link" href="/contrib">Contrib</a></li>
         <li class="nav-item"><a class="nav-link" href="https://github.com/hyperium/hyper">Source</a></li>
       </ul>
     </div>
diff --git a/_layouts/guide.html b/_layouts/guide.html
index 4372bcb..fdb5a07 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -28,6 +28,9 @@ <h1>{{ page.title }}</h1>
                 {% assign topic = site.data.stable | where: "path", topic_sub_url | first %}
                 {% include guide_ul.html topic=topic %}
               {% endfor %}
+            {% elsif page.collection == "contrib" %}
+              {% assign topic = site.data.contrib | first %}
+              {% include guide_ul.html topic=topic %}
             {% endif %}
             <h4 class="guide-topic-title">
               {% if page.collection == "legacy" %}

From 94ee454190d0f65313b5ed3d3718c958388d179b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?=
 <29732646+oddgrd@users.noreply.github.com>
Date: Thu, 19 Jan 2023 23:27:46 +0100
Subject: [PATCH 052/138] feat: fix broken links (#81)

A few links were broken by not having their underscores replaced with hyphens, meaning they weren't matching the filenames.
---
 .github/workflows/contrib.yml | 29 ++++++++++++++++++++---------
 _contrib/contributing.md      |  4 ++--
 _contrib/governance.md        |  2 +-
 _contrib/issues.md            |  4 ++--
 _contrib/tenets.md            |  2 +-
 5 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/.github/workflows/contrib.yml b/.github/workflows/contrib.yml
index 73f2620..0274411 100644
--- a/.github/workflows/contrib.yml
+++ b/.github/workflows/contrib.yml
@@ -29,8 +29,8 @@ jobs:
       - name: Copy CONTRIBUTING.md into docs
         run: |
           sed -i -e 's|./docs/||g' hyper/CONTRIBUTING.md
-          cp -a hyper/CONTRIBUTING.md hyper/docs
-      
+          cp -a hyper/CONTRIBUTING.md hyper/docs/CONTRIBUTING.md
+
       # Insert frontmatter borders, replace markdown header with
       # frontmatter title and insert layout: guide
       - name: Convert doc titles to frontmatter 
@@ -49,8 +49,9 @@ jobs:
           sed -i -e '4i permalink: /contrib/' hyper/docs/README.md
           mv hyper/docs/README.md hyper/docs/index.md
 
-      # Lowercase the internal links so they will correctly point to
-      # the lowercased filenames.
+
+      # Lowercase the internal links and replace underscores with
+      # hyphens, so they will point to the correct file.
       - name: Lowercase internal links
         run: |
           for filename in hyper/docs/*.md; do
@@ -58,14 +59,24 @@ jobs:
             filename=${filename::-3};
 
             for file in hyper/docs/*.md; do
+              # filename without parent path
+              filename=${filename##*/}
+
               # don't lowercase MSRV
-              if [[ "${filename##*/}" == 'MSRV' ]]; then
+              if [[ "${filename}" == 'MSRV' ]]; then
                 continue
               fi
 
-              # match instances of only the filename, not including
-              # the parent path, and convert them to lowercase
-              sed -i -e "s|${filename##*/}|\L\0|g" $file;
+              # lowercase filenames
+              sed -i -e "s|${filename}|${filename,,}|g" $file;
+
+              # match on the lowercased filename from here on
+              lowercased=${filename,,}
+
+              hyphenated=${lowercased//_/-}
+
+              # replace underscores in internal links with hyphens
+              sed -i -e "s|${lowercased}|${hyphenated}|g" $file;
             done
           done
 
@@ -75,7 +86,7 @@ jobs:
             mv -vn "$f" "$(echo "$f" | tr '[:upper:]' '[:lower:]' | tr '_' '-')"; 
           done
 
-      - name: Copy docs to contrib
+      - name: Copy the hyper docs to contrib
         run: |  
           mkdir -p _contrib
           cp -a hyper/docs/. _contrib/
diff --git a/_contrib/contributing.md b/_contrib/contributing.md
index 39db483..ca12c4c 100644
--- a/_contrib/contributing.md
+++ b/_contrib/contributing.md
@@ -8,7 +8,7 @@ You want to contribute? You're awesome! Don't know where to start? Check the [li
 [easy tag]: https://github.com/hyperium/hyper/issues?q=label%3AE-easy+is%3Aopen
 
 
-## [Pull Requests](pull_requests.md)
+## [Pull Requests](pull-requests.md)
 
-- [Submitting a Pull Request](pull_requests.md#submitting-a-pull-request)
+- [Submitting a Pull Request](pull-requests.md#submitting-a-pull-request)
 - [Commit Guidelines](commits.md)
diff --git a/_contrib/governance.md b/_contrib/governance.md
index 2a64bec..d8d6044 100644
--- a/_contrib/governance.md
+++ b/_contrib/governance.md
@@ -109,6 +109,6 @@ Maintainers are the project admins. Besides being a collaborator, they take care
 of house-keeping duties, help lead the direction, and have the final authority when
 required.
 
-[coc]: ./code_of_conduct.md
+[coc]: ./code-of-conduct.md
 [contrib]: ../contributing.md
 [triage-guide]: ./issues.md#triaging
diff --git a/_contrib/issues.md b/_contrib/issues.md
index 587acf7..ee499b4 100644
--- a/_contrib/issues.md
+++ b/_contrib/issues.md
@@ -112,6 +112,6 @@ The severity marks how _severe_ the issue is. Note this isn't "importance" or "p
 - **S-refactor**: improve internal code to help readability and maintenance.
 
 [issues]: https://github.com/hyperium/hyper/issues
-[COC]: ./code_of_conduct.md
-[PRs]: ./pull_requests.md
+[COC]: ./code-of-conduct.md
+[PRs]: ./pull-requests.md
 [MRE]: https://en.wikipedia.org/wiki/Minimal_reproducible_example
diff --git a/_contrib/tenets.md b/_contrib/tenets.md
index d5e56c1..0f7d308 100644
--- a/_contrib/tenets.md
+++ b/_contrib/tenets.md
@@ -20,7 +20,7 @@ community building and using it. All contributions are in the open. We don't
 maintain private versions, and don't include features that aren't useful to
 others.
 
-[We prioritize kindness](./code_of_conduct.md), compassion and empathy towards all
+[We prioritize kindness](./code-of-conduct.md), compassion and empathy towards all
 contributors. Technical skill is not a substitute for human decency.
 
 ### Examples

From 008f8d14bc47503471a2fae88e006737045f1587 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?=
 <29732646+oddgrd@users.noreply.github.com>
Date: Tue, 24 Jan 2023 01:25:55 +0100
Subject: [PATCH 053/138] ci: fix broken links to contributing (#82)

---
 .github/workflows/contrib.yml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/.github/workflows/contrib.yml b/.github/workflows/contrib.yml
index 0274411..87f64fa 100644
--- a/.github/workflows/contrib.yml
+++ b/.github/workflows/contrib.yml
@@ -55,6 +55,10 @@ jobs:
       - name: Lowercase internal links
         run: |
           for filename in hyper/docs/*.md; do
+            # since we move some docs from hyper root into the docs folder,
+            # fix links to them
+            sed -i -e 's|\.\./|\./|g' $filename;
+
             # cut `.md` from the filename before search and replace
             filename=${filename::-3};
 

From 2d8cbb73d7044b6678ff7cc09596f47e860baad5 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 26 Jan 2023 19:40:03 -0500
Subject: [PATCH 054/138] doc: update contrib docs (#83)

Co-authored-by: github-actions <github-actions@github.com>
---
 _contrib/governance.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_contrib/governance.md b/_contrib/governance.md
index d8d6044..bbf3c20 100644
--- a/_contrib/governance.md
+++ b/_contrib/governance.md
@@ -110,5 +110,5 @@ of house-keeping duties, help lead the direction, and have the final authority w
 required.
 
 [coc]: ./code-of-conduct.md
-[contrib]: ../contributing.md
+[contrib]: ./contributing.md
 [triage-guide]: ./issues.md#triaging

From a9d754ccfd30441763d7b00b9211ec76d623e891 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?=
 <29732646+oddgrd@users.noreply.github.com>
Date: Fri, 27 Jan 2023 21:18:28 +0100
Subject: [PATCH 055/138] ci: remove CI skip on changes to _contrib (#84)

---
 .github/workflows/CI.yml | 2 --
 1 file changed, 2 deletions(-)

diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index 1c7eed3..17cd33f 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -4,8 +4,6 @@ on:
   push:
     branches:
       - master
-    paths-ignore:
-      - "_contrib/**"
 
 env:
   RUST_BACKTRACE: 1

From 1a085ad415dfe7997536c7c161c70e664086fdc6 Mon Sep 17 00:00:00 2001
From: linpan <yidiyu0507s@163.com>
Date: Mon, 20 Feb 2023 23:52:39 +0800
Subject: [PATCH 056/138] Update footer.html (#86)

docs:update copyright year
---
 _includes/footer.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_includes/footer.html b/_includes/footer.html
index 7ca8887..f28e29d 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -1,7 +1,7 @@
 <footer class="hyper-footer col-md-12">
     <div class="container">
         <div class="row">
-            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2022 hyper</div>
+            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2023 hyper</div>
             <div class="col-sm-6 text-center text-sm-right">
                 <a href="https://github.com/hyperium/hyperium.github.io/blob/master/{{ page.path }}">
                     edit this page on github

From 05f4d54d5eea9ea0b1e1be72a8d078d39b5ec49d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?=
 <29732646+oddgrd@users.noreply.github.com>
Date: Fri, 24 Feb 2023 19:07:50 +0000
Subject: [PATCH 057/138] chore: v1.0.0-rc.3 (#88)

---
 .github/workflows/check_guides.sh | 2 +-
 _config.yml                       | 2 +-
 _stable/client/basic.md           | 2 +-
 _stable/index.md                  | 2 +-
 _stable/server/hello-world.md     | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index 2512554..c2f3b3b 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -19,7 +19,7 @@ EOF
         fi
         if [ $value = stable ]; then
             cat >> "$value/Cargo.toml" <<-EOF
-    hyper = { version = "1.0.0-rc.2", features = ["full"] }
+    hyper = { version = "1.0.0-rc.3", features = ["full"] }
     tokio = { version = "1", features = ["full"] }
     http-body-util = "0.1.0-rc.2" 
 EOF
diff --git a/_config.yml b/_config.yml
index d494421..3c4d173 100644
--- a/_config.yml
+++ b/_config.yml
@@ -53,7 +53,7 @@ relative_links:
 plugins:
   - jekyll-redirect-from
   
-docs_url: https://docs.rs/hyper/1.0.0-rc.2
+docs_url: https://docs.rs/hyper/1.0.0-rc.3
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
 http_body_util_url: https://docs.rs/http-body-util/0.1.0-rc.2
 hyper_tls_url: https://docs.rs/hyper-tls/*
diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index 1b90655..2a38c31 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -11,7 +11,7 @@ Let's tell Cargo about our dependencies by having this in the Cargo.toml.
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.2", features = ["full"] }
+hyper = { version = "1.0.0-rc.3", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
 http-body-util = "0.1.0-rc.2"
 ```
diff --git a/_stable/index.md b/_stable/index.md
index ebed969..60083ed 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -13,7 +13,7 @@ You can start using it by first adding it to your `Cargo.toml`:
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.2", features = ["full"] }
+hyper = { version = "1.0.0-rc.3", features = ["full"] }
 ```
 
 - If building a web server, continue with the [Server guide][].
diff --git a/_stable/server/hello-world.md b/_stable/server/hello-world.md
index 7133431..cc2e8ea 100644
--- a/_stable/server/hello-world.md
+++ b/_stable/server/hello-world.md
@@ -9,7 +9,7 @@ First we need to declare our dependencies, let's add the following to our `Cargo
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.2", features = ["full"] }
+hyper = { version = "1.0.0-rc.3", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
 http-body-util = "0.1.0-rc.2" 
 ```

From da1d0e45d37042f637102fdf5fa5cbae23973737 Mon Sep 17 00:00:00 2001
From: EdorianDark <EdorianDark@users.noreply.github.com>
Date: Mon, 10 Apr 2023 18:33:06 +0200
Subject: [PATCH 058/138] Remove the January 2023 anouncement. (#89)

---
 _layouts/home.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_layouts/home.html b/_layouts/home.html
index 1613cc1..94f0187 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -16,7 +16,7 @@ <h1 class="hyper-logo">hyper</h1>
       <div class="row">
         <div class="col-md-6">
         <p class="lead">
-          <b>Note:</b> hyper is planning a stable <code>1.0</code> release at the end of January 2023.
+          <b>Note:</b> hyper is planning a stable <code>1.0</code> release in 2023.
           These guides will be gradually transitioned to <code>1.0</code>, but if you're looking for
           guides for <code>0.14</code> you can find them <a href="/guides/0.14">here</a>. If you'd like to
           learn more about the move to <code>1.0</code>, 

From 4023bce95979529b202a1dddc88caa7b671dc5e6 Mon Sep 17 00:00:00 2001
From: Isaac Cloos <46393653+IsaacCloos@users.noreply.github.com>
Date: Fri, 28 Apr 2023 10:13:37 -0400
Subject: [PATCH 059/138] chore(site): edit GitHub links from hyper contrib
 documents (#90)

Populate a new page field 'hyper_path' for copied contrib files. Conditionally link back to hyper if a 'hyper_path' is present, otherwise continue to reference hyperium.github.io (relevant for all collections besides contrib).

Closes https://github.com/hyperium/hyper/issues/3210
---
 .github/workflows/contrib.yml | 15 ++++++++++++---
 _includes/footer.html         | 12 +++++++++---
 2 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/contrib.yml b/.github/workflows/contrib.yml
index 87f64fa..335b27d 100644
--- a/.github/workflows/contrib.yml
+++ b/.github/workflows/contrib.yml
@@ -32,16 +32,25 @@ jobs:
           cp -a hyper/CONTRIBUTING.md hyper/docs/CONTRIBUTING.md
 
       # Insert frontmatter borders, replace markdown header with
-      # frontmatter title and insert layout: guide
+      # frontmatter title and insert: 
+      #   - layout: guide
+      #   - hyper_path: {path}
       - name: Convert doc titles to frontmatter 
         run: |
           for f in hyper/docs/*.md; do
             sed -i -e '1i ---' \
             -e '1s/#/title:/' \
             -e '2i layout: guide' \
+            -e "2i hyper_path: ${f:6}" \
             -e '2i ---' $f;
           done
 
+      # CONTRIBUTING.md is uniquely copied into the docs folder.
+      # This adjustment links the correct source file.
+      - name: Retain correct CONTRIBUTING.md path
+        run: |
+          sed -i -e '4s/docs\///' hyper/docs/CONTRIBUTING.md
+
       # Use the hyper docs readme as the index page of contrib,
       # and insert permalink: /contrib/ in the frontmatter
       - name: Convert readme to index
@@ -71,8 +80,8 @@ jobs:
                 continue
               fi
 
-              # lowercase filenames
-              sed -i -e "s|${filename}|${filename,,}|g" $file;
+              # lowercase filenames outside frontmatter
+              sed -i -e "1,/^---$/!s|${filename}|${filename,,}|g" $file;
 
               # match on the lowercased filename from here on
               lowercased=${filename,,}
diff --git a/_includes/footer.html b/_includes/footer.html
index f28e29d..e526023 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -3,9 +3,15 @@
         <div class="row">
             <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2023 hyper</div>
             <div class="col-sm-6 text-center text-sm-right">
-                <a href="https://github.com/hyperium/hyperium.github.io/blob/master/{{ page.path }}">
-                    edit this page on github
-                </a>
+                {% if page.hyper_path %}
+                    <a href="https://github.com/hyperium/hyper/blob/master/{{ page.hyper_path }}">
+                        edit this page on github
+                    </a>
+                {% else %}
+                    <a href="https://github.com/hyperium/hyperium.github.io/blob/master/{{ page.path }}">
+                        edit this page on github
+                    </a>
+                {% endif %}
             </div>
         </div>
     </div>

From 51293f9c7483932a0ff4c9cf29bd215beb4e0644 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Sat, 29 Apr 2023 05:14:19 -0400
Subject: [PATCH 060/138] doc: update contrib docs (#91)

Co-authored-by: github-actions <github-actions@github.com>
---
 _contrib/code-of-conduct.md | 1 +
 _contrib/commits.md         | 1 +
 _contrib/contributing.md    | 1 +
 _contrib/governance.md      | 1 +
 _contrib/index.md           | 1 +
 _contrib/issues.md          | 1 +
 _contrib/maintainers.md     | 1 +
 _contrib/msrv.md            | 1 +
 _contrib/pull-requests.md   | 1 +
 _contrib/roadmap.md         | 1 +
 _contrib/tenets.md          | 1 +
 _contrib/vision.md          | 1 +
 12 files changed, 12 insertions(+)

diff --git a/_contrib/code-of-conduct.md b/_contrib/code-of-conduct.md
index 09955a1..4126d90 100644
--- a/_contrib/code-of-conduct.md
+++ b/_contrib/code-of-conduct.md
@@ -1,6 +1,7 @@
 ---
 title: Code of Conduct
 layout: guide
+hyper_path: docs/CODE_OF_CONDUCT.md
 ---
 
 ## Be Kind
diff --git a/_contrib/commits.md b/_contrib/commits.md
index 67aabe3..0b1f4e9 100644
--- a/_contrib/commits.md
+++ b/_contrib/commits.md
@@ -1,6 +1,7 @@
 ---
 title: Git Commit Guidelines
 layout: guide
+hyper_path: docs/COMMITS.md
 ---
 
 We have very precise rules over how our git commit messages can be formatted.  This leads to **more
diff --git a/_contrib/contributing.md b/_contrib/contributing.md
index ca12c4c..15f49db 100644
--- a/_contrib/contributing.md
+++ b/_contrib/contributing.md
@@ -1,6 +1,7 @@
 ---
 title: Contributing to Hyper
 layout: guide
+hyper_path: CONTRIBUTING.md
 ---
 
 You want to contribute? You're awesome! Don't know where to start? Check the [list of easy issues](https://github.com/hyperium/hyper/issues?q=is%3Aopen+is%3Aissue+label%3AE-easy).
diff --git a/_contrib/governance.md b/_contrib/governance.md
index bbf3c20..8e51d79 100644
--- a/_contrib/governance.md
+++ b/_contrib/governance.md
@@ -1,6 +1,7 @@
 ---
 title: Governance
 layout: guide
+hyper_path: docs/GOVERNANCE.md
 ---
 
 ## Making decisions
diff --git a/_contrib/index.md b/_contrib/index.md
index c94aaee..3781d95 100644
--- a/_contrib/index.md
+++ b/_contrib/index.md
@@ -2,6 +2,7 @@
 title: Developing hyper
 layout: guide
 permalink: /contrib/
+hyper_path: docs/README.md
 ---
 
 This is a set of documents outline how hyper is developed, how to contribute or get involved, various processes we use, and internal design explanations.
diff --git a/_contrib/issues.md b/_contrib/issues.md
index ee499b4..b899f79 100644
--- a/_contrib/issues.md
+++ b/_contrib/issues.md
@@ -1,6 +1,7 @@
 ---
 title: Issues
 layout: guide
+hyper_path: docs/ISSUES.md
 ---
 
 The [issue tracker][issues] for hyper is where we track all features, bugs, and discuss proposals.
diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
index bb576f9..4ffeaa8 100644
--- a/_contrib/maintainers.md
+++ b/_contrib/maintainers.md
@@ -1,6 +1,7 @@
 ---
 title: The People
 layout: guide
+hyper_path: docs/MAINTAINERS.md
 ---
 
 To see what these roles do, and how to become one, look at [governance](./governance.md).
diff --git a/_contrib/msrv.md b/_contrib/msrv.md
index a1ab95b..f958193 100644
--- a/_contrib/msrv.md
+++ b/_contrib/msrv.md
@@ -1,6 +1,7 @@
 ---
 title: Minimum Support Rust Version (MSRV)
 layout: guide
+hyper_path: docs/MSRV.md
 ---
 
 hyper's current policy is to always support a Rust version at least 6 months
diff --git a/_contrib/pull-requests.md b/_contrib/pull-requests.md
index 3b3a0f7..d7567aa 100644
--- a/_contrib/pull-requests.md
+++ b/_contrib/pull-requests.md
@@ -1,6 +1,7 @@
 ---
 title: Pull Requests
 layout: guide
+hyper_path: docs/PULL_REQUESTS.md
 ---
 
 Pull requests are the way to submit changes to the hyper repository.
diff --git a/_contrib/roadmap.md b/_contrib/roadmap.md
index 061a6df..b23a6ec 100644
--- a/_contrib/roadmap.md
+++ b/_contrib/roadmap.md
@@ -1,6 +1,7 @@
 ---
 title: hyper 1.0 Roadmap
 layout: guide
+hyper_path: docs/ROADMAP.md
 ---
 
 ## Goal
diff --git a/_contrib/tenets.md b/_contrib/tenets.md
index 0f7d308..c037bf3 100644
--- a/_contrib/tenets.md
+++ b/_contrib/tenets.md
@@ -1,6 +1,7 @@
 ---
 title: Charter
 layout: guide
+hyper_path: docs/TENETS.md
 ---
 
 > hyper is a protective and efficient HTTP library for all.
diff --git a/_contrib/vision.md b/_contrib/vision.md
index f6b503b..2810e95 100644
--- a/_contrib/vision.md
+++ b/_contrib/vision.md
@@ -1,6 +1,7 @@
 ---
 title: hyper Vision
 layout: guide
+hyper_path: docs/VISION.md
 ---
 
 ## Purpose

From cc41da8964f16e7f0aab772ab30137b7c4154584 Mon Sep 17 00:00:00 2001
From: Isaac Cloos <cloosisaac@gmail.com>
Date: Fri, 28 Apr 2023 20:41:08 -0400
Subject: [PATCH 061/138] style(site): don't round banner borders (#3216)

Removing the jumbotron class solved this minor task nicely. I have discovered no regressions from this change on my: phone, ipad, laptop, or a 27" monitor. More testing to follow once the whole issue is ready for final review.
---
 _layouts/home.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_layouts/home.html b/_layouts/home.html
index 94f0187..7cf716b 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -5,7 +5,7 @@
   </head>
   <body id="hyper" class="hyper-home">
     {% include header.html %}
-    <section class="jumbotron hyper-pageheader">
+    <section class="hyper-pageheader">
       <div class="container">
         <h1 class="hyper-logo">hyper</h1>
         <p>Fast and safe HTTP for the Rust language.</p>

From a7105dfcda6d7797f8b98c7f6c8c761593c5c376 Mon Sep 17 00:00:00 2001
From: Isaac Cloos <cloosisaac@gmail.com>
Date: Sat, 29 Apr 2023 15:22:07 -0400
Subject: [PATCH 062/138] fix(site): absolute path to favicon (#3216)

I snuck this change in after initial approval. I hope it's small enough to not be considered scope creep.
---
 _includes/head.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/_includes/head.html b/_includes/head.html
index 6a88bf1..170030c 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -11,8 +11,8 @@
 <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
 <![endif]-->
 
-<link rel="shortcut icon" href="./icons/favicon.ico" type="image/x-icon">
-<link rel="icon" href="./icons/favicon.ico" type="image/x-icon">
+<link rel="shortcut icon" href="/icons/favicon.ico" type="image/x-icon">
+<link rel="icon" href="/icons/favicon.ico" type="image/x-icon">
  
 <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
 

From 71e8b4e8de2dd2fb99a51fa8bc684aef7c00704f Mon Sep 17 00:00:00 2001
From: Isaac Cloos <cloosisaac@gmail.com>
Date: Sun, 30 Apr 2023 11:00:56 -0400
Subject: [PATCH 063/138] chore(site): migrate to bootstrap 5 (#3216)

Browser support will change: https://getbootstrap.com/docs/5.0/migration/#browser-support.

The style normalizing code is clumped together at the bottom of main.scss. This is to help future contributors adopted bootstrap 5 styles easily as the maintainers approve the differences.
---
 _includes/footer.html |  4 +-
 _includes/head.html   |  2 +-
 _includes/header.html |  2 +-
 _layouts/default.html |  2 +-
 _layouts/guide.html   |  4 +-
 _layouts/home.html    |  2 +-
 css/main.scss         | 93 +++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 101 insertions(+), 8 deletions(-)

diff --git a/_includes/footer.html b/_includes/footer.html
index e526023..9a881c5 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -1,8 +1,8 @@
 <footer class="hyper-footer col-md-12">
     <div class="container">
         <div class="row">
-            <div class="col-sm-6 text-center text-sm-left text-muted">&copy; 2023 hyper</div>
-            <div class="col-sm-6 text-center text-sm-right">
+            <div class="col-sm-6 text-center text-sm-start text-muted">&copy; 2023 hyper</div>
+            <div class="col-sm-6 text-center text-sm-end">
                 {% if page.hyper_path %}
                     <a href="https://github.com/hyperium/hyper/blob/master/{{ page.hyper_path }}">
                         edit this page on github
diff --git a/_includes/head.html b/_includes/head.html
index 170030c..8ddea60 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -3,7 +3,7 @@
 <title>{% if page.title %}{{ page.title }} | hyper{% else %}{{ site.title }}{% endif %}</title>
 <meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
 
-<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
+<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha256-wLz3iY/cO4e6vKZ4zRmo4+9XDpMcgKOvv/zEU3OMlRo=" crossorigin="anonymous">
 <link rel="stylesheet" href="{{ "/css/main.css" | absolute_url }}">
 
 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
diff --git a/_includes/header.html b/_includes/header.html
index 729edc6..326ba32 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -1,4 +1,4 @@
-<header class="navbar navbar-toggleable-md navbar-hyper" role="navigation">
+<header class="navbar navbar-expand-lg navbar-hyper" role="navigation">
   <nav class="container">
     <div class="collapse navbar-collapse">
       <ul class="nav navbar-nav">
diff --git a/_layouts/default.html b/_layouts/default.html
index 4c9a4d2..9a2bca9 100644
--- a/_layouts/default.html
+++ b/_layouts/default.html
@@ -5,7 +5,7 @@
   </head>
   <body id="hyper">
     {% include header.html %}
-    <div class="jumbotron">
+    <div>
       <div class="container">
         {{ content }}
       </div>
diff --git a/_layouts/guide.html b/_layouts/guide.html
index fdb5a07..0d93ce2 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -12,7 +12,7 @@ <h1>{{ page.title }}</h1>
     </div>
     <div class="container">
       <div class="row">
-        <aside class="col-md-3 hyper-sidebar">
+        <aside class="col-lg-3 hyper-sidebar">
           <nav>
             {% if page.collection == "legacy" %}
               {% assign topics = site.data.legacy | first %}
@@ -41,7 +41,7 @@ <h4 class="guide-topic-title">
             </h4>
           </nav>
         </aside>
-        <article class="col-md-9 hyper-content">
+        <article class="col-lg-9 hyper-content">
           {{ content }}
           {% include guide_footer.html %}
         </article>
diff --git a/_layouts/home.html b/_layouts/home.html
index 7cf716b..a9451fa 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -7,7 +7,7 @@
     {% include header.html %}
     <section class="hyper-pageheader">
       <div class="container">
-        <h1 class="hyper-logo">hyper</h1>
+        <h1>hyper</h1>
         <p>Fast and safe HTTP for the Rust language.</p>
         <p><a href="/guides/1" class="btn hyper-getstarted">Get Started</a></p>
       </div>
diff --git a/css/main.scss b/css/main.scss
index ddb0f48..7f95156 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -274,3 +274,96 @@ pre code {
     background: none;
     color: $secondary-color;
 }
+
+// Below are shims for a bootstrap 4 to 5 migration.
+// https://getbootstrap.com/docs/5.2/migration/
+//
+// Dropping these styles can incrementally shift the sites UI to a bootstrap 5 aesthetic.
+
+// container
+.container {
+    padding-left: 15px;
+    padding-right: 15px;
+}
+
+@media (min-width: 1400px) {
+    .container {
+        max-width: 1140px;
+    }
+}
+
+// btn
+.btn {
+    border-radius: 0.25rem;
+    line-height: 1.25;
+}
+
+// headers
+h1 {
+    font-size: 2.5rem;
+    line-height: 1.1;
+}
+
+h2, h3, h4, h5, h6 {
+    font-size: 2rem;
+    line-height: 1.1;
+}
+
+article h3 {
+    font-size: 1.75rem;
+    line-height: 1.1;
+}
+
+// a
+a {
+    text-decoration: none;
+}
+
+a.btn:hover {
+    text-decoration: none;
+}
+
+a:hover, a:focus {
+    text-decoration: underline;
+}
+
+// code 
+code {
+    font-size: 90%;
+    border-radius: 0.25rem;
+}
+
+// ul
+ul {
+    padding-inline-start: 40px;
+}
+
+// row
+.row {
+    --bs-gutter-x: 30px;
+}
+
+// code
+pre code {
+    font-size: 12.96px;
+    border-radius: 0;
+}
+
+// navbar
+.navbar a {
+    color: $primary-color;
+    transition: none;
+}
+
+.navbar a:hover, .navbar a:focus {
+    color: $primary-highlight-color;
+    text-decoration: none;
+}
+
+.navbar .navbar-brand {
+    color: $primary-color
+}
+
+.navbar .navbar-brand:hover {
+    color: $primary-highlight-color
+}
\ No newline at end of file

From 783651ba3accb13ad2637c17994978183d8f1621 Mon Sep 17 00:00:00 2001
From: Isaac Cloos <cloosisaac@gmail.com>
Date: Mon, 1 May 2023 10:55:39 -0400
Subject: [PATCH 064/138] fix(site): missed style definition ol (#3216)

---
 css/main.scss | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/css/main.scss b/css/main.scss
index 7f95156..8c5ce44 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -333,8 +333,8 @@ code {
     border-radius: 0.25rem;
 }
 
-// ul
-ul {
+// ul, ol
+ul, ol {
     padding-inline-start: 40px;
 }
 

From af6841774e44f500e08c59a80a3c4a996a38ee45 Mon Sep 17 00:00:00 2001
From: Isaac Cloos <cloosisaac@gmail.com>
Date: Mon, 1 May 2023 11:57:52 -0400
Subject: [PATCH 065/138] fix(site): make navbar visible on mobile (#3216)

Installation guides:

bootstrap: https://getbootstrap.com/docs/5.2/getting-started/introduction/

component: https://getbootstrap.com/docs/5.2/components/navbar/

Updating bootstrap and adding the js dependency has greatly increased the site size. Cold visit went from ~20kb to ~70kb. Something to bear in mind with these additions.
---
 _includes/footer.html |  3 +++
 _includes/header.html | 11 ++++++-----
 css/main.scss         |  6 ++++++
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/_includes/footer.html b/_includes/footer.html
index 9a881c5..2489506 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -17,3 +17,6 @@
     </div>
 </footer>
 <script src="{{ "/js/rustdoc.js" | absolute_url }}"></script>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"
+    integrity="sha384-cuYeSxntonz0PPNlHhBs68uyIAVpIIOZZ5JqeqvYYIcEL727kskC66kF92t6Xl2V"
+    crossorigin="anonymous"></script>
diff --git a/_includes/header.html b/_includes/header.html
index 326ba32..6beabfa 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -1,10 +1,11 @@
 <header class="navbar navbar-expand-lg navbar-hyper" role="navigation">
   <nav class="container">
-    <div class="collapse navbar-collapse">
-      <ul class="nav navbar-nav">
-        <li class="nav-item">
-          <a class="navbar-brand" href="/">hyper.rs</a>
-        </li>
+    <a class="navbar-brand" href="/">hyper.rs</a>
+    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#hyperNavbar">
+      <span class="navbar-toggler-icon"></span>
+    </button>
+    <div class="collapse navbar-collapse" id="hyperNavbar">
+      <ul class="navbar-nav">
         <li class="nav-item"><a class="nav-link" href="/guides/1">1.0 Guides</a></li>
         <li class="nav-item"><a class="nav-link" href="/guides/0.14">0.14 Guides</a></li>
         <li class="nav-item"><a class="nav-link" href="/contrib">Contrib</a></li>
diff --git a/css/main.scss b/css/main.scss
index 8c5ce44..8eb52e5 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -77,6 +77,12 @@ pre code {
     text-transform: lowercase;
 }
 
+@media (min-width: 992px) {
+    #hyper .nav-link {
+        line-height: 3rem;
+    }
+}
+
 #hyper .navbar a:hover, #hyper .navbar a:focus {
     background: none;
     border-color: $primary-highlight-color;

From c535febb7dafffed6c69390b843cd2e7274a117f Mon Sep 17 00:00:00 2001
From: Isaac Cloos <cloosisaac@gmail.com>
Date: Mon, 1 May 2023 19:40:21 -0400
Subject: [PATCH 066/138] style(site): set darker category header (#3216)

Previously, when hovering over the guide, the headers would 'blink'. By fixing the color, the guide headers will hopefully appear as static text rather than links.
---
 css/main.scss | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/css/main.scss b/css/main.scss
index 8eb52e5..7607da2 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -142,14 +142,10 @@ pre code {
 }
 
 .hyper-sidebar .guide-topic-title {
-    color: #999;
+    color: #6b7280;
     font-size: 1.1rem;
 }
 
-.hyper-sidebar .guide-topic:hover .guide-topic-title {
-    color: #333;
-}
-
 .hyper-sidebar .nav {
     display: block;
     margin-bottom: 2rem;

From c94a621c2b95a4a824194e20da031d8cf7f1ce05 Mon Sep 17 00:00:00 2001
From: Isaac Cloos <cloosisaac@gmail.com>
Date: Fri, 12 May 2023 21:49:03 -0400
Subject: [PATCH 067/138] docs(site): add examples/README links (#3099)

Tested on desktop and mobile.
---
 _layouts/guide.html |  4 +++-
 css/main.scss       | 10 ++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/_layouts/guide.html b/_layouts/guide.html
index 0d93ce2..dbd7eef 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -32,10 +32,12 @@ <h1>{{ page.title }}</h1>
               {% assign topic = site.data.contrib | first %}
               {% include guide_ul.html topic=topic %}
             {% endif %}
-            <h4 class="guide-topic-title">
+            <h4 class="guide-links">
               {% if page.collection == "legacy" %}
+                <a href="{{ site.legacy_examples_url }}/README.md">Additional Examples</a>
                 <a href="{{ site.legacy_docs_url }}">API Reference</a>
               {% elsif page.collection == "stable" %}
+                <a href="{{ site.examples_url }}/README.md">Additional Examples</a>
                 <a href="{{ site.docs_url }}">API Reference</a>
               {% endif %}
             </h4>
diff --git a/css/main.scss b/css/main.scss
index 7607da2..1ada155 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -146,6 +146,16 @@ pre code {
     font-size: 1.1rem;
 }
 
+.hyper-sidebar .guide-links {
+    display: flex;
+    flex-direction: column;
+    font-size: 1.1rem;
+}
+
+.hyper-sidebar .guide-links a:not(:last-child) {
+    margin-bottom: 1rem;
+}
+
 .hyper-sidebar .nav {
     display: block;
     margin-bottom: 2rem;

From 1e83f0638ff5cbfaeb8a70d8ee2b219fad7ee9b8 Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Wed, 24 May 2023 03:25:12 +0000
Subject: [PATCH 068/138] doc: update contrib docs

---
 _contrib/maintainers.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
index 4ffeaa8..48754ff 100644
--- a/_contrib/maintainers.md
+++ b/_contrib/maintainers.md
@@ -10,6 +10,7 @@ To see what these roles do, and how to become one, look at [governance](./govern
 
 - Eray Karatay (@programatik29)
 - Oddbjørn Grødem (@oddgrd)
+- Noah Kennedy (@Noah-Kennedy)
 
 ## Collaborators
 

From 30d7bcce71389ed9828370597425e11c396ab65e Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Sat, 17 Jun 2023 03:24:28 +0000
Subject: [PATCH 069/138] doc: update contrib docs

---
 _contrib/contributing.md | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/_contrib/contributing.md b/_contrib/contributing.md
index 15f49db..f34cd14 100644
--- a/_contrib/contributing.md
+++ b/_contrib/contributing.md
@@ -13,3 +13,13 @@ You want to contribute? You're awesome! Don't know where to start? Check the [li
 
 - [Submitting a Pull Request](pull-requests.md#submitting-a-pull-request)
 - [Commit Guidelines](commits.md)
+
+## Cargo fmt
+`cargo fmt --all` does not work in hyper. Please use the following commands:
+```txt
+# Mac or Linux
+rustfmt --check --edition 2018 $(git ls-files '*.rs')
+
+# Powershell
+Get-ChildItem . -Filter "*.rs" -Recurse | foreach { rustfmt --check --edition 2018 $_.FullName }
+```
\ No newline at end of file

From 7a09dbc1b92207964d10172e5127db59a6576593 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 27 Jul 2023 18:33:14 -0400
Subject: [PATCH 070/138] add verification for fosstodon account

---
 _includes/head.html | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/_includes/head.html b/_includes/head.html
index 8ddea60..a8cd0ee 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -16,6 +16,8 @@
  
 <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
 
+<link rel="me" href="https://fosstodon.org/@hyper_rs">
+
 <!-- twitter card -->
 <meta name="twitter:card" content="summary" />
 <meta name="twitter:site" content="@hyperium_rs" />

From 68052213c9346e9f9d045cfe539cd19c4ec62eea Mon Sep 17 00:00:00 2001
From: oddgrd <29732646+oddgrd@users.noreply.github.com>
Date: Sat, 29 Jul 2023 16:41:54 +0200
Subject: [PATCH 071/138] chore: update hyper crates, use hyper io traits

---
 .github/workflows/check_guides.sh |  5 +++--
 _config.yml                       |  4 ++--
 _stable/client/basic.md           | 25 ++++++++++++++++++++-----
 _stable/index.md                  |  2 +-
 _stable/server/hello-world.md     | 15 ++++++++++++---
 5 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index c2f3b3b..a57dd46 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -19,9 +19,10 @@ EOF
         fi
         if [ $value = stable ]; then
             cat >> "$value/Cargo.toml" <<-EOF
-    hyper = { version = "1.0.0-rc.3", features = ["full"] }
+    hyper = { version = "1.0.0-rc.4", features = ["full"] }
     tokio = { version = "1", features = ["full"] }
-    http-body-util = "0.1.0-rc.2" 
+    http-body-util = "0.1.0-rc.3" 
+    hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
 EOF
             cargo build --manifest-path "$value/Cargo.toml"
         fi
diff --git a/_config.yml b/_config.yml
index 3c4d173..cb8749f 100644
--- a/_config.yml
+++ b/_config.yml
@@ -53,9 +53,9 @@ relative_links:
 plugins:
   - jekyll-redirect-from
   
-docs_url: https://docs.rs/hyper/1.0.0-rc.3
+docs_url: https://docs.rs/hyper/1.0.0-rc.4
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
-http_body_util_url: https://docs.rs/http-body-util/0.1.0-rc.2
+http_body_util_url: https://docs.rs/http-body-util/0.1.0-rc.3
 hyper_tls_url: https://docs.rs/hyper-tls/*
 
 futures_url: https://docs.rs/futures/0.3.*
diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index 2a38c31..d085b62 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -11,9 +11,10 @@ Let's tell Cargo about our dependencies by having this in the Cargo.toml.
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.3", features = ["full"] }
+hyper = { version = "1.0.0-rc.4", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
-http-body-util = "0.1.0-rc.2"
+http-body-util = "0.1.0-rc.3"
+hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
 ```
 
 Now, we need to import pieces to use from our dependencies:
@@ -22,9 +23,11 @@ Now, we need to import pieces to use from our dependencies:
 # extern crate http_body_util;
 # extern crate hyper;
 # extern crate tokio;
+# extern crate hyper_util;
 use http_body_util::Empty;
 use hyper::Request;
 use hyper::body::Bytes;
+use hyper_util::rt::TokioIo;
 use tokio::net::TcpStream;
 # fn main() {}
 ```
@@ -74,10 +77,12 @@ setup we'll spawn a `tokio::task` and `await` it.
 ```rust
 # extern crate http_body_util;
 # extern crate hyper;
+# extern crate hyper_util;
 # extern crate tokio;
 # use http_body_util::Empty;
 # use hyper::body::Bytes;
 # use hyper::Request;
+# use hyper_util::rt::TokioIo;
 # use tokio::net::TcpStream;
 # async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
 // Parse our URL...
@@ -92,8 +97,12 @@ let address = format!("{}:{}", host, port);
 // Open a TCP connection to the remote host
 let stream = TcpStream::connect(address).await?;
 
+// Use an adapter to access something implementing `tokio::io` traits as if they implement
+// `hyper::rt` IO traits.
+let io = TokioIo::new(stream);
+
 // Perform a TCP handshake
-let (mut sender, conn) = hyper::client::conn::http1::handshake(stream).await?;
+let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await?;
 
 // Spawn a task to poll the connection, driving the HTTP state
 tokio::task::spawn(async move {
@@ -126,10 +135,12 @@ status of the response to see that it returned the expected `200 OK` status.
 ```rust
 # extern crate http_body_util;
 # extern crate hyper;
+# extern crate hyper_util;
 # extern crate tokio;
 # use http_body_util::Empty;
 # use hyper::body::Bytes;
 # use hyper::Request;
+# use hyper_util::rt::TokioIo;
 # use tokio::net::TcpStream;
 # async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
 # let url = "http://httpbin.org/ip".parse::<hyper::Uri>()?;
@@ -137,7 +148,8 @@ status of the response to see that it returned the expected `200 OK` status.
 # let port = url.port_u16().unwrap_or(80);
 # let addr = format!("{}:{}", host, port);
 # let stream = TcpStream::connect(addr).await?;
-# let (mut sender, conn) = hyper::client::conn::http1::handshake(stream).await?;
+# let io = TokioIo::new(stream);
+# let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await?;
 # tokio::task::spawn(async move {
 # if let Err(err) = conn.await {
 # println!("Connection failed: {:?}", err);
@@ -182,10 +194,12 @@ use tokio::io::{stdout, AsyncWriteExt as _};
 ```rust
 # extern crate http_body_util;
 # extern crate hyper;
+# extern crate hyper_util;
 # extern crate tokio;
 # use http_body_util::{BodyExt, Empty};
 # use hyper::body::Bytes;
 # use hyper::Request;
+# use hyper_util::rt::TokioIo;
 # use tokio::net::TcpStream;
 # use tokio::io::{self, AsyncWriteExt as _};
 # async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
@@ -194,7 +208,8 @@ use tokio::io::{stdout, AsyncWriteExt as _};
 # let port = url.port_u16().unwrap_or(80);
 # let addr = format!("{}:{}", host, port);
 # let stream = TcpStream::connect(addr).await?;
-# let (mut sender, conn) = hyper::client::conn::http1::handshake(stream).await?;
+# let io = TokioIo::new(stream);
+# let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await?;
 # tokio::task::spawn(async move {
 #     if let Err(err) = conn.await {
 #         println!("Connection failed: {:?}", err);
diff --git a/_stable/index.md b/_stable/index.md
index 60083ed..76a9d90 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -13,7 +13,7 @@ You can start using it by first adding it to your `Cargo.toml`:
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.3", features = ["full"] }
+hyper = { version = "1.0.0-rc.4", features = ["full"] }
 ```
 
 - If building a web server, continue with the [Server guide][].
diff --git a/_stable/server/hello-world.md b/_stable/server/hello-world.md
index cc2e8ea..cf222e6 100644
--- a/_stable/server/hello-world.md
+++ b/_stable/server/hello-world.md
@@ -9,9 +9,10 @@ First we need to declare our dependencies, let's add the following to our `Cargo
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.3", features = ["full"] }
+hyper = { version = "1.0.0-rc.4", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
-http-body-util = "0.1.0-rc.2" 
+http-body-util = "0.1.0-rc.3"
+hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
 ```
 
 Next, we need to add some imports in our `main.rs` file:
@@ -20,6 +21,7 @@ Next, we need to add some imports in our `main.rs` file:
 # extern crate tokio;
 # extern crate hyper;
 # extern crate http_body_util;
+# extern crate hyper_util;
 use std::convert::Infallible;
 use std::net::SocketAddr;
 
@@ -28,6 +30,7 @@ use hyper::body::Bytes;
 use hyper::server::conn::http1;
 use hyper::service::service_fn;
 use hyper::{Request, Response};
+use hyper_util::rt::TokioIo;
 use tokio::net::TcpListener;
 # fn main() {}
 ```
@@ -72,6 +75,7 @@ We'll dive in to the specifics of some of these things in another guide.
 # extern crate tokio;
 # extern crate hyper;
 # extern crate http_body_util;
+# extern crate hyper_util;
 # mod no_run {
 # use std::convert::Infallible;
 # use std::net::SocketAddr;
@@ -81,6 +85,7 @@ We'll dive in to the specifics of some of these things in another guide.
 # use hyper::server::conn::http1;
 # use hyper::service::service_fn;
 # use hyper::{Request, Response};
+# use hyper_util::rt::TokioIo;
 # use tokio::net::TcpListener;
 # async fn hello(
 #     _: Request<hyper::body::Incoming>,
@@ -98,12 +103,16 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
     loop {
         let (stream, _) = listener.accept().await?;
 
+        // Use an adapter to access something implementing `tokio::io` traits as if they implement
+        // `hyper::rt` IO traits.
+        let io = TokioIo::new(stream);
+
         // Spawn a tokio task to serve multiple connections concurrently
         tokio::task::spawn(async move {
             // Finally, we bind the incoming connection to our `hello` service
             if let Err(err) = http1::Builder::new()
                 // `service_fn` converts our function in a `Service`
-                .serve_connection(stream, service_fn(hello))
+                .serve_connection(io, service_fn(hello))
                 .await
             {
                 println!("Error serving connection: {:?}", err);

From 3b4b3d136f01d00f53b03a47a84f3eab3ce16035 Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Tue, 22 Aug 2023 03:22:33 +0000
Subject: [PATCH 072/138] doc: update contrib docs

---
 _contrib/msrv.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_contrib/msrv.md b/_contrib/msrv.md
index f958193..856de49 100644
--- a/_contrib/msrv.md
+++ b/_contrib/msrv.md
@@ -10,4 +10,4 @@ hyper. It is possible that an older compiler can work, but that is not
 guaranteed. We try to increase the MSRV responsibly, only when a significant
 new feature is needed.
 
-The current MSRV is: **1.56**.
+The current MSRV is: **1.63**.

From 13b9b6611cf311f7e00b5fe687503f2ff4eb72f7 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 24 Aug 2023 16:45:34 -0400
Subject: [PATCH 073/138] homepage: update banner with charter, add tenets as
 blocks

---
 _includes/head.html |  2 +-
 _layouts/home.html  | 59 ++++++++++++++++++++++++++++++---------------
 css/main.scss       |  4 +--
 index.md            | 39 ------------------------------
 4 files changed, 42 insertions(+), 62 deletions(-)

diff --git a/_includes/head.html b/_includes/head.html
index a8cd0ee..6c54827 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -3,7 +3,7 @@
 <title>{% if page.title %}{{ page.title }} | hyper{% else %}{{ site.title }}{% endif %}</title>
 <meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
 
-<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha256-wLz3iY/cO4e6vKZ4zRmo4+9XDpMcgKOvv/zEU3OMlRo=" crossorigin="anonymous">
+<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous">
 <link rel="stylesheet" href="{{ "/css/main.css" | absolute_url }}">
 
 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
diff --git a/_layouts/home.html b/_layouts/home.html
index a9451fa..b479b93 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -8,34 +8,53 @@
     <section class="hyper-pageheader">
       <div class="container">
         <h1>hyper</h1>
-        <p>Fast and safe HTTP for the Rust language.</p>
+        <p>A protective and efficient HTTP library for all.</p>
         <p><a href="/guides/1" class="btn hyper-getstarted">Get Started</a></p>
       </div>
     </section>
     <section class="container">
       <div class="row">
         <div class="col-md-6">
-        <p class="lead">
-          <b>Note:</b> hyper is planning a stable <code>1.0</code> release in 2023.
-          These guides will be gradually transitioned to <code>1.0</code>, but if you're looking for
-          guides for <code>0.14</code> you can find them <a href="/guides/0.14">here</a>. If you'd like to
-          learn more about the move to <code>1.0</code>, 
-          <a href="https://seanmonstar.com/post/680802159018803200/hyper-10-roadmap">this</a> is a good place to start.
-        </p>
-        <p class="lead">hyper is a fast HTTP implementation written in and for Rust.</p>
-        <ul>
-            <li>A <strong>Client</strong> for talking to web services.</li>
-            <li>A <strong>Server</strong> for building those web services.</li>
-            <li>Blazing <strong>fast</strong><a href="https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=plaintext">*</a> thanks to Rust.</li>
-            <li>High <strong>concurrency</strong> with non-blocking sockets.</li>
-            <li>HTTP/1 and <strong>HTTP/2</strong> support.</li>
-        </ul>
+          <h3>The HTTP implementation for Rust</h3>
+          <ul>
+              <li>A <strong>Client</strong> for talking to web services.</li>
+              <li>A <strong>Server</strong> for building those web services.</li>
+              <li>Blazing <strong>fast</strong><a href="https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=plaintext">*</a> thanks to Rust.</li>
+              <li>High <strong>concurrency</strong> with non-blocking sockets.</li>
+              <li>HTTP/1 and <strong>HTTP/2</strong> support.</li>
+          </ul>
+        </div>
+        <div class="col-md-6">
+          <h3>Latest: 1.0 coming soon</h3>
+          <p><strong>Note:</strong> hyper is planning a stable <code>1.0</code> release in 2023. These guides will be gradually transitioned to <code>1.0</code>, but if you're looking for guides for <code>0.14</code> you can find them <a href="/guides/0.14">here</a>. If you'd like to learn more about the move to <code>1.0</code>, <a href="https://seanmonstar.com/post/680802159018803200/hyper-10-roadmap">this</a> is a good place to start.</p>
+        </div>
       </div>
-      <div class="col-md-6">
-        {{ content }}
+      <div class="row">
+        <div class="col-md-6 col-lg-4">
+          <h3>Open</h3>
+          <p>hyper is open source, always. The success of hyper depends on the health of the community building and using it. All contributions are in the open.</p>
+        </div>
+        <div class="col-md-6 col-lg-4">
+          <h3>Correct</h3>
+          <p>hyper is a memory safe and robust implementation of the HTTP specification. Memory safety is vital in a core Internet technology. Following the HTTP specifications correctly protects users. It makes the software durable to the “real world”. Where feasible, hyper enforces correct usage.</p>
+        </div>
+        <div class="col-md-6 col-lg-4">
+          <h3>Fast</h3>
+          <p>A fast experience delights users. A faster network library means a faster application, resulting in delighting our users’ users. Whether with one request, or millions.</p>
+        </div>
+        <div class="col-md-6 col-lg-4">
+          <h3>HTTP/*</h3>
+          <p>hyper is specifically focused on HTTP. Support for HTTP/1 and HTTP/2, with HTTP/3 in the works.</p>
+        </div>
+        <div class="col-md-6 col-lg-4">
+          <h3>Flexible</h3>
+          <p>hyper enables as many usecases as possible. It has no opinion on application structure, and makes few assumptions about its environment. This includes being portable to different operating systems.</p>
+        </div>
+        <div class="col-md-6 col-lg-4">
+          <h3>Understable</h3>
+          <p>hyper is no more complicated than it has to be. HTTP is not simple. It may not be as “easy” as 1-line to do everything, but it shouldn’t be “hard” to find the answers.</p>
+        </div>
       </div>
-
-    </div>
     </section>
 
     {% include footer.html %}
diff --git a/css/main.scss b/css/main.scss
index 1ada155..b8266e3 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -186,7 +186,7 @@ pre code {
     margin: 2rem 0 1rem;
 }
 
-.hyper-content h3 {
+h3 {
     color: $primary-dim-color;
 }
 
@@ -378,4 +378,4 @@ pre code {
 
 .navbar .navbar-brand:hover {
     color: $primary-highlight-color
-}
\ No newline at end of file
+}
diff --git a/index.md b/index.md
index bfe96df..12b469c 100644
--- a/index.md
+++ b/index.md
@@ -2,42 +2,3 @@
 layout: home
 ---
 
-```rust
-# extern crate tokio;
-# extern crate hyper;
-# extern crate http_body_util;
-# mod no_run {
-use std::{convert::Infallible, net::SocketAddr, error::Error};
-use http_body_util::Full;
-use hyper::{Request, Response, body::Bytes, service::service_fn};
-use hyper::server::conn::http1;
-use tokio::net::TcpListener;
-
-async fn hello(
-    _: Request<hyper::body::Incoming>,
-) -> Result<Response<Full<Bytes>>, Infallible> {
-    Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
-}
-
-#[tokio::main]
-async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
-    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
-
-    let listener = TcpListener::bind(addr).await?;
-
-    loop {
-        let (stream, _) = listener.accept().await?;
-
-        tokio::task::spawn(async move {
-            if let Err(err) = http1::Builder::new()
-                .serve_connection(stream, service_fn(hello))
-                .await
-            {
-                println!("Error serving connection: {:?}", err);
-            }
-        });
-    }
-}
-# }
-# fn main() {}
-```

From 3ce9fea47d81a2af5c6effba19762b044cc5e4ee Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Thu, 24 Aug 2023 17:00:18 -0400
Subject: [PATCH 074/138] homepage: reduce 'correct' text

---
 _layouts/home.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_layouts/home.html b/_layouts/home.html
index b479b93..dd28e19 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -36,7 +36,7 @@ <h3>Open</h3>
         </div>
         <div class="col-md-6 col-lg-4">
           <h3>Correct</h3>
-          <p>hyper is a memory safe and robust implementation of the HTTP specification. Memory safety is vital in a core Internet technology. Following the HTTP specifications correctly protects users. It makes the software durable to the “real world”. Where feasible, hyper enforces correct usage.</p>
+          <p>hyper is a memory safe and robust implementation of the HTTP specification. It is durable to the “real world”. Where feasible, hyper enforces correct usage.</p>
         </div>
         <div class="col-md-6 col-lg-4">
           <h3>Fast</h3>

From d1a6c9467140a5353e4988d08ec7f9f5fabd45c4 Mon Sep 17 00:00:00 2001
From: James Sully <sullyj3@gmail.com>
Date: Fri, 15 Sep 2023 23:54:47 +1000
Subject: [PATCH 075/138] home.html: fix typo

---
 _layouts/home.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_layouts/home.html b/_layouts/home.html
index dd28e19..97ccf78 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -51,7 +51,7 @@ <h3>Flexible</h3>
           <p>hyper enables as many usecases as possible. It has no opinion on application structure, and makes few assumptions about its environment. This includes being portable to different operating systems.</p>
         </div>
         <div class="col-md-6 col-lg-4">
-          <h3>Understable</h3>
+          <h3>Understandable</h3>
           <p>hyper is no more complicated than it has to be. HTTP is not simple. It may not be as “easy” as 1-line to do everything, but it shouldn’t be “hard” to find the answers.</p>
         </div>
       </div>

From 769f30ecce512a3396839ca69baab2ca1727203e Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Sun, 15 Oct 2023 03:22:41 +0000
Subject: [PATCH 076/138] doc: update contrib docs

---
 _contrib/maintainers.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
index 48754ff..faf69b5 100644
--- a/_contrib/maintainers.md
+++ b/_contrib/maintainers.md
@@ -11,6 +11,7 @@ To see what these roles do, and how to become one, look at [governance](./govern
 - Eray Karatay (@programatik29)
 - Oddbjørn Grødem (@oddgrd)
 - Noah Kennedy (@Noah-Kennedy)
+- tottoto (@tottoto)
 
 ## Collaborators
 

From 965f96845459a1fcaed28f9a3daa707e3210ba10 Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Wed, 8 Nov 2023 03:23:36 +0000
Subject: [PATCH 077/138] doc: update contrib docs

---
 _contrib/contributing.md | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/_contrib/contributing.md b/_contrib/contributing.md
index f34cd14..1086e26 100644
--- a/_contrib/contributing.md
+++ b/_contrib/contributing.md
@@ -8,18 +8,26 @@ You want to contribute? You're awesome! Don't know where to start? Check the [li
 
 [easy tag]: https://github.com/hyperium/hyper/issues?q=label%3AE-easy+is%3Aopen
 
-
 ## [Pull Requests](pull-requests.md)
 
 - [Submitting a Pull Request](pull-requests.md#submitting-a-pull-request)
 - [Commit Guidelines](commits.md)
 
 ## Cargo fmt
+
 `cargo fmt --all` does not work in hyper. Please use the following commands:
+
 ```txt
 # Mac or Linux
 rustfmt --check --edition 2018 $(git ls-files '*.rs')
 
 # Powershell
 Get-ChildItem . -Filter "*.rs" -Recurse | foreach { rustfmt --check --edition 2018 $_.FullName }
-```
\ No newline at end of file
+```
+
+> **NOTE**: If you are using `rust-analyzer`, you can add the following two lines in your `settings.json` to make sure the features get taken into account when checking the project:
+>
+>    ```json
+>     "rust-analyzer.cargo.features": ["full"],
+>     "rust-analyzer.check.features": ["full"],
+>    ```

From 7fb4b411dd977e19b0f543a46861a1667f28ae7d Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 15 Nov 2023 13:00:56 -0500
Subject: [PATCH 078/138] 1.0 is here

---
 _layouts/home.html | 4 ++--
 _stable/index.md   | 5 +----
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/_layouts/home.html b/_layouts/home.html
index 97ccf78..c5767bf 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -25,8 +25,8 @@ <h3>The HTTP implementation for Rust</h3>
           </ul>
         </div>
         <div class="col-md-6">
-          <h3>Latest: 1.0 coming soon</h3>
-          <p><strong>Note:</strong> hyper is planning a stable <code>1.0</code> release in 2023. These guides will be gradually transitioned to <code>1.0</code>, but if you're looking for guides for <code>0.14</code> you can find them <a href="/guides/0.14">here</a>. If you'd like to learn more about the move to <code>1.0</code>, <a href="https://seanmonstar.com/post/680802159018803200/hyper-10-roadmap">this</a> is a good place to start.</p>
+          <h3>Latest: 1.0 is out!</h3>
+          <p><a href="https://seanmonstar.com/blog/hyper-v1">hyper v1.0 is here!</a></p>
         </div>
       </div>
       <div class="row">
diff --git a/_stable/index.md b/_stable/index.md
index 76a9d90..35bf657 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -4,16 +4,13 @@ layout: guide
 permalink: /guides/1/
 ---
 
-***Note:** these guides are for the upcoming version `1.0` of hyper,
-click [here](/guides/0.14) to see the `0.14` guides.*
-
 hyper is an HTTP library for the Rust language.
 
 You can start using it by first adding it to your `Cargo.toml`:
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.4", features = ["full"] }
+hyper = { version = "1", features = ["full"] }
 ```
 
 - If building a web server, continue with the [Server guide][].

From ce71203118a195c04402da8737748660a7c2e353 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 15 Nov 2023 15:13:01 -0500
Subject: [PATCH 079/138] update for hyper 1.0 release

---
 .github/workflows/check_guides.sh | 4 ++--
 _stable/client/basic.md           | 4 ++--
 _stable/server/hello-world.md     | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index a57dd46..4114cad 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -19,9 +19,9 @@ EOF
         fi
         if [ $value = stable ]; then
             cat >> "$value/Cargo.toml" <<-EOF
-    hyper = { version = "1.0.0-rc.4", features = ["full"] }
+    hyper = { version = "1", features = ["full"] }
     tokio = { version = "1", features = ["full"] }
-    http-body-util = "0.1.0-rc.3" 
+    http-body-util = "0.1"
     hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
 EOF
             cargo build --manifest-path "$value/Cargo.toml"
diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index d085b62..9aea768 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -11,9 +11,9 @@ Let's tell Cargo about our dependencies by having this in the Cargo.toml.
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.4", features = ["full"] }
+hyper = { version = "1", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
-http-body-util = "0.1.0-rc.3"
+http-body-util = "0.1"
 hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
 ```
 
diff --git a/_stable/server/hello-world.md b/_stable/server/hello-world.md
index cf222e6..2e35f8e 100644
--- a/_stable/server/hello-world.md
+++ b/_stable/server/hello-world.md
@@ -9,9 +9,9 @@ First we need to declare our dependencies, let's add the following to our `Cargo
 
 ```toml
 [dependencies]
-hyper = { version = "1.0.0-rc.4", features = ["full"] }
+hyper = { version = "1", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
-http-body-util = "0.1.0-rc.3"
+http-body-util = "0.1"
 hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
 ```
 

From 123ae2a345941dc495293a8f2cbf6ef0f2e0e136 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Sat, 18 Nov 2023 08:59:21 -0500
Subject: [PATCH 080/138] update to published hyper-util

---
 .github/workflows/check_guides.sh | 2 +-
 _stable/client/basic.md           | 2 +-
 _stable/server/hello-world.md     | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index 4114cad..fc0d3af 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -22,7 +22,7 @@ EOF
     hyper = { version = "1", features = ["full"] }
     tokio = { version = "1", features = ["full"] }
     http-body-util = "0.1"
-    hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
+    hyper-util = { version = "0.1", features = ["full"] }
 EOF
             cargo build --manifest-path "$value/Cargo.toml"
         fi
diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index 9aea768..e31c5fd 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -14,7 +14,7 @@ Let's tell Cargo about our dependencies by having this in the Cargo.toml.
 hyper = { version = "1", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
 http-body-util = "0.1"
-hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
+hyper-util = { version = "0.1", features = ["full"] }
 ```
 
 Now, we need to import pieces to use from our dependencies:
diff --git a/_stable/server/hello-world.md b/_stable/server/hello-world.md
index 2e35f8e..97839e6 100644
--- a/_stable/server/hello-world.md
+++ b/_stable/server/hello-world.md
@@ -12,7 +12,7 @@ First we need to declare our dependencies, let's add the following to our `Cargo
 hyper = { version = "1", features = ["full"] }
 tokio = { version = "1", features = ["full"] }
 http-body-util = "0.1"
-hyper-util = { git = "https://github.com/hyperium/hyper-util.git" }
+hyper-util = { version = "0.1", features = ["full"] }
 ```
 
 Next, we need to add some imports in our `main.rs` file:

From b72f2f6e40a6fa4e47b9789c93ee8f0d8f717c98 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Mon, 20 Nov 2023 16:40:18 -0500
Subject: [PATCH 081/138] add upgrading guide

---
 _data/stable.yml     |  5 ++++
 _stable/upgrading.md | 68 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+)
 create mode 100644 _stable/upgrading.md

diff --git a/_data/stable.yml b/_data/stable.yml
index 6f7e9f5..ca2df78 100644
--- a/_data/stable.yml
+++ b/_data/stable.yml
@@ -3,6 +3,7 @@
   guides:
   - server
   - client
+  - upgrading
 
 - title: Server
   path: "/server"
@@ -17,3 +18,7 @@
   - basic
   - advanced
   - configuration
+
+- title: Upgrading
+  path: "/upgrading"
+  guides: []
diff --git a/_stable/upgrading.md b/_stable/upgrading.md
new file mode 100644
index 0000000..41a6220
--- /dev/null
+++ b/_stable/upgrading.md
@@ -0,0 +1,68 @@
+---
+title:  Upgrade from 0.14 to 1
+layout: guide
+permalink: /guides/1/upgrading/
+---
+
+This guide is meant to help you upgrade from v0.14 of hyper to v1.
+
+## Backports and Deprecations
+
+Before upgrading, you can start preparing your 0.14 code base by enabling the
+`backports` and `deprecated` features of hyper in your `Cargo.toml`. Like
+this:
+
+```toml
+[dependencies]
+hyper = { version = "0.14", features = ["etc", "backports", "deprecated"] }
+```
+
+The `backports` feature brings several of the new types from 1.0 to 0.14. If
+you enable `deprecated` feature as well, it will add deprecation warnings to
+any of hyper's types that have direct backports available.
+
+**NOTE**: This won't give you warnings about changes where backports were not
+able to be provided.
+
+## Changelog
+
+As a general rule, we tried hard to mark every possible breaking change in the
+[changelog][]. Read through the "breaking changes" section of the 1.0 releases
+(including the RC 1-4), which will provide suggestions on how to overcome each
+one.
+
+## `hyper::Body`
+
+The `Body` type has changed to be a trait (what used to be `HttpBody`).
+
+The 0.14 `Body` could be multiple variants, and in v1 they have been split into
+[distinct types][http-body-util]. You'll benefit from analzying each place you
+use `hyper::Body` to decide which solution to switch to.
+
+- In general, if you don't need a specific variant, consider making your usage
+  generic, accepting an `impl Body` (or `where B: Body`).
+- If you want a type that can be any variant, you could use `BoxBody`.
+- Otherwise, the [more specific variants][http-body-util] allow for a more
+  explicit API in your code.
+
+## `hyper::Client`
+
+The higher-level pooling `Client` was removed from hyper 1.0. A similar type
+was added to [`hyper-util`][], called [`client::legacy::Client`][legacy]. It's
+mostly a drop-in replacement.
+
+## `hyper::Server`
+
+The v0.14 `hyper::Server` does not have a drop-in replacement, since it had
+problems.
+
+For a server type that can handle both HTTP/1 and HTTP/2 at the same time,
+use the [`server::conn::auto::Builder`][auto] from [`hyper-util`][].
+
+The listening server acceptor can be replaced with a simple loop.
+
+
+[changelog]: https://github.com/hyperium/hyper/blob/master/CHANGELOG.md#v100-2023-11-15
+[`hyper-util`]: https://crates.io/crates/hyper-util
+[legacy]: https://docs.rs/hyper-util/latest/hyper_util/client/legacy/struct.Client.html
+[auto]: https://docs.rs/hyper-util/latest/hyper_util/server/conn/auto/struct.Builder.html

From 9eb6cc64655fd1cbb91b6c0a6b123035704c9566 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Mon, 20 Nov 2023 17:05:52 -0500
Subject: [PATCH 082/138] update upgrading guide

---
 _data/stable.yml        |  1 +
 _includes/guide_ul.html |  6 +++++-
 _stable/upgrading.md    | 11 +++++++----
 css/main.scss           |  2 +-
 4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/_data/stable.yml b/_data/stable.yml
index ca2df78..2e28a01 100644
--- a/_data/stable.yml
+++ b/_data/stable.yml
@@ -21,4 +21,5 @@
 
 - title: Upgrading
   path: "/upgrading"
+  anchor: true
   guides: []
diff --git a/_includes/guide_ul.html b/_includes/guide_ul.html
index aafa83d..1a00ee1 100644
--- a/_includes/guide_ul.html
+++ b/_includes/guide_ul.html
@@ -1,6 +1,10 @@
 
 <section class="guide-topic">
-  <h4 class="guide-topic-title">{{ topic.title }}</h4>
+  <h4 class="guide-topic-title">
+      {% if topic.anchor %}<a href="{{ topic.path | prepend:"/" | prepend: topic.path | prepend:"/guides/1" | append:"/" }}>{% endif %}
+      {{ topic.title }}
+      {% if topic.anchor %}</a>{% endif %}
+  </h4>
   <ul class="nav">
   {% if page.collection == "legacy" %}
     {% for guide in  topic.guides %}
diff --git a/_stable/upgrading.md b/_stable/upgrading.md
index 41a6220..2fa6537 100644
--- a/_stable/upgrading.md
+++ b/_stable/upgrading.md
@@ -1,12 +1,14 @@
 ---
-title:  Upgrade from 0.14 to 1
+title:  Upgrade from v0.14 to v1
 layout: guide
 permalink: /guides/1/upgrading/
 ---
 
 This guide is meant to help you upgrade from v0.14 of hyper to v1.
 
-## Backports and Deprecations
+> Were you looking for the [v0.14 guides](/guides/0.14/)?
+
+## Prepare with Backports and Deprecations
 
 Before upgrading, you can start preparing your 0.14 code base by enabling the
 `backports` and `deprecated` features of hyper in your `Cargo.toml`. Like
@@ -21,10 +23,10 @@ The `backports` feature brings several of the new types from 1.0 to 0.14. If
 you enable `deprecated` feature as well, it will add deprecation warnings to
 any of hyper's types that have direct backports available.
 
-**NOTE**: This won't give you warnings about changes where backports were not
+> **NOTE**: This won't give you warnings about changes where backports were not
 able to be provided.
 
-## Changelog
+## Read the Changelog
 
 As a general rule, we tried hard to mark every possible breaking change in the
 [changelog][]. Read through the "breaking changes" section of the 1.0 releases
@@ -64,5 +66,6 @@ The listening server acceptor can be replaced with a simple loop.
 
 [changelog]: https://github.com/hyperium/hyper/blob/master/CHANGELOG.md#v100-2023-11-15
 [`hyper-util`]: https://crates.io/crates/hyper-util
+[http-body-util]: https://docs.rs/http-body-util
 [legacy]: https://docs.rs/hyper-util/latest/hyper_util/client/legacy/struct.Client.html
 [auto]: https://docs.rs/hyper-util/latest/hyper_util/server/conn/auto/struct.Builder.html
diff --git a/css/main.scss b/css/main.scss
index b8266e3..2aba717 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -31,7 +31,7 @@ a:hover, a:focus {
     color: $primary-highlight-color;
 }
 
-code, a > code {
+code {
     background: $code-bg-color;
     color: $secondary-color;
     padding: 3px 5px;

From 62ee67c58ce3cb1c5c7647235d17b32f173be233 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Mon, 20 Nov 2023 17:24:37 -0500
Subject: [PATCH 083/138] fix up broken nav

---
 _includes/guide_ul.html | 2 +-
 css/main.scss           | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/_includes/guide_ul.html b/_includes/guide_ul.html
index 1a00ee1..165df6c 100644
--- a/_includes/guide_ul.html
+++ b/_includes/guide_ul.html
@@ -1,7 +1,7 @@
 
 <section class="guide-topic">
   <h4 class="guide-topic-title">
-      {% if topic.anchor %}<a href="{{ topic.path | prepend:"/" | prepend: topic.path | prepend:"/guides/1" | append:"/" }}>{% endif %}
+      {% if topic.anchor %}<a href="{{ topic.path | prepend:"/guides/1" | append:"/" }}">{% endif %}
       {{ topic.title }}
       {% if topic.anchor %}</a>{% endif %}
   </h4>
diff --git a/css/main.scss b/css/main.scss
index 2aba717..1c40461 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -49,6 +49,13 @@ pre code {
     padding: 1.5rem;
 }
 
+blockquote {
+    border-left: 3px solid $grey-color-light;
+    color: $grey-color-dark;
+    margin-left: 1em;
+    padding: 0 1em;
+}
+
 .card pre {
     background: none;
 }

From 1719a2e1e8e9c1ac2bc5f7240b65d5b2bfb1be86 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 24 Nov 2023 15:05:45 -0500
Subject: [PATCH 084/138] remove 0.14 guides link from header nav

---
 _includes/header.html | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/_includes/header.html b/_includes/header.html
index 6beabfa..1f35fef 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -6,8 +6,7 @@
     </button>
     <div class="collapse navbar-collapse" id="hyperNavbar">
       <ul class="navbar-nav">
-        <li class="nav-item"><a class="nav-link" href="/guides/1">1.0 Guides</a></li>
-        <li class="nav-item"><a class="nav-link" href="/guides/0.14">0.14 Guides</a></li>
+        <li class="nav-item"><a class="nav-link" href="/guides/1">Guides</a></li>
         <li class="nav-item"><a class="nav-link" href="/contrib">Contrib</a></li>
         <li class="nav-item"><a class="nav-link" href="https://github.com/hyperium/hyper">Source</a></li>
       </ul>

From 93b4a7f3c6df53e96f8d32560dc306ecc9a49c2a Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Mon, 27 Nov 2023 12:13:11 -0500
Subject: [PATCH 085/138] guides: add /init/setup

---
 _data/stable.yml        |  6 ++++++
 _stable/client/index.md |  3 ++-
 _stable/init/setup.md   | 28 ++++++++++++++++++++++++++++
 _stable/server/index.md |  3 ++-
 4 files changed, 38 insertions(+), 2 deletions(-)
 create mode 100644 _stable/init/setup.md

diff --git a/_data/stable.yml b/_data/stable.yml
index 2e28a01..a263ad6 100644
--- a/_data/stable.yml
+++ b/_data/stable.yml
@@ -1,10 +1,16 @@
 - title: Guide
   path: ""
   guides:
+  - init
   - server
   - client
   - upgrading
 
+- title: Init
+  path: "/init"
+  guides:
+  - setup
+
 - title: Server
   path: "/server"
   guides:
diff --git a/_stable/client/index.md b/_stable/client/index.md
index bd6b487..9ecb50c 100644
--- a/_stable/client/index.md
+++ b/_stable/client/index.md
@@ -1,6 +1,7 @@
 ---
 title: Client Guides
-permalink: /1/client/
+layout: guide
+permalink: /guides/1/client/
 ---
 
 This is just placeholder page. It should probably become a table of
diff --git a/_stable/init/setup.md b/_stable/init/setup.md
new file mode 100644
index 0000000..609d49a
--- /dev/null
+++ b/_stable/init/setup.md
@@ -0,0 +1,28 @@
+---
+title:  Initial Setup
+layout: guide
+permalink: /guides/1/init/setup/
+---
+
+This will help get your initial setup ready to be able to try out the
+lessons in the guides.
+
+## Dependencies
+
+To make things simple, you can add the follow crates to your
+`Cargo.toml`:
+
+```toml
+[dependencies]
+hyper = { version = "1", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
+http-body-util = "0.1"
+hyper-util = { version = "0.1", features = ["full"] }
+```
+
+And with that, you're good to go! Depending on what you want to
+accomplish, you can move on to either the [client][] or [server][]
+guides.
+
+[client]: ../../client
+[server]: ../../server
diff --git a/_stable/server/index.md b/_stable/server/index.md
index 8c61af2..27531c5 100644
--- a/_stable/server/index.md
+++ b/_stable/server/index.md
@@ -1,6 +1,7 @@
 ---
 title: Server Guides
-permalink: /1/server/
+layout: guide
+permalink: /guides/1/server/
 ---
 
 This is just placeholder page. It should probably become a table of

From a95d06b7f90ee913bdb05baffc87cfd803fc75e0 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Mon, 27 Nov 2023 14:37:59 -0500
Subject: [PATCH 086/138] update config with newest version links

---
 _config.yml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/_config.yml b/_config.yml
index cb8749f..f6d09e8 100644
--- a/_config.yml
+++ b/_config.yml
@@ -52,12 +52,12 @@ relative_links:
 
 plugins:
   - jekyll-redirect-from
-  
-docs_url: https://docs.rs/hyper/1.0.0-rc.4
+
+docs_url: https://docs.rs/hyper
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
-http_body_util_url: https://docs.rs/http-body-util/0.1.0-rc.3
-hyper_tls_url: https://docs.rs/hyper-tls/*
+http_body_util_url: https://docs.rs/http-body-util
+hyper_tls_url: https://docs.rs/hyper-tls
 
 futures_url: https://docs.rs/futures/0.3.*
-legacy_docs_url: https://docs.rs/hyper/0.14.23
+legacy_docs_url: https://docs.rs/hyper/0.14.*
 legacy_examples_url: https://github.com/hyperium/hyper/tree/0.14.x/examples

From f997bacc5d9254699edf72c209a1db853f5ba2b8 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 29 Nov 2023 13:43:12 -0500
Subject: [PATCH 087/138] update upgrading subtitles

---
 _stable/upgrading.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/_stable/upgrading.md b/_stable/upgrading.md
index 2fa6537..1975bbf 100644
--- a/_stable/upgrading.md
+++ b/_stable/upgrading.md
@@ -33,7 +33,7 @@ As a general rule, we tried hard to mark every possible breaking change in the
 (including the RC 1-4), which will provide suggestions on how to overcome each
 one.
 
-## `hyper::Body`
+## `Body`
 
 The `Body` type has changed to be a trait (what used to be `HttpBody`).
 
@@ -47,13 +47,13 @@ use `hyper::Body` to decide which solution to switch to.
 - Otherwise, the [more specific variants][http-body-util] allow for a more
   explicit API in your code.
 
-## `hyper::Client`
+## `Client`
 
 The higher-level pooling `Client` was removed from hyper 1.0. A similar type
 was added to [`hyper-util`][], called [`client::legacy::Client`][legacy]. It's
 mostly a drop-in replacement.
 
-## `hyper::Server`
+## `Server`
 
 The v0.14 `hyper::Server` does not have a drop-in replacement, since it had
 problems.

From 6154d55f254af554b19127e15f1cb56499ba97a1 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 1 Dec 2023 09:30:34 -0500
Subject: [PATCH 088/138] update redirect to v1 guides now

---
 _legacy/index.md |  5 +++--
 _stable/index.md | 10 ++++------
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/_legacy/index.md b/_legacy/index.md
index c6a229b..a1172f6 100644
--- a/_legacy/index.md
+++ b/_legacy/index.md
@@ -2,12 +2,13 @@
 title:  Getting Started
 layout: guide
 permalink: /guides/0.14/
-redirect_from: 
-    - /guides/
 ---
 
 hyper is an HTTP library for the Rust language.
 
+> **NOTE**: These guides are for the older 0.14.x version of hyper. Did
+> you want the [v1 guides](/guides/1)?
+
 You can start using it by first adding it to your `Cargo.toml`:
 
 ```toml
diff --git a/_stable/index.md b/_stable/index.md
index 35bf657..1e6f72f 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -2,16 +2,14 @@
 title:  Getting Started
 layout: guide
 permalink: /guides/1/
+redirect_from:
+    - /guides/
 ---
 
 hyper is an HTTP library for the Rust language.
 
-You can start using it by first adding it to your `Cargo.toml`:
-
-```toml
-[dependencies]
-hyper = { version = "1", features = ["full"] }
-```
+If this is your **first time** here, take a look at [how to
+setup](init/setup).
 
 - If building a web server, continue with the [Server guide][].
 - If trying to talk to a server, continue with the [Client guide][].

From ae0ba910329999d1445dfa8348f544f8bd565889 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 8 Dec 2023 15:42:29 -0500
Subject: [PATCH 089/138] upgrading: note about Service is not from tower

---
 _stable/upgrading.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/_stable/upgrading.md b/_stable/upgrading.md
index 1975bbf..5a3a3c5 100644
--- a/_stable/upgrading.md
+++ b/_stable/upgrading.md
@@ -63,6 +63,12 @@ use the [`server::conn::auto::Builder`][auto] from [`hyper-util`][].
 
 The listening server acceptor can be replaced with a simple loop.
 
+## `Service`/`service_fn`
+
+Previously, hyper depended on `tower` for the `Service` trait. Because
+`tower` is not yet 1.0, hyper could not publicly depend on it. So, it's
+`Service` trait and the helper function `service_fn` are defined in
+`hyper::service`.
 
 [changelog]: https://github.com/hyperium/hyper/blob/master/CHANGELOG.md#v100-2023-11-15
 [`hyper-util`]: https://crates.io/crates/hyper-util

From 4ec75f1fc714cfbfd0d4e7406da35311fdd48679 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Sat, 9 Dec 2023 09:05:25 -0500
Subject: [PATCH 090/138] guides: add connector stub

---
 _data/stable.yml             |  4 +---
 _stable/client/connectors.md | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 3 deletions(-)
 create mode 100644 _stable/client/connectors.md

diff --git a/_data/stable.yml b/_data/stable.yml
index a263ad6..3202f5b 100644
--- a/_data/stable.yml
+++ b/_data/stable.yml
@@ -16,14 +16,12 @@
   guides:
   - hello-world
   - echo
-  - graceful-shutdown
 
 - title: Client
   path: "/client"
   guides:
   - basic
-  - advanced
-  - configuration
+  - connectors
 
 - title: Upgrading
   path: "/upgrading"
diff --git a/_stable/client/connectors.md b/_stable/client/connectors.md
new file mode 100644
index 0000000..0210762
--- /dev/null
+++ b/_stable/client/connectors.md
@@ -0,0 +1,35 @@
+---
+title: Connectors, Pools, and HTTPS
+layout: guide
+---
+
+> **Unstable**: The code discussed in this guide is in `hyper-util`,
+> which is not as stable as that which is in `hyper`. It is production
+> ready, but changes may come more frequently.
+
+_TODO_
+
+## What is a connector?
+
+_TODO_
+
+## Connection Pools
+
+_TODO_
+
+## HTTPS
+
+hyper allows you to bring your own IO, so it can work on top of any TLS
+implementation. (TODO: link to runtime guide)
+
+There are also crates that provide "connectors" which result in
+easy-to-use HTTPS for the legacy client in `hyper-util`. Each has their
+own reason for existing, and pros and cons, but this list is provided to
+help you get started[^tls-list]:
+
+- [hyper-tls](https://crates.io/crates/hyper-tls)
+- [hyper-rustls](https://crates.io/crates/hyper-rustls)
+- [hyper-openssl](https://crates.io/crates/hyper-openssl)
+
+[^tls-list]: This isn't an endorsement for any of the crates, and they
+  all are maintained separately from hyper.

From de51938789243bdf57ffb9158f55ba4fd7398572 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Sat, 9 Dec 2023 09:15:40 -0500
Subject: [PATCH 091/138] fix footnote

---
 _stable/client/connectors.md | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/_stable/client/connectors.md b/_stable/client/connectors.md
index 0210762..db82d5e 100644
--- a/_stable/client/connectors.md
+++ b/_stable/client/connectors.md
@@ -31,5 +31,4 @@ help you get started[^tls-list]:
 - [hyper-rustls](https://crates.io/crates/hyper-rustls)
 - [hyper-openssl](https://crates.io/crates/hyper-openssl)
 
-[^tls-list]: This isn't an endorsement for any of the crates, and they
-  all are maintained separately from hyper.
+[^tls-list]: This isn't an endorsement for any of the crates, and they all are maintained separately from hyper.

From 39bf4fc4aa9617d51a2521b2b6c15d48834ce8fa Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Sat, 16 Dec 2023 03:24:00 +0000
Subject: [PATCH 092/138] doc: update contrib docs

---
 _contrib/issues.md | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/_contrib/issues.md b/_contrib/issues.md
index b899f79..ce3de69 100644
--- a/_contrib/issues.md
+++ b/_contrib/issues.md
@@ -95,6 +95,16 @@ These labels indicate an issue is "blocked" for some reason.
 - **B-rfc**: request for comments. More discussion is needed to explore the design.
 - **B-upstream**: waiting on something in a dependency or the compiler.
 
+### Category
+
+The category marks what kind of issue this is.
+
+- **C-bug**: something is wrong, this is bad!
+- **C-feature**: this is a new feature request, adding something new.
+- **C-performance**: make existing working code go faster.
+- **C-refactor**: improve internal code to help readability and maintenance.
+- **C-chore**: a general chore or maintenance task.
+
 ### Effort
 
 The effort labels are a best-guess at roughly how much effort and knowledge of hyper is needed to accomplish the task.
@@ -103,14 +113,6 @@ The effort labels are a best-guess at roughly how much effort and knowledge of h
 - **E-medium**: some knowledge of how hyper internals work would be useful.
 - **E-hard**: likely requires a deeper understanding of how hyper internals work.
 
-### Severity
-
-The severity marks how _severe_ the issue is. Note this isn't "importance" or "priority".
-
-- **S-bug**: something is wrong, this is bad!
-- **S-feature**: this is a new feature request, adding something new.
-- **S-performance**: make existing working code go faster.
-- **S-refactor**: improve internal code to help readability and maintenance.
 
 [issues]: https://github.com/hyperium/hyper/issues
 [COC]: ./code-of-conduct.md

From d96a1b396a1fd25e84caf730b9428786b2b8b30e Mon Sep 17 00:00:00 2001
From: tottoto <tottotodev@gmail.com>
Date: Mon, 8 Jan 2024 16:57:50 +0900
Subject: [PATCH 093/138] guide: update basic client guide

---
 _stable/client/basic.md | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index e31c5fd..da3b9e8 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -40,7 +40,7 @@ but the point here is just to show all the setup required. Once you have this,
 you are set to make thousands of client requests efficiently.
 
 We have to setup some sort of runtime. You can use whichever async runtime you'd
-like, but for this guide we're going to use tokio. If you've never used futures 
+like, but for this guide we're going to use tokio. If you've never used futures
 in Rust before, you may wish to read through [Tokio's guide on Futures][Tokio-Futures].
 
 ```rust
@@ -59,19 +59,19 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
 ## Setup
 
 To get started we'll need to get a few things setup. For this guide we're
-going to send a GET [`Request`][Request] to [http://httpbin.org/ip](http://httpbin.org/ip), 
-which will return a `200 OK` and the Requester's IP address in the body. 
+going to send a GET [`Request`][Request] to [http://httpbin.org/ip](http://httpbin.org/ip),
+which will return a `200 OK` and the Requester's IP address in the body.
 
 We need to open a TCP connection to the remote host using a hostname and port,
 which in this case is `httpbin.org` and the default port for HTTP: `80`. With our
 connection opened, we pass it in to the `client::conn::http1::handshake` function,
-performing a handshake to verify the remote is ready to receive our requests. 
+performing a handshake to verify the remote is ready to receive our requests.
 
 A successful handshake will give us a [Connection][Connection] future that processes
-all HTTP state, and a [SendRequest][SendRequest] struct that we can use to send our 
-`Request`s on the connection. 
+all HTTP state, and a [SendRequest][SendRequest] struct that we can use to send our
+`Request`s on the connection.
 
-To start driving the HTTP state we have to poll the `Connection`, so to finish our 
+To start driving the HTTP state we have to poll the `Connection`, so to finish our
 setup we'll spawn a `tokio::task` and `await` it.
 
 ```rust
@@ -123,12 +123,12 @@ tokio::task::spawn(async move {
 
 ## GET
 
-Now that we've set up our connection, we're ready to construct and send our first `Request`! 
-Since `SendRequest` doesn't require absolute-form `URI`s we are required to include a `HOST` 
+Now that we've set up our connection, we're ready to construct and send our first `Request`!
+Since `SendRequest` doesn't require absolute-form `URI`s we are required to include a `HOST`
 header in our requests. And while we can send our `Request` with an empty `Body`, we need to
 explicitly set it, which we'll do with the [`Empty`][Empty] utility struct.
 
-All we need to do now is pass the `Request` to `SendRequest::send_request`, this returns a 
+All we need to do now is pass the `Request` to `SendRequest::send_request`, this returns a
 future which will resolve to the [`Response`][Response] from `httpbin.org`. We'll print the
 status of the response to see that it returned the expected `200 OK` status.
 
@@ -179,7 +179,7 @@ We know that sending a GET `Request` to `httpbin.org/ip` will return our IP addr
 the `Response` body. To see the returned body, we'll simply write it to `stdout`.
 
 Bodies in hyper are asynchronous streams of [`Frame`][Frame]s, so we don't have to wait for the
-whole body to arrive, buffering it into memory, and then writing it out. We can simply 
+whole body to arrive, buffering it into memory, and then writing it out. We can simply
 `await` each `Frame` and write them directly to `stdout` as they arrive!
 
 In addition to importing `stdout`, we'll need to make use of the `BodyExt` trait:
@@ -188,7 +188,7 @@ In addition to importing `stdout`, we'll need to make use of the `BodyExt` trait
 # extern crate http_body_util;
 # extern crate tokio;
 use http_body_util::BodyExt;
-use tokio::io::{stdout, AsyncWriteExt as _};
+use tokio::io::{AsyncWriteExt as _, self};
 ```
 
 ```rust
@@ -225,7 +225,7 @@ use tokio::io::{stdout, AsyncWriteExt as _};
 while let Some(next) = res.frame().await {
     let frame = next?;
     if let Some(chunk) = frame.data_ref() {
-        io::stdout().write_all(&chunk).await?;
+        io::stdout().write_all(chunk).await?;
     }
 }
 # Ok(())

From 2f7455249e2c4919f9c5b1bd8d9e6eb46b2c896f Mon Sep 17 00:00:00 2001
From: mark0 <59284400+mark0-cn@users.noreply.github.com>
Date: Sun, 14 Jan 2024 19:24:44 +0800
Subject: [PATCH 094/138] Update footer.html

Update time stamp
---
 _includes/footer.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_includes/footer.html b/_includes/footer.html
index 2489506..53e9c80 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -1,7 +1,7 @@
 <footer class="hyper-footer col-md-12">
     <div class="container">
         <div class="row">
-            <div class="col-sm-6 text-center text-sm-start text-muted">&copy; 2023 hyper</div>
+            <div class="col-sm-6 text-center text-sm-start text-muted">&copy; 2024 hyper</div>
             <div class="col-sm-6 text-center text-sm-end">
                 {% if page.hyper_path %}
                     <a href="https://github.com/hyperium/hyper/blob/master/{{ page.hyper_path }}">

From fac1ea76f76158c7d85d8b8d544518e3ca9c38b8 Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Sat, 20 Jan 2024 03:24:36 +0000
Subject: [PATCH 095/138] doc: update contrib docs

---
 _contrib/code-style.md   | 26 ++++++++++++++++++++++++++
 _contrib/contributing.md | 19 -------------------
 2 files changed, 26 insertions(+), 19 deletions(-)
 create mode 100644 _contrib/code-style.md

diff --git a/_contrib/code-style.md b/_contrib/code-style.md
new file mode 100644
index 0000000..cc544f3
--- /dev/null
+++ b/_contrib/code-style.md
@@ -0,0 +1,26 @@
+---
+title: Code Style
+layout: guide
+hyper_path: docs/CODE_STYLE.md
+---
+
+hyper uses the default configuration of `rustfmt`.
+
+## cargo fmt
+
+`cargo fmt --all` does not work in hyper. Please use the following commands:
+
+```txt
+# Mac or Linux
+rustfmt --check --edition 2018 $(git ls-files '*.rs')
+
+# Powershell
+Get-ChildItem . -Filter "*.rs" -Recurse | foreach { rustfmt --check --edition 2018 $_.FullName }
+```
+
+> **NOTE**: If you are using `rust-analyzer`, you can add the following two lines in your `settings.json` to make sure the features get taken into account when checking the project:
+>
+>    ```json
+>     "rust-analyzer.cargo.features": ["full"],
+>     "rust-analyzer.check.features": ["full"],
+>    ```
diff --git a/_contrib/contributing.md b/_contrib/contributing.md
index 1086e26..e478b4d 100644
--- a/_contrib/contributing.md
+++ b/_contrib/contributing.md
@@ -12,22 +12,3 @@ You want to contribute? You're awesome! Don't know where to start? Check the [li
 
 - [Submitting a Pull Request](pull-requests.md#submitting-a-pull-request)
 - [Commit Guidelines](commits.md)
-
-## Cargo fmt
-
-`cargo fmt --all` does not work in hyper. Please use the following commands:
-
-```txt
-# Mac or Linux
-rustfmt --check --edition 2018 $(git ls-files '*.rs')
-
-# Powershell
-Get-ChildItem . -Filter "*.rs" -Recurse | foreach { rustfmt --check --edition 2018 $_.FullName }
-```
-
-> **NOTE**: If you are using `rust-analyzer`, you can add the following two lines in your `settings.json` to make sure the features get taken into account when checking the project:
->
->    ```json
->     "rust-analyzer.cargo.features": ["full"],
->     "rust-analyzer.check.features": ["full"],
->    ```

From 2be40ff0772e05ab118b7cc53ca5ebbebe7f7894 Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Wed, 24 Jan 2024 03:25:14 +0000
Subject: [PATCH 096/138] doc: update contrib docs

---
 _contrib/maintainers.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
index faf69b5..0bc43c9 100644
--- a/_contrib/maintainers.md
+++ b/_contrib/maintainers.md
@@ -12,6 +12,7 @@ To see what these roles do, and how to become one, look at [governance](./govern
 - Oddbjørn Grødem (@oddgrd)
 - Noah Kennedy (@Noah-Kennedy)
 - tottoto (@tottoto)
+- dswij (@dswij)
 
 ## Collaborators
 

From b8ffeb7504a8f4b2f9301e3c90df394aebdd837a Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 31 Jan 2024 17:01:34 -0500
Subject: [PATCH 097/138] style: footnotes

---
 css/main.scss | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/css/main.scss b/css/main.scss
index 1c40461..7aa34f4 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -386,3 +386,16 @@ pre code {
 .navbar .navbar-brand:hover {
     color: $primary-highlight-color
 }
+
+.footnotes {
+    border-top: 1px solid $grey-color;
+    margin-top: 2rem;
+    padding-top: 1rem;
+}
+
+.footnotes li {
+    color: $grey-color;
+    font-size: 0.9rem;
+}
+
+

From 701fb3e62cd6bbbf62e488d60575ecbfbf2a3881 Mon Sep 17 00:00:00 2001
From: Steven Fackler <sfackler@gmail.com>
Date: Thu, 22 Feb 2024 07:35:03 -0500
Subject: [PATCH 098/138] Fix comment

---
 _stable/client/basic.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index da3b9e8..9c1fe8b 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -101,7 +101,7 @@ let stream = TcpStream::connect(address).await?;
 // `hyper::rt` IO traits.
 let io = TokioIo::new(stream);
 
-// Perform a TCP handshake
+// Create the Hyper client
 let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await?;
 
 // Spawn a task to poll the connection, driving the HTTP state

From 28e0bc61da94a2d1960b3359198d81de49982f8e Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Mon, 26 Feb 2024 03:24:12 +0000
Subject: [PATCH 099/138] doc: update contrib docs

---
 _contrib/code-style.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/_contrib/code-style.md b/_contrib/code-style.md
index cc544f3..5cc671e 100644
--- a/_contrib/code-style.md
+++ b/_contrib/code-style.md
@@ -12,10 +12,10 @@ hyper uses the default configuration of `rustfmt`.
 
 ```txt
 # Mac or Linux
-rustfmt --check --edition 2018 $(git ls-files '*.rs')
+rustfmt --check --edition 2021 $(git ls-files '*.rs')
 
 # Powershell
-Get-ChildItem . -Filter "*.rs" -Recurse | foreach { rustfmt --check --edition 2018 $_.FullName }
+Get-ChildItem . -Filter "*.rs" -Recurse | foreach { rustfmt --check --edition 2021 $_.FullName }
 ```
 
 > **NOTE**: If you are using `rust-analyzer`, you can add the following two lines in your `settings.json` to make sure the features get taken into account when checking the project:

From 28a3d00e92fdbad2f9ac7c3fdfce7504417cdc3a Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Tue, 27 Feb 2024 03:24:05 +0000
Subject: [PATCH 100/138] doc: update contrib docs

---
 _contrib/contributing.md | 35 +++++++++++++++++++++++++++++++++--
 _contrib/maintainers.md  |  2 +-
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/_contrib/contributing.md b/_contrib/contributing.md
index e478b4d..8e39f75 100644
--- a/_contrib/contributing.md
+++ b/_contrib/contributing.md
@@ -4,11 +4,42 @@ layout: guide
 hyper_path: CONTRIBUTING.md
 ---
 
-You want to contribute? You're awesome! Don't know where to start? Check the [list of easy issues](https://github.com/hyperium/hyper/issues?q=is%3Aopen+is%3Aissue+label%3AE-easy).
+You want to contribute? You're awesome!
+
+Contributions come in all shapes and sizes. Let's take a tour of some of the different wants you could contribute.
+
+## [Code of Conduct](code-of-conduct.md)
+
+Firstly, all interactions with the project need to abide by the code of conduct. This is to make sure everyone is treated kindly.
+
+## [Issues](issues.md)
+
+- **Filing an issue** is a contribution. We appreciate you letting us know about bugs you've found, and any information that you can provide that we can use to make hyper better. Without your filing it, we may not be aware of the bug.
+- [Triaging issues](issues.md#triaging) is a huge help. By your helping make issues better, the reporters can get answers sooner, and others can fix them with less effort. You can also volunteer as a frequent [triager](maintainers.md#triagers).
+- Discuss [feature requests][feat] (especially those marked [request-for-comment][b-rfc]).
+
+[feat]: https://github.com/hyperium/hyper/issues?q=is%3Aissue+is%3Aopen+label%3AC-feature
+[b-rfc]: https://github.com/hyperium/hyper/issues?q=is%3Aissue+is%3Aopen+label%3AB-rfc
 
-[easy tag]: https://github.com/hyperium/hyper/issues?q=label%3AE-easy+is%3Aopen
 
 ## [Pull Requests](pull-requests.md)
 
+By the way, consider checking the [list of easy issues](https://github.com/hyperium/hyper/issues?q=is%3Aopen+is%3Aissue+label%3AE-easy) if you want to submit something.
+
 - [Submitting a Pull Request](pull-requests.md#submitting-a-pull-request)
 - [Commit Guidelines](commits.md)
+
+## Documentation
+
+Improving hyper's documentation is a huge help for everyone who is trying to _use_ hyper.
+
+- The API documentation (rendered at https://docs.rs/hyper) is stored as rustdoc comments directly in the source.
+- The main website has [tutorial-style guides](https://hyper.rs/guides). As of v1, they are currently in a [revamp](https://github.com/hyperium/hyper/issues/3411), and would greatly benefit from being filled out.
+
+## Help
+
+Helping others use hyper in their specific workflows is a very valuable way to contribute.
+
+- Answer questions asked directly in hyper's [Discussions](https://github.com/hyperium/hyper/discussions).
+- Join our [Discord](https://discord.gg/kkwpueZ) and help those who show up with questions.
+- **Blog about hyper.** You writing a blog post about how you use hyper to do something specific, or how you contributed a new feature, or debugged something in it, is a great idea. Not all examples can fit in the hyper repo. Search engines will help people find their use cases on your blog. And you can describe processes in more depth or from a different perspective.
diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
index 0bc43c9..bf64f13 100644
--- a/_contrib/maintainers.md
+++ b/_contrib/maintainers.md
@@ -10,7 +10,6 @@ To see what these roles do, and how to become one, look at [governance](./govern
 
 - Eray Karatay (@programatik29)
 - Oddbjørn Grødem (@oddgrd)
-- Noah Kennedy (@Noah-Kennedy)
 - tottoto (@tottoto)
 - dswij (@dswij)
 
@@ -24,6 +23,7 @@ To see what these roles do, and how to become one, look at [governance](./govern
 - Anthony Ramine (@nox)
 - David Pedersen (@davidpdrsn)
 - Adam Foltzer (@acfoltzer)
+- Noah Kennedy (@Noah-Kennedy)
 
 <details>
 <summary>Emeriti</summary>

From 5034b20d60e9282103e6877f4471701f8078a375 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 28 Feb 2024 10:55:45 -0500
Subject: [PATCH 101/138] blog: welcome noah kennedy

---
 _posts/2024-02-28-welcome-noah-kennedy.md | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 _posts/2024-02-28-welcome-noah-kennedy.md

diff --git a/_posts/2024-02-28-welcome-noah-kennedy.md b/_posts/2024-02-28-welcome-noah-kennedy.md
new file mode 100644
index 0000000..b4e1284
--- /dev/null
+++ b/_posts/2024-02-28-welcome-noah-kennedy.md
@@ -0,0 +1,12 @@
+---
+title: "Welcome Noah Kennedy"
+---
+
+We'd like to welcome Noah Kennedy ([@Noah-Kennedy](https://github.com/Noah-Kennedy)) as a hyper Collaborator. Noah has paid special attention to security issues in hyper, such as:
+
+- [Jumping in immediately with a surprise CVE for h2](https://seanmonstar.com/blog/coe-surpise-hyper-cve/)
+- [Rapid Reset Attack testing to determine hyper was unaffected](https://seanmonstar.com/blog/hyper-http2-rapid-reset-unaffected/)
+- [Fixing Reset Floods for h2](https://mastodon.despise.computer/@noah/111773455336054987)
+
+
+Thanks for helping keep us all secure!

From 0bf5e29fb69fa87cd98382f04d03df66aa8077d1 Mon Sep 17 00:00:00 2001
From: dswij <dswijj@gmail.com>
Date: Thu, 29 Feb 2024 02:48:39 +0800
Subject: [PATCH 102/138] chore: update rustdoc edition to 2021

---
 .github/workflows/check_guides.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index fc0d3af..2f5b795 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -30,7 +30,7 @@ EOF
 
     test_file() {
         echo "Testing: $f"
-        rustdoc --edition 2018 --test $1 -L "$value/target/debug/deps"
+        rustdoc --edition 2021 --test $1 -L "$value/target/debug/deps"
     }
 
     if [ -n "$1" ]; then

From e7fc8002c740624ea5dc734abba012f20947eb7c Mon Sep 17 00:00:00 2001
From: dswij <dswijj@gmail.com>
Date: Thu, 29 Feb 2024 00:35:08 +0800
Subject: [PATCH 103/138] guide: add rt guide

---
 _stable/init/runtime.md | 112 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 112 insertions(+)
 create mode 100644 _stable/init/runtime.md

diff --git a/_stable/init/runtime.md b/_stable/init/runtime.md
new file mode 100644
index 0000000..4063a65
--- /dev/null
+++ b/_stable/init/runtime.md
@@ -0,0 +1,112 @@
+---
+title:  Runtime
+layout: guide
+permalink: /guides/1/init/runtime/
+---
+
+With hyper v1.0 removing `tokio` as runtime dependency, a new runtime trait `hyper::rt` is introduced. If you still want to use `tokio`, a `tokio` implementation for `hyper::rt` is provided by `hyper-util` crate.
+
+## Building your own `hyper::rt` implementations with `Tokio`
+
+Let's build a simple `hyper::rt` implementations with the help of tokio. First, make sure you have `tokio` as a dependency in your `Cargo.toml`:
+
+```toml
+[dependencies]
+tokio = { version = "1", features = ["full"] }
+```
+
+Now, let's try to write a simple executor `hyper::rt::Executor`, we'll call it `TokioExecutor`:
+
+```rust
+# extern crate hyper;
+/// Future executor that utilises `tokio` threads.
+#[non_exhaustive]
+#[derive(Default, Debug, Clone)]
+pub struct TokioExecutor {}
+```
+
+the trait `hyper::rt::Executor` expects an `execute` method that asks the runtime to execute futures. `tokio` allows this easily with `tokio::spawn`
+
+```rust
+# extern crate hyper;
+# extern crate tokio;
+
+use std::future::Future;
+
+use hyper::rt::Executor;
+
+# #[non_exhaustive]
+# #[derive(Default, Debug, Clone)]
+# pub struct TokioExecutor {}
+
+impl<Fut> Executor<Fut> for TokioExecutor
+where
+    Fut: Future + Send + 'static,
+    Fut::Output: Send + 'static,
+{
+    fn execute(&self, fut: Fut) {
+        tokio::spawn(fut);
+    }
+}
+```
+
+We now have a working `hyper::rt::Executor` with Tokio, and is ready to be supplied to anything that requires `Executor`. For example, with the auto connection from hyper-util:
+
+```rust
+# extern crate hyper;
+# extern crate hyper_util;
+# extern crate tokio;
+
+use std::future::Future;
+
+use hyper_util::server::conn::auto;
+use hyper::rt::Executor;
+
+# #[non_exhaustive]
+# #[derive(Default, Debug, Clone)]
+# pub struct TokioExecutor {}
+
+# impl<Fut> Executor<Fut> for TokioExecutor
+# where
+#     Fut: Future + Send + 'static,
+#     Fut::Output: Send + 'static,
+# {
+#     fn execute(&self, fut: Fut) {
+#         tokio::spawn(fut);
+#     }
+# }
+
+impl TokioExecutor {
+    pub fn new() -> Self {
+        Self {}
+    }
+}
+
+auto::Builder::new(TokioExecutor::new());
+```
+
+## Using `hyper::rt` implementations with tokio in hyper-util
+
+The crate `hyper-util` provides implementations for `hyper::rt` traits with Tokio. To use, we'll need to have `hyper-util` as a dependency.
+
+```toml
+[dependencies]
+hyper-util = { version = "0.1", features = ["full"] }
+```
+
+Then you'll simply need to import and use it as in the example above
+
+```rust
+# extern crate hyper;
+# extern crate hyper_util;
+
+use hyper::rt::Executor;
+use hyper_util::rt::TokioExecutor;
+use hyper_util::server::conn::auto;
+
+auto::Builder::new(TokioExecutor::new());
+```
+
+There are more implementations in the hyper_util crate. Check out the docs on [`hyper_util::rt`][] for more details.
+
+[`hyper_util::rt`]: https://docs.rs/hyper-util/latest/hyper_util/rt/index.html

From 281f5d579b6b6f21bf696e7aab6683d393b82db2 Mon Sep 17 00:00:00 2001
From: github-actions <github-actions@github.com>
Date: Sun, 3 Mar 2024 03:22:34 +0000
Subject: [PATCH 104/138] doc: update contrib docs

---
 _contrib/maintainers.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
index bf64f13..75cfd8f 100644
--- a/_contrib/maintainers.md
+++ b/_contrib/maintainers.md
@@ -11,7 +11,6 @@ To see what these roles do, and how to become one, look at [governance](./govern
 - Eray Karatay (@programatik29)
 - Oddbjørn Grødem (@oddgrd)
 - tottoto (@tottoto)
-- dswij (@dswij)
 
 ## Collaborators
 
@@ -24,6 +23,7 @@ To see what these roles do, and how to become one, look at [governance](./govern
 - David Pedersen (@davidpdrsn)
 - Adam Foltzer (@acfoltzer)
 - Noah Kennedy (@Noah-Kennedy)
+- dswij (@dswij)
 
 <details>
 <summary>Emeriti</summary>

From 2ff98c487c53f13413d9cf61afceaf3ca3bcd989 Mon Sep 17 00:00:00 2001
From: dswij <dswijj@gmail.com>
Date: Tue, 5 Mar 2024 02:16:41 +0800
Subject: [PATCH 105/138] guide: add runtime to _data

---
 _data/stable.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/_data/stable.yml b/_data/stable.yml
index 3202f5b..14398c6 100644
--- a/_data/stable.yml
+++ b/_data/stable.yml
@@ -10,6 +10,7 @@
   path: "/init"
   guides:
   - setup
+  - runtime
 
 - title: Server
   path: "/server"

From a916db7eac0fbc0936f3bbffc0ee4689fb8958cf Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 5 Mar 2024 08:30:05 -0500
Subject: [PATCH 106/138] blog: welcome dswij (#125)

---
 _posts/2024-03-04-welcome-dswij.md | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 _posts/2024-03-04-welcome-dswij.md

diff --git a/_posts/2024-03-04-welcome-dswij.md b/_posts/2024-03-04-welcome-dswij.md
new file mode 100644
index 0000000..65ae4c3
--- /dev/null
+++ b/_posts/2024-03-04-welcome-dswij.md
@@ -0,0 +1,12 @@
+---
+title: "Welcome dswij"
+---
+
+We're excited to announce that [@dswij](https://github.com/dswij)) is now a hyper Collaborator. dswij has been helping in a versatile way:
+
+- [Fixing a tricky h2 flow control hang](https://github.com/hyperium/h2/pull/730) (and a couple others)
+- [A guide to bringing your own runtime or using Tokio](https://github.com/hyperium/hyperium.github.io/pull/121)
+- Providing kind and helpful feedback in issues and pull requests
+
+
+Thanks for raising the bar!

From 8899d68c43bd60500b95d54e716cc839d4f3a66b Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 5 Mar 2024 09:52:42 -0500
Subject: [PATCH 107/138] add blog index and rss feed (#126)

---
 blog.md | 18 ++++++++++++++++++
 rss.xml | 31 +++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 blog.md
 create mode 100644 rss.xml

diff --git a/blog.md b/blog.md
new file mode 100644
index 0000000..6cff0ff
--- /dev/null
+++ b/blog.md
@@ -0,0 +1,18 @@
+---
+layout: default
+permalink: /blog
+---
+
+<div class="blog archive">
+
+    <ul class="post-list">
+    {% for post in site.posts %}
+        <li>
+            <h2 class="post-title">
+                <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
+            </h2>
+        </li>
+    {% endfor %}
+    </ul>
+
+</div>
diff --git a/rss.xml b/rss.xml
new file mode 100644
index 0000000..c49c410
--- /dev/null
+++ b/rss.xml
@@ -0,0 +1,31 @@
+---
+layout: null
+permalink: /rss
+---
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>{{ site.title | xml_escape }}</title>
+    <description>{{ site.description | xml_escape }}</description>
+    <link>{{ site.url }}{{ site.baseurl }}/</link>
+    <atom:link href="{{ site.rss | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml"/>
+    <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
+    <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
+    <generator>Jekyll v{{ jekyll.version }}</generator>
+    {% for post in site.posts limit:10 %}
+      <item>
+        <title>{{ post.title | xml_escape }}</title>
+        <description>{{ post.content | xml_escape }}</description>
+        <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
+        <link>{{ post.url | prepend: site.baseurl | prepend: site.url }}</link>
+        <guid isPermaLink="true">{{ post.url | prepend: site.baseurl | prepend: site.url }}</guid>
+        {% for tag in post.tags %}
+        <category>{{ tag | xml_escape }}</category>
+        {% endfor %}
+        {% for cat in post.categories %}
+        <category>{{ cat | xml_escape }}</category>
+        {% endfor %}
+      </item>
+    {% endfor %}
+  </channel>
+</rss>

From 0f218ca4bb56f2e6333d6739cde1f0a93e88870b Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 5 Mar 2024 13:57:24 -0500
Subject: [PATCH 108/138] remove test post

---
 _posts/2021-04-29-is-this-thing-on.md | 8 --------
 1 file changed, 8 deletions(-)
 delete mode 100644 _posts/2021-04-29-is-this-thing-on.md

diff --git a/_posts/2021-04-29-is-this-thing-on.md b/_posts/2021-04-29-is-this-thing-on.md
deleted file mode 100644
index 703ce24..0000000
--- a/_posts/2021-04-29-is-this-thing-on.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-layout: post
-title: "Testing... Is this thing on?"
----
-
-Bear with us, we're checking the lights and sound system.
-
-Eventually, this will be a functioning blog for hyper.rs. Once we figure out how it works.

From c01df2b62665e29c861cc82a612abf3d855a7a8f Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 6 Mar 2024 06:11:57 -0500
Subject: [PATCH 109/138] doc: update contrib docs (#127)

Co-authored-by: github-actions <github-actions@github.com>
---
 _contrib/maintainers.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
index 75cfd8f..7d3a7e0 100644
--- a/_contrib/maintainers.md
+++ b/_contrib/maintainers.md
@@ -10,7 +10,6 @@ To see what these roles do, and how to become one, look at [governance](./govern
 
 - Eray Karatay (@programatik29)
 - Oddbjørn Grødem (@oddgrd)
-- tottoto (@tottoto)
 
 ## Collaborators
 
@@ -24,6 +23,7 @@ To see what these roles do, and how to become one, look at [governance](./govern
 - Adam Foltzer (@acfoltzer)
 - Noah Kennedy (@Noah-Kennedy)
 - dswij (@dswij)
+- tottoto (@tottoto)
 
 <details>
 <summary>Emeriti</summary>

From 224579c82ea5916a8d39e9e1843107871e1689e7 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 8 Mar 2024 11:52:40 -0500
Subject: [PATCH 110/138] blog: welcome tottoto

---
 _posts/2024-03-08-welcome-tottoto.md | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 _posts/2024-03-08-welcome-tottoto.md

diff --git a/_posts/2024-03-08-welcome-tottoto.md b/_posts/2024-03-08-welcome-tottoto.md
new file mode 100644
index 0000000..bceaddf
--- /dev/null
+++ b/_posts/2024-03-08-welcome-tottoto.md
@@ -0,0 +1,11 @@
+---
+title: "Welcome tottoto"
+---
+
+We're priviledged to share that [@tottoto](https://github.com/tottoto)) is now a hyper Collaborator. tottoto has been cleaning up and refactoring in a big way:
+
+- [Improving the code quality and CI](https://github.com/hyperium/hyper/commits?author=tottoto)
+- [Thorough and kind reviews](https://github.com/hyperium/hyper/pull/3375)
+
+
+Thanks for proactively improving hyper all over!

From 92fa178661a4be2732e6228c6f9ec5c58c72f5dd Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 8 Mar 2024 12:12:22 -0500
Subject: [PATCH 111/138] blog: clean up a typo

---
 _posts/2024-03-04-welcome-dswij.md   | 2 +-
 _posts/2024-03-08-welcome-tottoto.md | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/_posts/2024-03-04-welcome-dswij.md b/_posts/2024-03-04-welcome-dswij.md
index 65ae4c3..aa78665 100644
--- a/_posts/2024-03-04-welcome-dswij.md
+++ b/_posts/2024-03-04-welcome-dswij.md
@@ -2,7 +2,7 @@
 title: "Welcome dswij"
 ---
 
-We're excited to announce that [@dswij](https://github.com/dswij)) is now a hyper Collaborator. dswij has been helping in a versatile way:
+We're excited to announce that [@dswij](https://github.com/dswij) is now a hyper Collaborator. dswij has been helping in a versatile way:
 
 - [Fixing a tricky h2 flow control hang](https://github.com/hyperium/h2/pull/730) (and a couple others)
 - [A guide to bringing your own runtime or using Tokio](https://github.com/hyperium/hyperium.github.io/pull/121)
diff --git a/_posts/2024-03-08-welcome-tottoto.md b/_posts/2024-03-08-welcome-tottoto.md
index bceaddf..e34be4b 100644
--- a/_posts/2024-03-08-welcome-tottoto.md
+++ b/_posts/2024-03-08-welcome-tottoto.md
@@ -2,7 +2,7 @@
 title: "Welcome tottoto"
 ---
 
-We're priviledged to share that [@tottoto](https://github.com/tottoto)) is now a hyper Collaborator. tottoto has been cleaning up and refactoring in a big way:
+We're priviledged to share that [@tottoto](https://github.com/tottoto) is now a hyper Collaborator. tottoto has been cleaning up and refactoring in a big way:
 
 - [Improving the code quality and CI](https://github.com/hyperium/hyper/commits?author=tottoto)
 - [Thorough and kind reviews](https://github.com/hyperium/hyper/pull/3375)

From 2d3bfe31c62a4ac4c52c08ac1e782c5c4366ba6e Mon Sep 17 00:00:00 2001
From: newbmiao <newbvirgil@gmail.com>
Date: Sat, 9 Mar 2024 11:09:06 +0800
Subject: [PATCH 112/138] guide: add server/middleware guide (#116)

---
 .github/workflows/check_guides.sh |   1 +
 _config.yml                       |   1 +
 _data/stable.yml                  |   1 +
 _stable/server/middleware.md      | 253 ++++++++++++++++++++++++++++++
 _stable/upgrading.md              |   2 +-
 5 files changed, 257 insertions(+), 1 deletion(-)
 create mode 100644 _stable/server/middleware.md

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index 2f5b795..afe109c 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -23,6 +23,7 @@ EOF
     tokio = { version = "1", features = ["full"] }
     http-body-util = "0.1"
     hyper-util = { version = "0.1", features = ["full"] }
+    tower = "0.4"
 EOF
             cargo build --manifest-path "$value/Cargo.toml"
         fi
diff --git a/_config.yml b/_config.yml
index f6d09e8..e76a62e 100644
--- a/_config.yml
+++ b/_config.yml
@@ -57,6 +57,7 @@ docs_url: https://docs.rs/hyper
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
 http_body_util_url: https://docs.rs/http-body-util
 hyper_tls_url: https://docs.rs/hyper-tls
+hyper_util_url: https://docs.rs/hyper-util
 
 futures_url: https://docs.rs/futures/0.3.*
 legacy_docs_url: https://docs.rs/hyper/0.14.*
diff --git a/_data/stable.yml b/_data/stable.yml
index 14398c6..2d55a68 100644
--- a/_data/stable.yml
+++ b/_data/stable.yml
@@ -17,6 +17,7 @@
   guides:
   - hello-world
   - echo
+  - middleware
 
 - title: Client
   path: "/client"
diff --git a/_stable/server/middleware.md b/_stable/server/middleware.md
new file mode 100644
index 0000000..badccde
--- /dev/null
+++ b/_stable/server/middleware.md
@@ -0,0 +1,253 @@
+---
+title: Getting Started with a Server Middleware
+layout: guide
+---
+
+As [Upgrade](upgrading) mentioned, hyper v1 does not depend on tower for the `Service` trait. When we want to add tower-like middleware, there are 2 kinds of approach to make it.
+
+Let's create a Logger middleware in [hello-world server](hello-world) for instance:
+
+Add tower dependency first
+
+```toml
+[dependencies]
+hyper = { version = "1", features = ["full"] }
+tokio = { version = "1", features = ["full"] }
+http-body-util = "0.1"
+hyper-util = { version = "0.1", features = ["full"] }
+tower = "0.4" # here
+```
+
+## Option 1: Use hyper Service trait
+
+Implement hyper Logger middleware
+
+```rust
+# extern crate hyper;
+use hyper::{Request, body::Incoming, service::Service};
+
+#[derive(Debug, Clone)]
+pub struct Logger<S> {
+    inner: S,
+}
+impl<S> Logger<S> {
+    pub fn new(inner: S) -> Self {
+        Logger { inner }
+    }
+}
+type Req = Request<Incoming>;
+
+impl<S> Service<Req> for Logger<S>
+where
+    S: Service<Req>,
+{
+    type Response = S::Response;
+    type Error = S::Error;
+    type Future = S::Future;
+    fn call(&self, req: Req) -> Self::Future {
+        println!("processing request: {} {}", req.method(), req.uri().path());
+        self.inner.call(req)
+    }
+}
+# fn main() {}
+```
+
+Then this can be used in server:
+
+```rust
+# extern crate tower;
+# extern crate hyper;
+# extern crate http_body_util;
+# extern crate tokio;
+# extern crate hyper_util;
+# mod no_run {
+use std::{convert::Infallible, net::SocketAddr};
+use hyper::{
+    service::Service,
+    body::{Bytes, Incoming},
+    server::conn::http1,
+    Request, Response,
+};
+use http_body_util::Full;
+use hyper_util::rt::TokioIo;
+use tokio::net::TcpListener;
+use tower::ServiceBuilder;
+
+# #[derive(Debug, Clone)]
+# pub struct Logger<S> {
+#     inner: S,
+# }
+# impl<S> Logger<S> {
+#    pub fn new(inner: S) -> Self {
+#        Logger { inner }
+#    }
+# }
+# type Req = Request<Incoming>;
+
+# impl<S> Service<Req> for Logger<S>
+# where
+#     S: Service<Req>,
+# {
+#     type Response = S::Response;
+#     type Error = S::Error;
+#     type Future = S::Future;
+#     fn call(&self, req: Req) -> Self::Future {
+#         println!("processing request: {} {}", req.method(), req.uri().path());
+#         self.inner.call(req)
+#     }
+# }
+async fn hello(_: Request<Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
+    Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
+}
+#[tokio::main]
+async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
+    let listener = TcpListener::bind(addr).await?;
+    loop {
+        let (stream, _) = listener.accept().await?;
+        let io = TokioIo::new(stream);
+        tokio::spawn(async move {
+            // N.B. should use hyper service_fn here, since it's required to be implemented hyper Service trait!
+            let svc = hyper::service::service_fn(hello);
+            let svc = ServiceBuilder::new().layer_fn(Logger::new).service(svc);
+            if let Err(err) = http1::Builder::new().serve_connection(io, svc).await {
+                eprintln!("server error: {}", err);
+            }
+        });
+    }
+}
+# }
+# fn main() {}
+```
+
+## Option 2: use hyper TowerToHyperService trait
+
+[hyper_util::service::TowerToHyperService](adapter-trait) trait is an adapter to convert tower Service to hyper Service.
+
+Now implement a tower Logger middleware
+
+```rust
+# extern crate tower;
+# extern crate hyper;
+use hyper::{Request, body::Incoming};
+use tower::Service;
+
+#[derive(Debug, Clone)]
+pub struct Logger<S> {
+    inner: S,
+}
+impl<S> Logger<S> {
+    pub fn new(inner: S) -> Self {
+        Logger { inner }
+    }
+}
+type Req = Request<Incoming>;
+impl<S> Service<Req> for Logger<S>
+where
+    S: Service<Req> + Clone,
+{
+    type Response = S::Response;
+
+    type Error = S::Error;
+
+    type Future = S::Future;
+
+    fn poll_ready(
+        &mut self,
+        cx: &mut std::task::Context<'_>,
+    ) -> std::task::Poll<Result<(), Self::Error>> {
+        self.inner.poll_ready(cx)
+    }
+
+    fn call(&mut self, req: Req) -> Self::Future {
+        println!("processing request: {} {}", req.method(), req.uri().path());
+        self.inner.call(req)
+    }
+}
+# fn main() {}
+```
+
+Then use it in the server:
+
+```rust
+# extern crate hyper;
+# extern crate http_body_util;
+# extern crate hyper_util;
+# extern crate tokio;
+# extern crate tower;
+# mod no_run {
+use std::{convert::Infallible, net::SocketAddr};
+
+use hyper::{
+    body::{Bytes, Incoming},
+    server::conn::http1,
+    Request, Response,
+};
+
+use http_body_util::Full;
+use hyper_util::{rt::TokioIo, service::TowerToHyperService};
+use tokio::net::TcpListener;
+use tower::{ServiceBuilder, Service};
+
+# #[derive(Debug, Clone)]
+# pub struct Logger<S> {
+#     inner: S,
+# }
+# impl<S> Logger<S> {
+#     pub fn new(inner: S) -> Self {
+#         Logger { inner }
+#     }
+# }
+# type Req = Request<Incoming>;
+# impl<S> Service<Req> for Logger<S>
+# where
+#     S: Service<Req> + Clone,
+# {
+#     type Response = S::Response;
+
+#     type Error = S::Error;
+
+#     type Future = S::Future;
+
+#     fn poll_ready(
+#         &mut self,
+#         cx: &mut std::task::Context<'_>,
+#     ) -> std::task::Poll<Result<(), Self::Error>> {
+#         self.inner.poll_ready(cx)
+#     }
+
+#     fn call(&mut self, req: Req) -> Self::Future {
+#         println!("processing request: {} {}", req.method(), req.uri().path());
+#         self.inner.call(req)
+#     }
+# }
+
+async fn hello(_: Request<Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
+    Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
+}
+#[tokio::main]
+async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
+    let listener = TcpListener::bind(addr).await?;
+    loop {
+        let (stream, _) = listener.accept().await?;
+        let io = TokioIo::new(stream);
+        tokio::spawn(async move {
+            // N.B. should use tower service_fn here, since it's reuqired to be implemented tower Service trait before convert to hyper Service!
+            let svc = tower::service_fn(hello);
+            let svc = ServiceBuilder::new().layer_fn(Logger::new).service(svc);
+            // Convert it to hyper service
+            let svc = TowerToHyperService::new(svc);
+            if let Err(err) = http1::Builder::new().serve_connection(io, svc).await {
+                eprintln!("server error: {}", err);
+            }
+        });
+    }
+}
+}
+# fn main() {}
+```
+
+[hellp-world]: {{ site.url }}/guides/1/server/hello-world/
+[upgrading]: {{ site.url }}/guides/1/upgrading/
+[adapter-trait]: {{ site.hyper_util_url }}/latest/hyper_util/service/struct.TowerToHyperService.html
\ No newline at end of file
diff --git a/_stable/upgrading.md b/_stable/upgrading.md
index 5a3a3c5..7bf3e0e 100644
--- a/_stable/upgrading.md
+++ b/_stable/upgrading.md
@@ -68,7 +68,7 @@ The listening server acceptor can be replaced with a simple loop.
 Previously, hyper depended on `tower` for the `Service` trait. Because
 `tower` is not yet 1.0, hyper could not publicly depend on it. So, it's
 `Service` trait and the helper function `service_fn` are defined in
-`hyper::service`.
+`hyper::service`. Check [middleware](https://hyper.rs/guides/1/server/middleware/) for more details.
 
 [changelog]: https://github.com/hyperium/hyper/blob/master/CHANGELOG.md#v100-2023-11-15
 [`hyper-util`]: https://crates.io/crates/hyper-util

From a87c5dc53bc00522cefa1b713cceef18724b6530 Mon Sep 17 00:00:00 2001
From: newbmiao <newbvirgil@gmail.com>
Date: Mon, 11 Mar 2024 14:58:33 +0800
Subject: [PATCH 113/138] fix: link ref in middleware (#129)

---
 _stable/server/middleware.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/_stable/server/middleware.md b/_stable/server/middleware.md
index badccde..b4a8f48 100644
--- a/_stable/server/middleware.md
+++ b/_stable/server/middleware.md
@@ -3,9 +3,9 @@ title: Getting Started with a Server Middleware
 layout: guide
 ---
 
-As [Upgrade](upgrading) mentioned, hyper v1 does not depend on tower for the `Service` trait. When we want to add tower-like middleware, there are 2 kinds of approach to make it.
+As [Upgrade][upgrading] mentioned, hyper v1 does not depend on tower for the `Service` trait. When we want to add tower-like middleware, there are 2 kinds of approach to make it.
 
-Let's create a Logger middleware in [hello-world server](hello-world) for instance:
+Let's create a Logger middleware in [hello-world server][hello-world] for instance:
 
 Add tower dependency first
 
@@ -122,7 +122,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
 
 ## Option 2: use hyper TowerToHyperService trait
 
-[hyper_util::service::TowerToHyperService](adapter-trait) trait is an adapter to convert tower Service to hyper Service.
+[hyper_util::service::TowerToHyperService][adapter-trait] trait is an adapter to convert tower Service to hyper Service.
 
 Now implement a tower Logger middleware
 

From acca102e95688a372f22639a979f6e706ed0db5b Mon Sep 17 00:00:00 2001
From: Fabian Vilers <fabian.vilers@dev-one.com>
Date: Sun, 31 Mar 2024 09:37:11 +0200
Subject: [PATCH 114/138] Update hello-world.md

Use eprintln macro to display errors instead of println.
---
 _stable/server/hello-world.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_stable/server/hello-world.md b/_stable/server/hello-world.md
index 97839e6..d1bbf2a 100644
--- a/_stable/server/hello-world.md
+++ b/_stable/server/hello-world.md
@@ -115,7 +115,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
                 .serve_connection(io, service_fn(hello))
                 .await
             {
-                println!("Error serving connection: {:?}", err);
+                eprintln!("Error serving connection: {:?}", err);
             }
         });
     }

From 8c5fa9b3888d0d9b6c6b3c01d7bfc3a467ccd235 Mon Sep 17 00:00:00 2001
From: dswijj <dswijj@gmail.com>
Date: Mon, 1 Apr 2024 02:12:14 +0800
Subject: [PATCH 115/138] fix: docs url

---
 _config.yml                   |  9 +++++----
 _stable/server/hello-world.md | 10 +++++-----
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/_config.yml b/_config.yml
index e76a62e..e37df47 100644
--- a/_config.yml
+++ b/_config.yml
@@ -53,11 +53,12 @@ relative_links:
 plugins:
   - jekyll-redirect-from
 
-docs_url: https://docs.rs/hyper
+hyper_docs_url: https://docs.rs/hyper/latest
 examples_url: https://github.com/hyperium/hyper/tree/master/examples
-http_body_util_url: https://docs.rs/http-body-util
-hyper_tls_url: https://docs.rs/hyper-tls
-hyper_util_url: https://docs.rs/hyper-util
+http_body_util_url: https://docs.rs/http-body-util/latest
+hyper_tls_url: https://docs.rs/hyper-tls/latest
+hyper_util_url: https://docs.rs/hyper-util/latest
+http_docs_url: https://docs.rs/http/latest
 
 futures_url: https://docs.rs/futures/0.3.*
 legacy_docs_url: https://docs.rs/hyper/0.14.*
diff --git a/_stable/server/hello-world.md b/_stable/server/hello-world.md
index d1bbf2a..e36bcf6 100644
--- a/_stable/server/hello-world.md
+++ b/_stable/server/hello-world.md
@@ -129,10 +129,10 @@ To see all the snippets put together, check out the [full example][example]!
 Also, if `service_fn` doesn't meet your requirements and you'd like to implement 
 `Service` yourself, see this [example][impl service].
 
-[service]: {{ site.docs_url }}/hyper/service/trait.Service.html
-[service_fn]: {{ site.docs_url }}/hyper/service/fn.service_fn.html
-[request]: {{ site.docs_url }}/hyper/struct.Request.html
-[response]: {{ site.docs_url }}/hyper/struct.Response.html
-[parts]: {{ site.docs_url }}/http/0.2.8/http/response/struct.Parts.html
+[service]: {{ site.hyper_docs_url }}/hyper/service/trait.Service.html
+[service_fn]: {{ site.hyper_docs_url }}/hyper/service/fn.service_fn.html
+[request]: {{ site.hyper_docs_url }}/hyper/struct.Request.html
+[response]: {{ site.hyper_docs_url }}/hyper/struct.Response.html
+[parts]: {{ site.http_docs_url }}/http/response/struct.Parts.html
 [example]: {{ site.examples_url }}/hello.rs
 [impl service]: {{ site.examples_url }}/service_struct_impl.rs

From 34aa13d2ebb5d648653b9edb3a7d353ef1657b8b Mon Sep 17 00:00:00 2001
From: alexbclay <alexbclay@gmail.com>
Date: Mon, 8 Apr 2024 21:16:31 -0400
Subject: [PATCH 116/138] fix: broken links (#134)

---
 _layouts/guide.html     |  2 +-
 _stable/client/basic.md | 12 ++++++------
 _stable/index.md        |  2 +-
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/_layouts/guide.html b/_layouts/guide.html
index dbd7eef..8f81cea 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -38,7 +38,7 @@ <h4 class="guide-links">
                 <a href="{{ site.legacy_docs_url }}">API Reference</a>
               {% elsif page.collection == "stable" %}
                 <a href="{{ site.examples_url }}/README.md">Additional Examples</a>
-                <a href="{{ site.docs_url }}">API Reference</a>
+                <a href="{{ site.hyper_docs_url }}">API Reference</a>
               {% endif %}
             </h4>
           </nav>
diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index 9c1fe8b..0de5e31 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -236,12 +236,12 @@ And that's it! You can see the [full example here][example].
 
 [Tokio]: https://tokio.rs
 [Tokio-Futures]: https://tokio.rs/tokio/tutorial/async
-[StatusCode]: {{ site.docs_url }}/hyper/struct.StatusCode.html
-[Response]: {{ site.docs_url }}/hyper/struct.Response.html
-[Request]: {{ site.docs_url }}/hyper/struct.Request.html
-[Connection]: {{ site.docs_url }}/hyper/client/conn/http1/struct.Connection.html
-[SendRequest]: {{ site.docs_url }}/hyper/client/conn/http1/struct.SendRequest.html
-[Frame]: {{ site.docs_url }}/hyper/body/struct.Frame.html
+[StatusCode]: {{ site.hyper_docs_url }}/hyper/struct.StatusCode.html
+[Response]: {{ site.hyper_docs_url }}/hyper/struct.Response.html
+[Request]: {{ site.hyper_docs_url }}/hyper/struct.Request.html
+[Connection]: {{ site.hyper_docs_url }}/hyper/client/conn/http1/struct.Connection.html
+[SendRequest]: {{ site.hyper_docs_url }}/hyper/client/conn/http1/struct.SendRequest.html
+[Frame]: {{ site.hyper_docs_url }}/hyper/body/struct.Frame.html
 [Empty]: {{ site.http_body_util_url }}/http_body_util/struct.Empty.html
 
 [example]: {{ site.examples_url }}/client.rs
diff --git a/_stable/index.md b/_stable/index.md
index 1e6f72f..557b926 100644
--- a/_stable/index.md
+++ b/_stable/index.md
@@ -16,6 +16,6 @@ setup](init/setup).
 
 You could also look at the [generated API documentaton][docs].
 
-[docs]: {{ site.docs_url }}
+[docs]: {{ site.hyper_docs_url }}
 [Server guide]: server/hello-world
 [Client guide]: client/basic

From b0b274cc2326fe14fbaa2f8abfd2b902e25e612e Mon Sep 17 00:00:00 2001
From: Vamshi krishna <vamshi9666@riseup.net>
Date: Mon, 6 May 2024 15:36:35 +0530
Subject: [PATCH 117/138] fix: broken link on setup (#135)

---------

Co-authored-by: dswij <dharmasw@outlook.com>
---
 _stable/init/setup.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/_stable/init/setup.md b/_stable/init/setup.md
index 609d49a..0226cf5 100644
--- a/_stable/init/setup.md
+++ b/_stable/init/setup.md
@@ -24,5 +24,5 @@ And with that, you're good to go! Depending on what you want to
 accomplish, you can move on to either the [client][] or [server][]
 guides.
 
-[client]: ../../client
-[server]: ../../server
+[client]: ../../client/basic
+[server]: ../../server/hello-world/

From 89995790a808cc52bdbaf7540ff718f5d56238d0 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 28 May 2024 10:34:18 -0400
Subject: [PATCH 118/138] add v1 graceful shutdown guide

---
 _data/stable.yml                    |   1 +
 _legacy/server/graceful-shutdown.md |   2 -
 _stable/server/graceful-shutdown.md | 114 ++++++++++++++++++++++++++++
 3 files changed, 115 insertions(+), 2 deletions(-)
 create mode 100644 _stable/server/graceful-shutdown.md

diff --git a/_data/stable.yml b/_data/stable.yml
index 2d55a68..3d299f1 100644
--- a/_data/stable.yml
+++ b/_data/stable.yml
@@ -18,6 +18,7 @@
   - hello-world
   - echo
   - middleware
+  - graceful-shutdown
 
 - title: Client
   path: "/client"
diff --git a/_legacy/server/graceful-shutdown.md b/_legacy/server/graceful-shutdown.md
index 1edcb90..0f02760 100644
--- a/_legacy/server/graceful-shutdown.md
+++ b/_legacy/server/graceful-shutdown.md
@@ -1,8 +1,6 @@
 ---
 title:  Gracefully Shutdown a Server
 layout: guide
-redirect_from: 
-    - /guides/server/graceful-shutdown
 ---
 
 hyper `Server`s have the ability to "gracefully" shutdown. This means stopping to accept new requests, and shutting down once all in-progress requests have completed.
diff --git a/_stable/server/graceful-shutdown.md b/_stable/server/graceful-shutdown.md
new file mode 100644
index 0000000..3c67cfe
--- /dev/null
+++ b/_stable/server/graceful-shutdown.md
@@ -0,0 +1,114 @@
+---
+title:  Gracefully Shutdown a Server
+layout: guide
+redirect_from:
+    - /guides/server/graceful-shutdown
+---
+
+hyper's server connections have the ability to initiate a graceful shutdown. A common desire is to coordinate graceful shutdown across all active connections. This is what we'll tackle in this guide.
+
+> A **graceful shutdown** is when a connection stops allowing _new_ requests, while allowing currently in-flight requests to complete.
+
+In order to do, we'll need several pieces:
+
+1. A signal for when to start the shutdown.
+2. An accept loop handling newly received connections.
+3. A watcher to coordinate the shutdown.
+
+## Determine a shutdown signal
+
+You can use any mechanism to signal that graceful shutdown should begin. That could be an process signal handler, a timer, a special HTTP request, or anything else.
+
+We're going to use a `CTRL+C` signal handler for this guide. Tokio has simple support for making one, let's try:
+
+```rust
+# extern crate tokio;
+async fn shutdown_signal() {
+    // Wait for the CTRL+C signal
+    tokio::signal::ctrl_c()
+        .await
+        .expect("failed to install CTRL+C signal handler");
+}
+# fn main() {}
+```
+
+## Modify your server accept loop
+
+> **Unstable**: The code discussed in this guide is in `hyper-util`,
+> which is not as stable as that which is in `hyper`. It is production
+> ready, but changes may come more frequently.
+
+We're assuming you have an accept loop for your server, similar to what was shown in the [Hello World](hello-world.md) guide. So, we're just going to modify it here:
+
+```rust
+# extern crate hyper;
+# extern crate http_body_util;
+# extern crate hyper_util;
+# extern crate tokio;
+# mod no_run {
+# use std::convert::Infallible;
+# use std::net::SocketAddr;
+#
+# use http_body_util::Full;
+# use hyper::body::Bytes;
+# use hyper::server::conn::http1;
+# use hyper::service::service_fn;
+# use hyper::{Request, Response};
+# use hyper_util::rt::TokioIo;
+# use tokio::net::TcpListener;
+# async fn shutdown_signal() {}
+# async fn hello(
+#     _: Request<hyper::body::Incoming>,
+# ) -> Result<Response<Full<Bytes>>, Infallible> {
+#     Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
+# }
+# async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+# let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
+let listener = TcpListener::bind(addr).await?;
+// specify our HTTP settings (http1, http2, auto all work)
+let mut http = http1::Builder::new();
+// the graceful watcher
+let graceful = hyper_util::server::graceful::GracefulShutdown::new();
+// when this signal completes, start shutdown
+let mut signal = std::pin::pin!(shutdown_signal());
+
+// Our server accept loop
+loop {
+    tokio::select! {
+        Ok((stream, _addr)) = listener.accept() => {
+            let io = TokioIo::new(stream);
+            let conn = http.serve_connection(io, service_fn(hello));
+            // watch this connection
+            let fut = graceful.watch(conn);
+            tokio::spawn(async move {
+                if let Err(e) = fut.await {
+                    eprintln!("Error serving connection: {:?}", e);
+                }
+            });
+        },
+
+        _ = &mut signal => {
+            eprintln!("graceful shutdown signal received");
+            // stop the accept loop
+            break;
+        }
+    }
+}
+
+// Now start the shutdown and wait for them to complete
+// Optional: start a timeout to limit how long to wait.
+
+tokio::select! {
+    _ = graceful.shutdown() => {
+        eprintln!("all connections gracefully closed");
+    },
+    _ = tokio::time::sleep(std::time::Duration::from_secs(10)) => {
+        eprintln!("timed out wait for all connections to close");
+    }
+}
+# Ok(())
+# }
+# }
+# fn main() {}
+```
+

From e1cc8f09ac07110a7937bfa9c327945724e8493e Mon Sep 17 00:00:00 2001
From: Huzaifa Malik <167966669+ExHuzaifa@users.noreply.github.com>
Date: Thu, 11 Jul 2024 14:18:56 -0700
Subject: [PATCH 119/138] refactor style of check_guides.sh (#138)

I didn't change the logic of the script, only the formatting and syntax. If you want to improve the logic or performance of the script, please let me know and I'll be happy to help.


Changes made:

- Added quotes around `$value` in various places to prevent word splitting and pathname expansion.
- Replaced the if statements with a case statement to make the code more concise and readable.
- Removed unnecessary semicolons at the end of lines.
- Used (( )) instead of [ ] for arithmetic operations.
- Used `$( )` instead of backticks for command substitution.
- Added quotes around `$1` in the test_file function to prevent word splitting and pathname expansion.
- Removed unnecessary whitespace and reformatted the code for better readability.
---
 .github/workflows/check_guides.sh | 86 ++++++++++++++++---------------
 1 file changed, 44 insertions(+), 42 deletions(-)

diff --git a/.github/workflows/check_guides.sh b/.github/workflows/check_guides.sh
index afe109c..db248d5 100755
--- a/.github/workflows/check_guides.sh
+++ b/.github/workflows/check_guides.sh
@@ -1,52 +1,54 @@
 #!/bin/sh
 
-for value in legacy stable
-do
-    if [ ! -e "$value/Cargo.toml" ]; then
-        if [ ! -d $value ]; then
-            cargo new $value
-        else
-            cargo init $value
-        fi
-        if [ $value = legacy ]; then
-            cat >> "$value/Cargo.toml" <<-EOF
-    futures = "0.3"
-    hyper = { version = "0.14", features = ["full"] }
-    hyper-tls = "0.5"
-    tokio = { version = "1", features = ["full"] }
+for value in legacy stable; do
+  if [ ! -e "$value/Cargo.toml" ]; then
+    if [ ! -d "$value" ]; then
+      cargo new "$value"
+    else
+      cargo init "$value"
+    fi
+
+    case "$value" in
+      legacy)
+        cat >> "$value/Cargo.toml" <<-EOF
+        [dependencies]
+        futures = "0.3"
+        hyper = { version = "0.14", features = ["full"] }
+        hyper-tls = "0.5"
+        tokio = { version = "1", features = ["full"] }
 EOF
-            cargo build --manifest-path "$value/Cargo.toml"
-        fi
-        if [ $value = stable ]; then
-            cat >> "$value/Cargo.toml" <<-EOF
-    hyper = { version = "1", features = ["full"] }
-    tokio = { version = "1", features = ["full"] }
-    http-body-util = "0.1"
-    hyper-util = { version = "0.1", features = ["full"] }
-    tower = "0.4"
+        ;;
+      stable)
+        cat >> "$value/Cargo.toml" <<-EOF
+        [dependencies]
+        hyper = { version = "1", features = ["full"] }
+        tokio = { version = "1", features = ["full"] }
+        http-body-util = "0.1"
+        hyper-util = { version = "0.1", features = ["full"] }
+        tower = "0.4"
 EOF
-            cargo build --manifest-path "$value/Cargo.toml"
-        fi
-    fi
+        ;;
+    esac
 
-    test_file() {
-        echo "Testing: $f"
-        rustdoc --edition 2021 --test $1 -L "$value/target/debug/deps"
-    }
+    cargo build --manifest-path "$value/Cargo.toml"
+  fi
 
-    if [ -n "$1" ]; then
-        test_file $1
-        exit $?
-    fi
+  test_file() {
+    echo "Testing: $1"
+    rustdoc --edition 2021 --test "$1" -L "$value/target/debug/deps"
+  }
+
+  if [ -n "$1" ]; then
+    test_file "$1"
+    exit $?
+  fi
 
-    status=0
-    for f in `git ls-files | grep "^_$value\/.*\.md$"`; do
-        test_file $f
-        s=$?
-        if [ "$s" != "0" ]; then
-            status=$s
-        fi
-    done
+  status=0
+  for f in $(git ls-files | grep "^_$value\/.*\.md$"); do
+    test_file "$f"
+    s=$?
+    ((status == 0)) && status=$s
+  done
 done
 
 exit $status

From 1126c63dd1ee90a6d05f83126373d831d5055fbf Mon Sep 17 00:00:00 2001
From: Anish Kanthamneni <akneni@gmail.com>
Date: Fri, 30 Aug 2024 18:08:33 -0400
Subject: [PATCH 120/138] docs(client): add POST request example to client
 guide (#140)

* docs(client): add POST request example to client guide

Add a new section to the "Getting Started with a Client" guide that
demonstrates how to make POST requests using hyper. The new section
includes examples for sending plain text, binary data, and JSON in
the request body, along with appropriate Content-Type headers.

This addition helps users understand how to construct and send POST
requests, complementing the existing GET request example.

* docs(client): move the POST request in the client guide to a new page
Add a new page to the "Getting Started with a Client" guide that
demonstrates how to make POST requests using hyper. The new section
includes examples for sending plain text, binary data, and JSON in
the request body, along with appropriate Content-Type headers.

This addition helps users understand how to construct and send POST
requests, complementing the existing GET request example.

* docs(client): move the POST request in the client
from `/client/advanced/` to `/client/post/`
---
 _stable/client/post.md | 77 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)
 create mode 100644 _stable/client/post.md

diff --git a/_stable/client/post.md b/_stable/client/post.md
new file mode 100644
index 0000000..789796d
--- /dev/null
+++ b/_stable/client/post.md
@@ -0,0 +1,77 @@
+---
+title: Post Request Guides
+layout: guide
+---
+
+## POST
+Now that we've seen how to make a GET request, let's look at how to make a POST request. This is useful when you need to send data to the server, such as when submitting a form or uploading a file.
+
+To make a POST request, we'll need to change a few things from our GET request:
+
+1. We'll set the method to POST.
+2. We'll need to provide a request body.
+3. We'll need to specify the type of data in our body by adding a `hyper::header::CONTENT_TYPE` header. 
+
+For the body, we have a couple of options. We can use a simple string, a JSON string, or we can use raw bytes. Let's look at all three:
+
+```rust
+# extern crate http_body_util;
+# extern crate hyper;
+# extern crate hyper_util;
+# extern crate tokio;
+# use http_body_util::Empty;
+# use hyper::body::Bytes;
+# use hyper::Request;
+# use hyper_util::rt::TokioIo;
+# use tokio::net::TcpStream;
+# async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+# let url = "http://httpbin.org/ip".parse::<hyper::Uri>()?;
+# let host = url.host().expect("uri has no host");
+# let port = url.port_u16().unwrap_or(80);
+# let addr = format!("{}:{}", host, port);
+# let stream = TcpStream::connect(addr).await?;
+# let io = TokioIo::new(stream);
+# let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await?;
+# tokio::task::spawn(async move {
+# if let Err(err) = conn.await {
+# println!("Connection failed: {:?}", err);
+# }
+# });
+
+// The authority of our URL will be the hostname of the httpbin remote
+let authority = url.authority().unwrap().clone();
+
+// For plain text
+let req_body = Full::<Bytes>::from("Some plain text as a body.");
+let req = Request::builder()
+    .method(hyper::Method::POST)
+    .header(hyper::header::HOST, authority.as_str())
+    .header(hyper::header::CONTENT_TYPE, "text/plain")
+    .body(req_body)?;
+
+// For JSON data
+let json_data = r#"{"key": "value"}"#;
+let req_body = Full::<Bytes>::from(json_data);
+let req = Request::builder()
+    .method(hyper::Method::POST)
+    .header(hyper::header::HOST, authority.as_str())
+    .header(hyper::header::CONTENT_TYPE, "application/json")
+    .body(req_body)?;
+
+// For binary data
+let binary_data = vec![0u8; 128]; // Example binary data
+let req_body = Full::<Bytes>::from(binary_data);
+let req = Request::builder()
+    .method(hyper::Method::POST)
+    .header(hyper::header::HOST, authority.as_str())
+    .header(hyper::header::CONTENT_TYPE, "application/octet-stream")
+    .body(req_body)?;
+
+
+let res = sender.send_request(req).await?;
+
+println!("Response status: {}", res.status());
+# Ok(())
+# }
+# fn main() {}
+```
\ No newline at end of file

From 62a6f6618ce531028d3e6250af55341db4b5999c Mon Sep 17 00:00:00 2001
From: Nihal T M <97780641+n1haldev@users.noreply.github.com>
Date: Mon, 23 Sep 2024 20:45:34 +0530
Subject: [PATCH 121/138] HTTP/2 server example (#139)

* add http2 server guide

* fix impl service link

* fixes after proofreading

* deleted http2 example md and added example to hello-world.md

* Implemented suggestions
---
 _stable/server/hello-world.md | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/_stable/server/hello-world.md b/_stable/server/hello-world.md
index e36bcf6..372a019 100644
--- a/_stable/server/hello-world.md
+++ b/_stable/server/hello-world.md
@@ -5,7 +5,7 @@ layout: guide
 
 Let's start by making a "Hello, World!" server, and expand from there.
 
-First we need to declare our dependencies, let's add the following to our `Cargo.toml`:
+First, we need to declare our dependencies, let's add the following to our `Cargo.toml`:
 
 ```toml
 [dependencies]
@@ -43,7 +43,7 @@ incoming requests. It represents an async function that takes a
 future is complete, it will resolve to a [`Response`][response] or an error.
 
 Hyper provides a utility for creating a `Service` from a function that should 
-serve most usecases: [`service_fn`][service_fn]. We will use this to create 
+serve most use cases: [`service_fn`][service_fn]. We will use this to create 
 a service from our `hello` function below when we're ready to start our 
 server.
 
@@ -67,7 +67,7 @@ set automatically.
 
 ## Starting the Server
 
-Lastly, we need to hook up our `hello` service into a running hyper server.
+Lastly, we need to hook up our `hello` service into a running Hyper server.
 
 We'll dive in to the specifics of some of these things in another guide.
 
@@ -129,10 +129,21 @@ To see all the snippets put together, check out the [full example][example]!
 Also, if `service_fn` doesn't meet your requirements and you'd like to implement 
 `Service` yourself, see this [example][impl service].
 
+## HTTP/2
+
+This example uses the `http1` module to create a server that speaks HTTP/1.
+In case you want to use HTTP/2, you can use the `http2` module with a few changes to the
+http1 server. The http2 builder requires an executor to run. Executor should implement the `hyper::rt::Executor` trait.
+
+To implement the Executor, check out the runtime [example][runtime].
+To see the full example with HTTP/2, check out the [full example][example_http2]!
+
 [service]: {{ site.hyper_docs_url }}/hyper/service/trait.Service.html
 [service_fn]: {{ site.hyper_docs_url }}/hyper/service/fn.service_fn.html
 [request]: {{ site.hyper_docs_url }}/hyper/struct.Request.html
 [response]: {{ site.hyper_docs_url }}/hyper/struct.Response.html
 [parts]: {{ site.http_docs_url }}/http/response/struct.Parts.html
 [example]: {{ site.examples_url }}/hello.rs
+[example_http2]: {{ site.examples_url }}/hello-http2.rs 
+[runtime]: ../init/runtime.md
 [impl service]: {{ site.examples_url }}/service_struct_impl.rs

From 75ed75ed1eb275496eeec63c7c15ec535e8f98f7 Mon Sep 17 00:00:00 2001
From: Esteban Borai <estebanborai@gmail.com>
Date: Wed, 2 Oct 2024 11:45:19 -0300
Subject: [PATCH 122/138] chore(docs): fix typo in middleware guide (#141)

* chore(docs): fix typo

* Update middleware.md
---
 _stable/server/middleware.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/_stable/server/middleware.md b/_stable/server/middleware.md
index b4a8f48..5df5887 100644
--- a/_stable/server/middleware.md
+++ b/_stable/server/middleware.md
@@ -233,7 +233,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
         let (stream, _) = listener.accept().await?;
         let io = TokioIo::new(stream);
         tokio::spawn(async move {
-            // N.B. should use tower service_fn here, since it's reuqired to be implemented tower Service trait before convert to hyper Service!
+            // N.B. should use tower service_fn here, since it's required to be implemented tower Service trait before convert to hyper Service!
             let svc = tower::service_fn(hello);
             let svc = ServiceBuilder::new().layer_fn(Logger::new).service(svc);
             // Convert it to hyper service
@@ -244,10 +244,10 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
         });
     }
 }
-}
+
 # fn main() {}
 ```
 
 [hellp-world]: {{ site.url }}/guides/1/server/hello-world/
 [upgrading]: {{ site.url }}/guides/1/upgrading/
-[adapter-trait]: {{ site.hyper_util_url }}/latest/hyper_util/service/struct.TowerToHyperService.html
\ No newline at end of file
+[adapter-trait]: {{ site.hyper_util_url }}/latest/hyper_util/service/struct.TowerToHyperService.html

From 347daf0deb5203ad9d6e152d558ff94aacaef7a2 Mon Sep 17 00:00:00 2001
From: Yotam Ofek <yotam.ofek@gmail.com>
Date: Sun, 20 Oct 2024 14:40:42 +0300
Subject: [PATCH 123/138] Fix typo in upgrading.md (#142)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

it's ➡️ its
---
 _stable/upgrading.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/_stable/upgrading.md b/_stable/upgrading.md
index 7bf3e0e..ca9a292 100644
--- a/_stable/upgrading.md
+++ b/_stable/upgrading.md
@@ -66,7 +66,7 @@ The listening server acceptor can be replaced with a simple loop.
 ## `Service`/`service_fn`
 
 Previously, hyper depended on `tower` for the `Service` trait. Because
-`tower` is not yet 1.0, hyper could not publicly depend on it. So, it's
+`tower` is not yet 1.0, hyper could not publicly depend on it. So, its
 `Service` trait and the helper function `service_fn` are defined in
 `hyper::service`. Check [middleware](https://hyper.rs/guides/1/server/middleware/) for more details.
 

From 77055ccf283004edde7bf880c98056e3927c5721 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Mon, 25 Nov 2024 16:07:53 -0500
Subject: [PATCH 124/138] add toc to guides

---
 _includes/toc.html  | 189 ++++++++++++++++++++++++++++++++++++++++++++
 _layouts/guide.html |  11 ++-
 css/main.scss       |   5 ++
 icons/hyper.svg     |   6 ++
 4 files changed, 208 insertions(+), 3 deletions(-)
 create mode 100644 _includes/toc.html
 create mode 100644 icons/hyper.svg

diff --git a/_includes/toc.html b/_includes/toc.html
new file mode 100644
index 0000000..bc90d08
--- /dev/null
+++ b/_includes/toc.html
@@ -0,0 +1,189 @@
+{% capture tocWorkspace %}
+    {% comment %}
+        Copyright (c) 2017 Vladimir "allejo" Jimenez
+
+        Permission is hereby granted, free of charge, to any person
+        obtaining a copy of this software and associated documentation
+        files (the "Software"), to deal in the Software without
+        restriction, including without limitation the rights to use,
+        copy, modify, merge, publish, distribute, sublicense, and/or sell
+        copies of the Software, and to permit persons to whom the
+        Software is furnished to do so, subject to the following
+        conditions:
+
+        The above copyright notice and this permission notice shall be
+        included in all copies or substantial portions of the Software.
+
+        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+        EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+        OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+        NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+        HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+        WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+        FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+        OTHER DEALINGS IN THE SOFTWARE.
+    {% endcomment %}
+    {% comment %}
+        Version 1.2.1
+          https://github.com/allejo/jekyll-toc
+
+        "...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
+
+        Usage:
+            {% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
+
+        Parameters:
+            * html         (string) - the HTML of compiled markdown generated by kramdown in Jekyll
+
+        Optional Parameters:
+            * sanitize      (bool)   : false  - when set to true, the headers will be stripped of any HTML in the TOC
+            * class         (string) :   ''   - a CSS class assigned to the TOC
+            * id            (string) :   ''   - an ID to assigned to the TOC
+            * h_min         (int)    :   1    - the minimum TOC header level to use; any header lower than this value will be ignored
+            * h_max         (int)    :   6    - the maximum TOC header level to use; any header greater than this value will be ignored
+            * ordered       (bool)   : false  - when set to true, an ordered list will be outputted instead of an unordered list
+            * item_class    (string) :   ''   - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level
+            * submenu_class (string) :   ''   - add custom class(es) for each child group of headings; has support for '%level%' placeholder which is the current "submenu" heading level
+            * base_url      (string) :   ''   - add a base url to the TOC links for when your TOC is on another page than the actual content
+            * anchor_class  (string) :   ''   - add custom class(es) for each anchor element
+            * skip_no_ids   (bool)   : false  - skip headers that do not have an `id` attribute
+            * flat_toc      (bool)   : false  - when set to true, the TOC will be a single level list
+
+        Output:
+            An ordered or unordered list representing the table of contents of a markdown block. This snippet will only
+            generate the table of contents and will NOT output the markdown given to it
+    {% endcomment %}
+
+    {% capture newline %}
+    {% endcapture %}
+    {% assign newline = newline | rstrip %} <!-- Remove the extra spacing but preserve the newline -->
+
+    {% capture deprecation_warnings %}{% endcapture %}
+
+    {% if include.baseurl %}
+        {% capture deprecation_warnings %}{{ deprecation_warnings }}<!-- jekyll-toc :: "baseurl" has been deprecated, use "base_url" instead -->{{ newline }}{% endcapture %}
+    {% endif %}
+
+    {% if include.skipNoIDs %}
+        {% capture deprecation_warnings %}{{ deprecation_warnings }}<!-- jekyll-toc :: "skipNoIDs" has been deprecated, use "skip_no_ids" instead -->{{ newline }}{% endcapture %}
+    {% endif %}
+
+    {% capture jekyll_toc %}{% endcapture %}
+    {% assign orderedList = include.ordered | default: false %}
+    {% assign flatToc = include.flat_toc | default: false %}
+    {% assign baseURL = include.base_url | default: include.baseurl | default: '' %}
+    {% assign skipNoIDs = include.skip_no_ids | default: include.skipNoIDs | default: false %}
+    {% assign minHeader = include.h_min | default: 1 %}
+    {% assign maxHeader = include.h_max | default: 6 %}
+    {% assign nodes = include.html | strip | split: '<h' %}
+
+    {% assign firstHeader = true %}
+    {% assign currLevel = 0 %}
+    {% assign lastLevel = 0 %}
+
+    {% capture listModifier %}{% if orderedList %}ol{% else %}ul{% endif %}{% endcapture %}
+
+    {% for node in nodes %}
+        {% if node == "" %}
+            {% continue %}
+        {% endif %}
+
+        {% assign currLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %}
+
+        {% if currLevel < minHeader or currLevel > maxHeader %}
+            {% continue %}
+        {% endif %}
+
+        {% assign _workspace = node | split: '</h' %}
+
+        {% assign _idWorkspace = _workspace[0] | split: 'id="' %}
+        {% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
+        {% assign htmlID = _idWorkspace[0] %}
+
+        {% assign _classWorkspace = _workspace[0] | split: 'class="' %}
+        {% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
+        {% assign htmlClass = _classWorkspace[0] %}
+
+        {% if htmlClass contains "no_toc" %}
+            {% continue %}
+        {% endif %}
+
+        {% if firstHeader %}
+            {% assign minHeader = currLevel %}
+        {% endif %}
+
+        {% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
+        {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
+
+        {% if include.item_class and include.item_class != blank %}
+            {% capture listItemClass %} class="{{ include.item_class | replace: '%level%', currLevel | split: '.' | join: ' ' }}"{% endcapture %}
+        {% endif %}
+
+        {% if include.submenu_class and include.submenu_class != blank %}
+            {% assign subMenuLevel = currLevel | minus: 1 %}
+            {% capture subMenuClass %} class="{{ include.submenu_class | replace: '%level%', subMenuLevel | split: '.' | join: ' ' }}"{% endcapture %}
+        {% endif %}
+
+        {% capture anchorBody %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %}
+
+        {% if htmlID %}
+            {% capture anchorAttributes %} href="{% if baseURL %}{{ baseURL }}{% endif %}#{{ htmlID }}"{% endcapture %}
+
+            {% if include.anchor_class %}
+                {% capture anchorAttributes %}{{ anchorAttributes }} class="{{ include.anchor_class | split: '.' | join: ' ' }}"{% endcapture %}
+            {% endif %}
+
+            {% capture listItem %}<a{{ anchorAttributes }}>{{ anchorBody }}</a>{% endcapture %}
+        {% elsif skipNoIDs == true %}
+            {% continue %}
+        {% else %}
+            {% capture listItem %}{{ anchorBody }}{% endcapture %}
+        {% endif %}
+
+        {% if currLevel > lastLevel and flatToc == false %}
+            {% capture jekyll_toc %}{{ jekyll_toc }}<{{ listModifier }}{{ subMenuClass }}>{% endcapture %}
+        {% elsif currLevel < lastLevel and flatToc == false %}
+            {% assign repeatCount = lastLevel | minus: currLevel %}
+
+            {% for i in (1..repeatCount) %}
+                {% capture jekyll_toc %}{{ jekyll_toc }}</li></{{ listModifier }}>{% endcapture %}
+            {% endfor %}
+
+            {% capture jekyll_toc %}{{ jekyll_toc }}</li>{% endcapture %}
+        {% else %}
+            {% capture jekyll_toc %}{{ jekyll_toc }}</li>{% endcapture %}
+        {% endif %}
+
+        {% capture jekyll_toc %}{{ jekyll_toc }}<li{{ listItemClass }}>{{ listItem }}{% endcapture %}
+
+        {% assign lastLevel = currLevel %}
+        {% assign firstHeader = false %}
+    {% endfor %}
+
+    {% if flatToc == true %}
+        {% assign repeatCount = 1 %}
+    {% else %}
+        {% assign repeatCount = minHeader | minus: 1 %}
+        {% assign repeatCount = lastLevel | minus: repeatCount %}
+    {% endif %}
+
+    {% for i in (1..repeatCount) %}
+        {% capture jekyll_toc %}{{ jekyll_toc }}</li></{{ listModifier }}>{% endcapture %}
+    {% endfor %}
+
+    {% if jekyll_toc != '' %}
+        {% assign rootAttributes = '' %}
+        {% if include.class and include.class != blank %}
+            {% capture rootAttributes %} class="{{ include.class | split: '.' | join: ' ' }}"{% endcapture %}
+        {% endif %}
+
+        {% if include.id and include.id != blank %}
+            {% capture rootAttributes %}{{ rootAttributes }} id="{{ include.id }}"{% endcapture %}
+        {% endif %}
+
+        {% if rootAttributes %}
+            {% assign nodes = jekyll_toc | split: '>' %}
+            {% capture jekyll_toc %}<{{ listModifier }}{{ rootAttributes }}>{{ nodes | shift | join: '>' }}>{% endcapture %}
+        {% endif %}
+    {% endif %}
+{% endcapture %}{% assign tocWorkspace = '' %}{{ deprecation_warnings }}{{ jekyll_toc -}}
diff --git a/_layouts/guide.html b/_layouts/guide.html
index 8f81cea..02bbe6e 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -43,10 +43,15 @@ <h4 class="guide-links">
             </h4>
           </nav>
         </aside>
-        <article class="col-lg-9 hyper-content">
-          {{ content }}
+        <main class="col-lg-9 row">
+          <article class="hyper-content col-lg-9">
+            {{ content }}
+          </article>
+          <aside class="toc col-lg-3">
+            {% include toc.html html=content %}
+          </aside>
           {% include guide_footer.html %}
-        </article>
+        </main>
       </div>
     </div>
 
diff --git a/css/main.scss b/css/main.scss
index 7aa34f4..7cfea99 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -197,6 +197,11 @@ h3 {
     color: $primary-dim-color;
 }
 
+// table of contents
+.toc {
+    display: none;
+}
+
 .hyper-footer {
     background: #f5f5f5;
     margin-top: 4rem;
diff --git a/icons/hyper.svg b/icons/hyper.svg
new file mode 100644
index 0000000..bf72cb1
--- /dev/null
+++ b/icons/hyper.svg
@@ -0,0 +1,6 @@
+<svg width="45" height="45" viewBox="0 0 45 45" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M36.3002 10.0998L37.1002 9.6998L38.1002 9.0998L36.9002 6.9998L35.9002 7.5998L34.3002 8.4998C32.5002 7.3998 30.5002 6.7998 28.3002 6.7998C21.8002 6.7998 16.5002 12.0998 16.5002 18.5998C16.5002 18.6998 16.5002 18.7998 16.5002 18.7998L10.2002 22.3998L9.2002 22.9998L10.4002 25.0998L11.4002 24.4998L16.8002 21.3998C17.0002 22.0998 17.2002 22.6998 17.5002 23.3998L10.3002 27.5998L9.3002 28.1998L10.5002 30.2998L11.5002 29.6998L18.7002 25.4998C19.1002 26.0998 19.6002 26.5998 20.1002 27.1998L19.5002 27.5998L18.5002 28.1998L17.5002 28.7998L10.3002 32.9998L9.3002 33.5998L10.5002 35.6998L11.5002 35.0998L18.7002 30.8998L19.7002 30.2998L20.7002 29.6998L22.2002 28.8998C24.0002 29.9998 26.1002 30.5998 28.3002 30.5998C34.8002 30.5998 40.1002 25.2998 40.1002 18.7998C40.0002 15.1998 38.6002 12.1998 36.3002 10.0998ZM28.3002 27.8998C27.0002 27.8998 25.8002 27.5998 24.7002 27.1998L27.9002 25.2998L28.9002 24.6998L27.7002 22.5998L26.7002 23.1998L22.3002 25.6998C21.7002 25.1998 21.2002 24.6998 20.8002 24.0998L26.6002 20.7998C26.0002 20.2998 25.5002 19.5998 25.5002 18.6998L19.7002 22.0998C19.2002 20.9998 19.0002 19.7998 19.0002 18.5998C19.0002 13.4998 23.1002 9.2998 28.3002 9.2998C29.5002 9.2998 30.7002 9.4998 31.8002 9.9998L28.8002 11.7998L27.8002 12.3998L29.0002 14.4998L30.0002 13.8998L34.2002 11.4998C34.7002 11.8998 35.2002 12.3998 35.7002 12.9998L29.9002 16.3998C30.6002 16.7998 31.1002 17.4998 31.2002 18.3998L37.0002 15.0998C37.5002 16.1998 37.8002 17.4998 37.8002 18.7998C37.5002 23.6998 33.4002 27.8998 28.3002 27.8998Z" fill="#F5A623"/>
+<path d="M6.8 27.8998C7.79411 27.8998 8.6 27.0939 8.6 26.0998C8.6 25.1057 7.79411 24.2998 6.8 24.2998C5.80589 24.2998 5 25.1057 5 26.0998C5 27.0939 5.80589 27.8998 6.8 27.8998Z" fill="#F5A623"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.8 34.5996C5.8 34.5996 5 35.3996 5 36.3996C5 37.3996 5.8 38.1996 6.8 38.1996C7.8 38.1996 8.6 37.3996 8.6 36.3996C8.5 35.3996 7.7 34.5996 6.8 34.5996Z" fill="#F5A623"/>
+<path d="M28.3 20.3998C29.2941 20.3998 30.1 19.5939 30.1 18.5998C30.1 17.6057 29.2941 16.7998 28.3 16.7998C27.3059 16.7998 26.5 17.6057 26.5 18.5998C26.5 19.5939 27.3059 20.3998 28.3 20.3998Z" fill="#F5A623"/>
+</svg>

From 4f38e0711ee780bad9e6e9b57f4c50852dd4b2bc Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Mon, 25 Nov 2024 16:22:50 -0500
Subject: [PATCH 125/138] toc styles

---
 css/main.scss | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/css/main.scss b/css/main.scss
index 7cfea99..20419b6 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -198,10 +198,21 @@ h3 {
 }
 
 // table of contents
-.toc {
-    display: none;
+
+.toc ul {
+    list-style: none;
+    padding-left: 0;
 }
 
+.toc ul li a {
+    color: #777;
+    display: block;
+    font-size: 90%;
+    padding: 0.25em 0;
+}
+
+// footer
+
 .hyper-footer {
     background: #f5f5f5;
     margin-top: 4rem;

From 9a01e7d597cec575d7a895682aff21f0e55f4027 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 26 Nov 2024 11:30:47 -0500
Subject: [PATCH 126/138] adjust header styles

---
 _layouts/guide.html |  2 +-
 css/main.scss       | 26 ++++++++++++++------------
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/_layouts/guide.html b/_layouts/guide.html
index 02bbe6e..e2f70c7 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -10,7 +10,7 @@
         <h1>{{ page.title }}</h1>
       </div>
     </div>
-    <div class="container">
+    <div class="container hyper-middle">
       <div class="row">
         <aside class="col-lg-3 hyper-sidebar">
           <nav>
diff --git a/css/main.scss b/css/main.scss
index 20419b6..8a8c460 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -66,15 +66,14 @@ blockquote {
 }
 
 .navbar-hyper {
+    background-color: $primary-pagehead-color;
     border: 0;
-    border-bottom: 1px solid #ee9107;
-    border-radius: 0;
     margin: 0;
     padding: 0;
 }
 
 #hyper .navbar a {
-    border-bottom: 5px solid #fff;
+    color: #eee;
     display: flex;
     flex-direction: column;
     justify-content: center;
@@ -92,7 +91,6 @@ blockquote {
 
 #hyper .navbar a:hover, #hyper .navbar a:focus {
     background: none;
-    border-color: $primary-highlight-color;
 }
 
 .navbar .navbar-brand {
@@ -188,6 +186,10 @@ blockquote {
     max-width: 700px;
 }
 
+.hyper-content h1 {
+    color: $primary-color;
+}
+
 .hyper-content h2 {
     color: $primary-color;
     margin: 2rem 0 1rem;
@@ -211,6 +213,10 @@ h3 {
     padding: 0.25em 0;
 }
 
+.toc li ul {
+    padding-left: 1em;
+}
+
 // footer
 
 .hyper-footer {
@@ -375,7 +381,6 @@ ul, ol {
 
 // row
 .row {
-    --bs-gutter-x: 30px;
 }
 
 // code
@@ -386,19 +391,14 @@ pre code {
 
 // navbar
 .navbar a {
-    color: $primary-color;
     transition: none;
 }
 
 .navbar a:hover, .navbar a:focus {
-    color: $primary-highlight-color;
+    color: #fff;
     text-decoration: none;
 }
 
-.navbar .navbar-brand {
-    color: $primary-color
-}
-
 .navbar .navbar-brand:hover {
     color: $primary-highlight-color
 }
@@ -414,4 +414,6 @@ pre code {
     font-size: 0.9rem;
 }
 
-
+.hyper-middle {
+    margin-top: 1rem;
+}

From 4903fada6861ff0fbc32465e09a5075686851b74 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 26 Nov 2024 11:45:29 -0500
Subject: [PATCH 127/138] more tweaks

---
 _layouts/guide.html | 6 +-----
 css/main.scss       | 3 +--
 2 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/_layouts/guide.html b/_layouts/guide.html
index e2f70c7..62ac4f0 100644
--- a/_layouts/guide.html
+++ b/_layouts/guide.html
@@ -5,11 +5,6 @@
   </head>
   <body id="hyper">
     {% include header.html %}
-    <div class="hyper-pageheader">
-      <div class="container">
-        <h1>{{ page.title }}</h1>
-      </div>
-    </div>
     <div class="container hyper-middle">
       <div class="row">
         <aside class="col-lg-3 hyper-sidebar">
@@ -45,6 +40,7 @@ <h4 class="guide-links">
         </aside>
         <main class="col-lg-9 row">
           <article class="hyper-content col-lg-9">
+            <h1 class="content-title">{{ page.title }}</h1>
             {{ content }}
           </article>
           <aside class="toc col-lg-3">
diff --git a/css/main.scss b/css/main.scss
index 8a8c460..e7e9c7e 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -73,7 +73,7 @@ blockquote {
 }
 
 #hyper .navbar a {
-    color: #eee;
+    color: #f5f5f5;
     display: flex;
     flex-direction: column;
     justify-content: center;
@@ -391,7 +391,6 @@ pre code {
 
 // navbar
 .navbar a {
-    transition: none;
 }
 
 .navbar a:hover, .navbar a:focus {

From 3244b4eb95848b4c78a4d84b5453aa7f6cd585a1 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 26 Nov 2024 15:43:15 -0500
Subject: [PATCH 128/138] update bootstrap; use logo

---
 _includes/footer.html |  4 +---
 _includes/head.html   |  4 ++--
 _includes/header.html |  4 +++-
 css/main.scss         | 17 +++++++++++++----
 4 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/_includes/footer.html b/_includes/footer.html
index 53e9c80..796fb8e 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -17,6 +17,4 @@
     </div>
 </footer>
 <script src="{{ "/js/rustdoc.js" | absolute_url }}"></script>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"
-    integrity="sha384-cuYeSxntonz0PPNlHhBs68uyIAVpIIOZZ5JqeqvYYIcEL727kskC66kF92t6Xl2V"
-    crossorigin="anonymous"></script>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
diff --git a/_includes/head.html b/_includes/head.html
index 6c54827..12d870c 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -3,10 +3,10 @@
 <title>{% if page.title %}{{ page.title }} | hyper{% else %}{{ site.title }}{% endif %}</title>
 <meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
 
-<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous">
+<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
 <link rel="stylesheet" href="{{ "/css/main.css" | absolute_url }}">
 
-<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
+<meta name="viewport" content="width=device-width, initial-scale=1">
 <!--[if lt IE 9]>
 <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
 <![endif]-->
diff --git a/_includes/header.html b/_includes/header.html
index 1f35fef..c144b9a 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -1,6 +1,8 @@
 <header class="navbar navbar-expand-lg navbar-hyper" role="navigation">
   <nav class="container">
-    <a class="navbar-brand" href="/">hyper.rs</a>
+    <a class="navbar-brand" href="/" title="hyper.rs">
+      <img src="/icons/hyper.svg" alt="hyper.rs" class="hyper-logo" />
+    </a>
     <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#hyperNavbar">
       <span class="navbar-toggler-icon"></span>
     </button>
diff --git a/css/main.scss b/css/main.scss
index e7e9c7e..88573a3 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -69,11 +69,11 @@ blockquote {
     background-color: $primary-pagehead-color;
     border: 0;
     margin: 0;
-    padding: 0;
+    padding: 0.5rem 0;
 }
 
 #hyper .navbar a {
-    color: #f5f5f5;
+    color: rgba(255,255,255,0.85);
     display: flex;
     flex-direction: column;
     justify-content: center;
@@ -398,8 +398,17 @@ pre code {
     text-decoration: none;
 }
 
+.navbar .hyper-logo {
+    background: #fff;
+    border-radius: 10px;
+}
+
+.navbar .navbar-brand {
+    transition: transform 0.2s ease-in-out;
+}
+
 .navbar .navbar-brand:hover {
-    color: $primary-highlight-color
+    transform: rotate(-5deg) scale(1.1);
 }
 
 .footnotes {
@@ -414,5 +423,5 @@ pre code {
 }
 
 .hyper-middle {
-    margin-top: 1rem;
+    margin-top: 2rem;
 }

From fd9759cafbf75faa41e6bbb36a4e9e2c7d38d737 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Tue, 26 Nov 2024 16:12:06 -0500
Subject: [PATCH 129/138] fix nav hover styles

---
 css/main.scss | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/css/main.scss b/css/main.scss
index 88573a3..a9e5929 100755
--- a/css/main.scss
+++ b/css/main.scss
@@ -72,7 +72,7 @@ blockquote {
     padding: 0.5rem 0;
 }
 
-#hyper .navbar a {
+.navbar a {
     color: rgba(255,255,255,0.85);
     display: flex;
     flex-direction: column;

From 62958c9fd8781a17129fa1b3ccc20166c01da19e Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Fri, 6 Dec 2024 14:58:27 -0500
Subject: [PATCH 130/138] adjust homepage column margins

---
 _layouts/home.html | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/_layouts/home.html b/_layouts/home.html
index c5767bf..fcaf0d0 100644
--- a/_layouts/home.html
+++ b/_layouts/home.html
@@ -14,7 +14,7 @@ <h1>hyper</h1>
     </section>
     <section class="container">
       <div class="row">
-        <div class="col-md-6">
+        <div class="col-md-6 mb-md-5">
           <h3>The HTTP implementation for Rust</h3>
           <ul>
               <li>A <strong>Client</strong> for talking to web services.</li>
@@ -24,33 +24,33 @@ <h3>The HTTP implementation for Rust</h3>
               <li>HTTP/1 and <strong>HTTP/2</strong> support.</li>
           </ul>
         </div>
-        <div class="col-md-6">
+        <div class="col-md-6 mb-md-5">
           <h3>Latest: 1.0 is out!</h3>
           <p><a href="https://seanmonstar.com/blog/hyper-v1">hyper v1.0 is here!</a></p>
         </div>
       </div>
       <div class="row">
-        <div class="col-md-6 col-lg-4">
+        <div class="col-md-6 col-lg-4 mb-md-5">
           <h3>Open</h3>
           <p>hyper is open source, always. The success of hyper depends on the health of the community building and using it. All contributions are in the open.</p>
         </div>
-        <div class="col-md-6 col-lg-4">
+        <div class="col-md-6 col-lg-4 mb-md-5">
           <h3>Correct</h3>
           <p>hyper is a memory safe and robust implementation of the HTTP specification. It is durable to the “real world”. Where feasible, hyper enforces correct usage.</p>
         </div>
-        <div class="col-md-6 col-lg-4">
+        <div class="col-md-6 col-lg-4 mb-md-5">
           <h3>Fast</h3>
           <p>A fast experience delights users. A faster network library means a faster application, resulting in delighting our users’ users. Whether with one request, or millions.</p>
         </div>
-        <div class="col-md-6 col-lg-4">
+        <div class="col-md-6 col-lg-4 mb-md-5">
           <h3>HTTP/*</h3>
           <p>hyper is specifically focused on HTTP. Support for HTTP/1 and HTTP/2, with HTTP/3 in the works.</p>
         </div>
-        <div class="col-md-6 col-lg-4">
+        <div class="col-md-6 col-lg-4 mb-md-5">
           <h3>Flexible</h3>
-          <p>hyper enables as many usecases as possible. It has no opinion on application structure, and makes few assumptions about its environment. This includes being portable to different operating systems.</p>
+          <p>hyper enables as many usecases as possible. It has no opinion on application structure, and makes few assumptions about its environment.</p>
         </div>
-        <div class="col-md-6 col-lg-4">
+        <div class="col-md-6 col-lg-4 mb-md-5">
           <h3>Understandable</h3>
           <p>hyper is no more complicated than it has to be. HTTP is not simple. It may not be as “easy” as 1-line to do everything, but it shouldn’t be “hard” to find the answers.</p>
         </div>

From 4612c47501c7e30fcd2918026ca1690a9025d64d Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 11 Dec 2024 08:47:48 -0500
Subject: [PATCH 131/138] update contrib import action

---
 .github/workflows/contrib.yml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/contrib.yml b/.github/workflows/contrib.yml
index 335b27d..164687d 100644
--- a/.github/workflows/contrib.yml
+++ b/.github/workflows/contrib.yml
@@ -7,7 +7,7 @@ on:
 permissions:
   contents: write # to update _contrib
   pull-requests: write # to send the updated _contrib PRs
-  
+
 jobs:
   update-contrib:
     name: Update _contrib
@@ -15,12 +15,12 @@ jobs:
 
     steps:
       - name: Checkout website
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           persist-credentials: false
 
       - name: Checkout hyper
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           persist-credentials: false
           repository: hyperium/hyper
@@ -96,11 +96,11 @@ jobs:
       - name: Lowercase filenames and replace underscores
         run: |
           for f in hyper/docs/*; do
-            mv -vn "$f" "$(echo "$f" | tr '[:upper:]' '[:lower:]' | tr '_' '-')"; 
+            mv -vn "$f" "$(echo '$f' | tr '[:upper:]' '[:lower:]' | tr '_' '-')";
           done
 
       - name: Copy the hyper docs to contrib
-        run: |  
+        run: |
           mkdir -p _contrib
           cp -a hyper/docs/. _contrib/
 

From 60ea9cbfdc4d050120f0dbd39a50b787c260093f Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 11 Dec 2024 08:52:46 -0500
Subject: [PATCH 132/138] ci: ignore when mv doesn't change a file

---
 .github/workflows/contrib.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/contrib.yml b/.github/workflows/contrib.yml
index 164687d..35bcc4a 100644
--- a/.github/workflows/contrib.yml
+++ b/.github/workflows/contrib.yml
@@ -96,7 +96,7 @@ jobs:
       - name: Lowercase filenames and replace underscores
         run: |
           for f in hyper/docs/*; do
-            mv -vn "$f" "$(echo '$f' | tr '[:upper:]' '[:lower:]' | tr '_' '-')";
+            mv -vn "$f" "$(echo \"$f\" | tr '[:upper:]' '[:lower:]' | tr '_' '-')" || true;
           done
 
       - name: Copy the hyper docs to contrib

From b06d335303e13be7c341c360444b8c100fad87c2 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Wed, 11 Dec 2024 08:56:01 -0500
Subject: [PATCH 133/138] ci: fix contrib rename step

---
 .github/workflows/contrib.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/contrib.yml b/.github/workflows/contrib.yml
index 35bcc4a..e6c5bd8 100644
--- a/.github/workflows/contrib.yml
+++ b/.github/workflows/contrib.yml
@@ -96,7 +96,7 @@ jobs:
       - name: Lowercase filenames and replace underscores
         run: |
           for f in hyper/docs/*; do
-            mv -vn "$f" "$(echo \"$f\" | tr '[:upper:]' '[:lower:]' | tr '_' '-')" || true;
+            mv -vn "$f" "$(echo "$f" | tr '[:upper:]' '[:lower:]' | tr '_' '-')" || true;
           done
 
       - name: Copy the hyper docs to contrib

From 978e01932033563ac60cb831eca80f9becd16d32 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 11 Dec 2024 08:58:15 -0500
Subject: [PATCH 134/138] doc: update contrib docs (#144)

Co-authored-by: github-actions <github-actions@github.com>
---
 _contrib/roadmap-1.0.md | 410 +++++++++++++++++++++++++++++++++++++
 _contrib/roadmap.md     | 443 +++++++---------------------------------
 2 files changed, 485 insertions(+), 368 deletions(-)
 create mode 100644 _contrib/roadmap-1.0.md

diff --git a/_contrib/roadmap-1.0.md b/_contrib/roadmap-1.0.md
new file mode 100644
index 0000000..492fd87
--- /dev/null
+++ b/_contrib/roadmap-1.0.md
@@ -0,0 +1,410 @@
+---
+title: hyper 1.0 Roadmap
+layout: guide
+hyper_path: docs/ROADMAP-1.0.md
+---
+
+> This was the roadmap to arrive at hyper v1.0. It is kept for historical purposes. See [roadmap](./roadmap.md) for the latest.
+
+## Goal
+
+Align current hyper to the [hyper vision][vision].
+
+The vision outlines a decision-making framework, use-cases, and general shape
+of hyper. This roadmap describes the currently known problems with hyper, and
+then shows what changes are needed to make hyper 1.0 look more like what is in
+the vision.
+
+## Known Issues
+
+
+> **Note**: These known issues are as of hyper v0.14.x. After v1.0 is released,
+ideally these issues will have been solved. Keeping this history may be helpful
+to Future Us, though.
+
+### Higher-level Client and Server problems
+
+Both the higher-level `Client` and `Server` types have stability concerns.
+
+For the `hyper::Server`:
+
+- The `Accept` trait is complex, and too easy to get wrong. If used with TLS, a slow TLS handshake
+  can affect all other new connections waiting for it to finish.
+- The `MakeService<&IO>` is confusing. The bounds are an assault on the eyes.
+- The `MakeService` API doesn't allow to easily annotate the HTTP connection with `tracing`.
+- Graceful shutdown doesn't give enough control.
+
+
+It's more common for people to simply use `hyper::server::conn` at this point,
+than to bother with the `hyper::Server`.
+
+While the `hyper::Client` is much easier to use, problems still exist:
+
+- The whole `Connect` design isn't stable.
+  - ALPN and proxies can provide surprising extra configuration of connections.
+  - Some `Connect` implementations may wish to view the path, in addition to the scheme, host, and port.
+  - Wants `runtime` feature
+- The Pool could be made more general or composable. At the same time, more customization is
+  desired, and it's not clear
+how to expose it yet.
+
+
+### Runtime woes
+
+hyper has been able to support different runtimes, but it has sometimes awkward
+default support for Tokio.
+
+- The `runtime` cargo-feature isn't additive
+- Built-in Tokio support can be confusing
+- Executors and Timers
+  - The `runtime` feature currently enables a few options that require a timer, such as timeouts and
+    keepalive intervals. It implicitly relies on Tokio's timer context. This can be quite confusing.
+- IO traits
+  - Should we publicly depend on Tokio's traits?
+  - `futures-io`?
+    - Definitely nope.
+    - Not stable. (0.3?)
+    - No uninitialized memory.
+  - Eventual `std` traits?
+    - They've been in design for years.
+    - We cannot base our schedule on them.
+    - When they are stable, we can:
+      - Provide a bridge in `hyper-util`.
+      - Consider a 2.0 of hyper.
+  - Define our own traits, provide util wrappers?
+
+### Forwards-compatibility
+
+There's a concern about forwards-compatibility. We want to be able to add
+support for new HTTP features without needing a new major version. While most
+of `http` and `hyper` are prepared for that, there's two potential problems.
+
+- New frames on an HTTP stream (body)
+   - Receiving a new frame type would require a new trait method
+     - There's no way to implement a "receive unknown frame" that hyper doesn't know about.
+   - Sending an unknown frame type would be even harder.
+     - Besides being able to pass an "unknown" type through the trait, the user would need to be
+       able to describe how that frame is encoded in HTTP/2/3.
+- New HTTP versions
+  - HTTP/3 will require a new transport abstraction. It's not as simple as just using some
+    `impl AsyncRead + AsyncWrite`. While HTTP/2 bundled the concept of stream creation internally,
+    and thus could be managed wholly on top of a read-write transport, HTTP/3 is different. Stream
+    creation is shifted to the QUIC protocol, and HTTP/3 needs to be able to use that directly.
+  - This means the existing `Connection` types for both client and server will not be able to
+    accept a QUIC transport so we can add HTTP/3 support.
+
+### Errors
+
+It's not easy to match for specific errors.
+
+The `Error::source()` can leak an internal dependency. For example, a
+`hyper::Error` may wrap an `h2::Error`. Users can downcast the source at
+runtime, and hyper internally changing the version of its `h2` dependency can
+cause runtime breakage for users.
+
+Formatting errors is in conflict with the current expected norm. The
+`fmt::Display` implementation for `hyper::Error` currently prints its own
+message, and then prints the message of any wrapped source error. The Errors
+Working Group currently recommends that errors only print their own message
+(link?). This conflict means that error "reporters", which crawl a source chain
+and print each error, has a lot of duplicated information.
+
+```
+error fetching website: error trying to connect: tcp connect error: Connection refused (os error 61)
+tcp connect error: Connection refused (os error 61)
+Connection refused (os error 61)
+```
+
+While there is a good reason for why hyper's `Error` types do this, at the very
+least, it _is_ unfortunate.
+
+### You call hyper, or hyper calls you?
+
+> Note: this problem space, of who calls whom, will be explored more deeply in
+> a future article.
+
+At times, it's been wondered whether hyper should call user code, or if user
+code should call hyper. For instance, should a `Service` be called with a
+request when the connection receives one, or should the user always poll for
+the next request.
+
+There's a similar question around sending a message body. Should hyper ask the
+body for more data to write, or should the user call a `write` method directly?
+
+These both get at a root topic about [write
+observability](https://github.com/hyperium/hyper/issues/2181). How do you know
+when a response, or when body data, has been written successfully? This is
+desirable for metrics, or for triggering other side-effects. 
+
+The `Service` trait also has some other frequently mentioned issues. Does
+`poll_ready` pull its complexity weight for servers? What about returning
+errors, what does that mean? Ideally users would turn all errors into
+appropriate `http::Response`s. But in HTTP/2 and beyond, stream errors are
+different from HTTP Server Error responses. Could the `Service::Error` type do
+more to encourage best practices?
+
+## Design
+
+The goal is to get hyper closer to the [vision][], using that to determine the
+best way to solve the known issues above. The main thrust of the proposed
+changes are to make hyper more **Flexible** and stable.
+
+In order to keep hyper **Understandable**, however, the proposed changes *must*
+be accompanied by providing utilities that solve the common usage patterns,
+documentation explaining how to use the more flexible pieces, and guides on how
+to reach for the `hyper-util`ity belt.
+
+The majority of the changes are smaller and can be contained to the *Public
+API* section, since they usually only apply to a single module or type. But the
+biggest changes are explained in detail here.
+
+### Split per HTTP version
+
+The existing `Connection` types, both for the client and server, abstract over
+HTTP version by requiring a generic `AsyncRead + AsyncWrite` transport type.
+But as we figure out HTTP/3, that needs to change. So to prepare now, the
+`Connection` types will be split up.
+
+For example, there will now be `hyper::server::conn::http1::Connection` and
+`hyper::server::conn::http2::Connection` types.
+
+These specific types will still have a very similar looking API that, as the
+vision describes, provides **Correct** connection management as it pertains to
+HTTP.
+
+There will be still be a type to wrap the different versions. It will no longer
+be generic over the transport type, to prepare for being able to wrap HTTP/3
+connections. Exactly how it will wrap, either by using internal trait objects,
+or an `enum Either` style, or using a `trait Connection` that each type
+implements, is something to be determined. It's likely that this "auto" type
+will start in `hyper-util`.
+
+### Focus on the `Connection` level
+
+As mentioned in the *Known Issues*, the higher-level `Client` and `Server` have
+stability and complexity problems. Therefore, for hyper 1.0, the main API will
+focus on the "lower-level" connection types. The `Client` and `Server` helpers
+will be moved to `hyper-util`.
+
+## Public API
+
+### body
+
+The `Body` struct is removed. Its internal "variants" are [separated into
+distinct types](https://github.com/hyperium/hyper/issues/2345), and can start
+in either `hyper-util` or `http-body-util`.
+
+The exported trait `HttpBody` is renamed to `Body`.
+
+A single `Body` implementation in `hyper` is the one provided by receiving
+client responses and server requests. It has the name `Streaming`.
+
+> **Unresolved**: Other names can be considered during implementation. Another
+> option is to not publicly name the implementation, but return `Response<impl
+Body>`s.
+
+The `Body` trait will be experimented on to see about making it possible to
+return more frame types beyonds just data and trailers.
+
+> **Unresolved**: What exactly this looks like will only be known after
+> experimentation.
+
+### client
+
+The high-level `hyper::Client` will be removed, along with the
+`hyper::client::connect` module. They will be explored more in `hyper-util`.
+
+As described in *Design*, the `client::conn` module will gain `http1` and
+`http2` sub-modules, providing per-version `SendRequest`, `Connection`, and
+`Builder` structs. An `auto` version can be explored in `hyper-util`.
+
+### error
+
+The `hyper::Error` struct remains in place.
+
+All errors returned from `Error::source()` are made opaque. They are wrapped an
+internal `Opaque` newtype that still allows printing, but prevents downcasting
+to the internal dependency.
+
+A new `hyper::error::Code` struct is defined. It is an opaque struct, with
+associated constants defining various code variants.
+
+> Alternative: define a non-exhaustive enum. It's not clear that this is
+> definitely better, though. Keeping it an opaque struct means we can add
+> secondary parts to the code in the future, or add bit flags, or similar
+> extensions.
+
+The purpose of `Code` is to provide an abstraction over the kind of error that
+is encountered. The `Code` could be some behavior noticed inside hyper, such as
+an incomplete HTTP message. Or it can be "translated" from the underlying
+protocol, if it defines protocol level errors. For example, an
+`h2::Reason::CANCEL`.
+
+### rt
+
+The `Executor` trait stays in here.
+
+Define a new trait `Timer`, which describes a way for users to provide a source
+of sleeping/timeout futures. Similar to `Executor`, a new generic is added to
+connection builders to provide a `Timer`.
+
+### server
+
+The higher-level `hyper::Server` struct, its related `Builder`, and the
+`Accept` trait are all removed.
+
+The `AddrStream` struct will be completely removed, as it provides no value but
+causes binary bloat.
+
+Similar to `client`, and as describe in the *Design*, the `conn` modules will
+be expanded to support `http1` and `http2` submodules. An `auto` version can be
+explored in `hyper-util`.
+
+### service
+
+A vendored and simplified `Service` trait will be explored.
+
+The error type for `Service`s used for a server will explore having the return
+type changed from any error to one that can become a `hyper::error::Code`.
+
+> **Unresolved**: Both of the above points are not set in stone. We will
+> explore and decide if they are the best outcome during development.
+
+The `MakeService` pieces will be removed.
+
+### Cargo Features
+
+Remove the `stream` feature. The `Stream` trait is not stable, and we cannot
+depend on an unstable API.
+
+Remove the `tcp` and `runtime` features. The automatic executor and timer parts
+are handled by providing implementations of `Executor` and `Timer`. The
+`connect` and `Accept` parts are also moving to `hyper-util`.
+
+### Public Dependencies
+
+- `http`
+- `http-body`
+- `bytes`
+
+Cannot be public while "unstable":
+
+- `tracing`
+
+## `hyper-util`
+
+
+### body
+
+A channel implementation of `Body` that has an API to know when the data has
+been successfully written is provided in `hyper_util::body::channel`.
+
+### client
+
+A `Pool` struct that implements `Service` is provided. It fills a similar role
+as the previous `hyper::Client`.
+
+> **Note**: The `Pool` might be something that goes into the `tower` crate
+> instead. Or it might stay here as a slightly more specialized racing-connect
+> pool. We'll find out as we go.
+
+A `connect` submodule that mostly mirrors the existing `hyper::client::connect`
+module is moved here. Connectors can be used as a source to provide `Service`s
+used by the `Pool`.
+
+### rt
+
+We can provide Tokio-backed implementations of `Executor` and `Timer`.
+
+### server
+
+A `GracefulShutdown` helper is provided, to allow for similar style of graceful
+shutdown as the previous `hyper::Server` did, but with better control.
+
+# Appendix
+
+## Unresolved Questions
+
+There are some parts of the proposal which are not fully resolved. They are
+mentioned in Design and API sections above, but also collected here for easy
+finding. While they all have _plans_, they are more exploratory parts of the
+API, and thus they have a higher possibility of changing as we implement them.
+
+The goal is to have these questions resolved and removed from the document by
+the time there is a [Release Candidate][timeline].
+
+### Should there be `hyper::io` traits?
+
+Depending on `tokio` just for `AsyncRead` and `AsyncWrite` is convenient, but
+can be confusing for users integrating hyper with other runtimes. It also ties
+our version directly to Tokio. We can consider having vendored traits, and
+providing Tokio wrappers in `hyper-util`.
+
+### Should returned body types be `impl Body`?
+
+### How could the `Body` trait prepare for unknown frames?
+
+We will experiment with this, and keep track of those experiments in a
+dedicated issue. It might be possible to use something like this:
+
+```rust
+pub trait Body {
+    type Data;
+    fn poll_frame(..) -> Result<Option<Frame<Self::Data>>>;
+}
+
+pub struct Frame<T>(Kind<T>);
+
+enum Kind<T> {
+   Data(T),
+   Trailers(HeaderMap),
+   Unknown(Box<dyn FrameThingy>),
+}
+```
+
+### Should there be a simplified `hyper::Service` trait, or should hyper depend on `tower-service`?
+
+- There's still a few uncertain decisions around tower, such as if it should be
+  changed to `async fn call`, and if `poll_ready` is the best way to handle
+  backpressure.
+- It's not clear that the backpressure is something needed at the `Server`
+  boundary, thus meaning we should remove `poll_ready` from hyper.
+- It's not 100% clear if we should keep the service pattern, or use a
+  pull-based API. This will be explored in a future blog post.
+
+## FAQ
+
+### Why did you pick _that_ name? Why not this other better name?
+
+Naming is hard. We certainly should solve it, but discussion for particular
+names for structs and traits should be scoped to the specific issues. This
+document is to define the shape of the library API.
+
+### Should I publicly depend on `hyper-util`?
+
+The `hyper-util` crate will not reach 1.0 when `hyper` does. Some types and
+traits are being moved to `hyper-util`. As with any pre-1.0 crate, you _can_
+publicly depend on it, but it is explicitly less stable.
+
+In most cases, it's recommended to not publicly expose your dependency on
+`hyper-util`. If you depend on a trait, such as used by the moved higher-level
+`Client` or `Server`, it may be better for your users to define your own
+abstraction, and then make an internal adapter.
+
+### Isn't this making hyper harder?
+
+We are making hyper more **flexible**. As noted in the [vision][], most use
+cases of hyper require it to be flexible. That _can_ mean that the exposed API
+is lower level, and that it feels more complicated. It should still be
+**understandable**.
+
+But the hyper 1.0 effort is more than just the single `hyper` crate. Many
+useful helpers will be migrated to a `hyper-util` crate, and likely improved in
+the process. The [timeline][] also points out that we will have a significant
+documentation push. While the flexible pieces will be in hyper to compose how
+they need, we will also write guides for the [hyper.rs][] showing people how to
+accomplish the most common tasks.
+
+[timeline]: https://seanmonstar.com/post/676912131372875776/hyper-10-timeline
+[vision]: https://github.com/hyperium/hyper/pull/2772
+[hyper.rs]: https://hyper.rs
diff --git a/_contrib/roadmap.md b/_contrib/roadmap.md
index b23a6ec..081c392 100644
--- a/_contrib/roadmap.md
+++ b/_contrib/roadmap.md
@@ -1,408 +1,115 @@
 ---
-title: hyper 1.0 Roadmap
+title: Roadmap
 layout: guide
 hyper_path: docs/ROADMAP.md
 ---
 
 ## Goal
 
-Align current hyper to the [hyper vision][vision].
+Align current hyper to the [hyper vision](./vision.md).
 
 The vision outlines a decision-making framework, use-cases, and general shape
-of hyper. This roadmap describes the currently known problems with hyper, and
-then shows what changes are needed to make hyper 1.0 look more like what is in
-the vision.
-
-## Known Issues
-
-
-> **Note**: These known issues are as of hyper v0.14.x. After v1.0 is released,
-ideally these issues will have been solved. Keeping this history may be helpful
-to Future Us, though.
-
-### Higher-level Client and Server problems
-
-Both the higher-level `Client` and `Server` types have stability concerns.
-
-For the `hyper::Server`:
-
-- The `Accept` trait is complex, and too easy to get wrong. If used with TLS, a slow TLS handshake
-  can affect all other new connections waiting for it to finish.
-- The `MakeService<&IO>` is confusing. The bounds are an assault on the eyes.
-- The `MakeService` API doesn't allow to easily annotate the HTTP connection with `tracing`.
-- Graceful shutdown doesn't give enough control.
-
-
-It's more common for people to simply use `hyper::server::conn` at this point,
-than to bother with the `hyper::Server`.
-
-While the `hyper::Client` is much easier to use, problems still exist:
-
-- The whole `Connect` design isn't stable.
-  - ALPN and proxies can provide surprising extra configuration of connections.
-  - Some `Connect` implementations may wish to view the path, in addition to the scheme, host, and port.
-  - Wants `runtime` feature
-- The Pool could be made more general or composable. At the same time, more customization is
-  desired, and it's not clear
-how to expose it yet.
-
-
-### Runtime woes
-
-hyper has been able to support different runtimes, but it has sometimes awkward
-default support for Tokio.
-
-- The `runtime` cargo-feature isn't additive
-- Built-in Tokio support can be confusing
-- Executors and Timers
-  - The `runtime` feature currently enables a few options that require a timer, such as timeouts and
-    keepalive intervals. It implicitly relies on Tokio's timer context. This can be quite confusing.
-- IO traits
-  - Should we publicly depend on Tokio's traits?
-  - `futures-io`?
-    - Definitely nope.
-    - Not stable. (0.3?)
-    - No uninitialized memory.
-  - Eventual `std` traits?
-    - They've been in design for years.
-    - We cannot base our schedule on them.
-    - When they are stable, we can:
-      - Provide a bridge in `hyper-util`.
-      - Consider a 2.0 of hyper.
-  - Define our own traits, provide util wrappers?
-
-### Forwards-compatibility
-
-There's a concern about forwards-compatibility. We want to be able to add
-support for new HTTP features without needing a new major version. While most
-of `http` and `hyper` are prepared for that, there's two potential problems.
-
-- New frames on an HTTP stream (body)
-   - Receiving a new frame type would require a new trait method
-     - There's no way to implement a "receive unknown frame" that hyper doesn't know about.
-   - Sending an unknown frame type would be even harder.
-     - Besides being able to pass an "unknown" type through the trait, the user would need to be
-       able to describe how that frame is encoded in HTTP/2/3.
-- New HTTP versions
-  - HTTP/3 will require a new transport abstraction. It's not as simple as just using some
-    `impl AsyncRead + AsyncWrite`. While HTTP/2 bundled the concept of stream creation internally,
-    and thus could be managed wholly on top of a read-write transport, HTTP/3 is different. Stream
-    creation is shifted to the QUIC protocol, and HTTP/3 needs to be able to use that directly.
-  - This means the existing `Connection` types for both client and server will not be able to
-    accept a QUIC transport so we can add HTTP/3 support.
-
-### Errors
-
-It's not easy to match for specific errors.
+of hyper. This roadmap describes the focus areas to continue to improve hyper
+to look more like what is in the vision.
 
-The `Error::source()` can leak an internal dependency. For example, a
-`hyper::Error` may wrap an `h2::Error`. Users can downcast the source at
-runtime, and hyper internally changing the version of its `h2` dependency can
-cause runtime breakage for users.
+## Focus Areas
 
-Formatting errors is in conflict with the current expected norm. The
-`fmt::Display` implementation for `hyper::Error` currently prints its own
-message, and then prints the message of any wrapped source error. The Errors
-Working Group currently recommends that errors only print their own message
-(link?). This conflict means that error "reporters", which crawl a source chain
-and print each error, has a lot of duplicated information.
+While open source is not a company, open source can be guiding. We _can_ focus
+attention to specific areas of improvement, which are based on conversations
+with users, and prioritized by frequency and impact.
 
-```
-error fetching website: error trying to connect: tcp connect error: Connection refused (os error 61)
-tcp connect error: Connection refused (os error 61)
-Connection refused (os error 61)
-```
+To that end, the following 4 areas are current focus of the project:
 
-While there is a good reason for why hyper's `Error` types do this, at the very
-least, it _is_ unfortunate.
+1. Documentation
+2. `hyper-util`
+3. HTTP/3
+4. Observability
 
-### You call hyper, or hyper calls you?
+Each area benefits from having a top level description and goal, a place to
+track progress, and a champion (or two) that helps push the effort.
 
-> Note: this problem space, of who calls whom, will be explored more deeply in
-> a future article.
+### Documentation
 
-At times, it's been wondered whether hyper should call user code, or if user
-code should call hyper. For instance, should a `Service` be called with a
-request when the connection receives one, or should the user always poll for
-the next request.
+hyper has stabilized, so investing in documentation is wise! The way it is used
+won't change much, so documentation won't become outdated quickly. A tool that
+people don't know how to use isn't helpful at all. This helps hyper be
+**Understandable**.
 
-There's a similar question around sending a message body. Should hyper ask the
-body for more data to write, or should the user call a `write` method directly?
+The documentation focus area includes several different forms:
 
-These both get at a root topic about [write
-observability](https://github.com/hyperium/hyper/issues/2181). How do you know
-when a response, or when body data, has been written successfully? This is
-desirable for metrics, or for triggering other side-effects. 
-
-The `Service` trait also has some other frequently mentioned issues. Does
-`poll_ready` pull its complexity weight for servers? What about returning
-errors, what does that mean? Ideally users would turn all errors into
-appropriate `http::Response`s. But in HTTP/2 and beyond, stream errors are
-different from HTTP Server Error responses. Could the `Service::Error` type do
-more to encourage best practices?
-
-## Design
+- The API docs as a reference.
+- Examples as form of how-to.
+- Website guides as tutorials.
 
-The goal is to get hyper closer to the [vision][], using that to determine the
-best way to solve the known issues above. The main thrust of the proposed
-changes are to make hyper more **Flexible** and stable.
+Each of these could benefit from dedicated planning of their overall structure,
+editing the content that already exists, and creating the rest that is sorely
+missing.
 
-In order to keep hyper **Understandable**, however, the proposed changes *must*
-be accompanied by providing utilities that solve the common usage patterns,
-documentation explaining how to use the more flexible pieces, and guides on how
-to reach for the `hyper-util`ity belt.
+### hyper-util
 
-The majority of the changes are smaller and can be contained to the *Public
-API* section, since they usually only apply to a single module or type. But the
-biggest changes are explained in detail here.
+`hyper-util` serves two main purposes:
 
-### Split per HTTP version
+1. Provide useful patterns that build on top of hyper.
+2. Explore, stabilize, and graduate some of those patterns into hyper itself.
 
-The existing `Connection` types, both for the client and server, abstract over
-HTTP version by requiring a generic `AsyncRead + AsyncWrite` transport type.
-But as we figure out HTTP/3, that needs to change. So to prepare now, the
-`Connection` types will be split up.
+To that end, there are several new features that can be worked on and iterated
+on in `hyper-util` right now:
 
-For example, there will now be `hyper::server::conn::http1::Connection` and
-`hyper::server::conn::http2::Connection` types.
+- New design for a higher-level `Client`.
+- Breaking apart some patterns from `reqwest`, such as proxy helpers.
+- Server automatic version detection.
+- Improved builder patterns that make it easier to configure complicated
+  options.
 
-These specific types will still have a very similar looking API that, as the
-vision describes, provides **Correct** connection management as it pertains to
-HTTP.
+### HTTP/3
 
-There will be still be a type to wrap the different versions. It will no longer
-be generic over the transport type, to prepare for being able to wrap HTTP/3
-connections. Exactly how it will wrap, either by using internal trait objects,
-or an `enum Either` style, or using a `trait Connection` that each type
-implements, is something to be determined. It's likely that this "auto" type
-will start in `hyper-util`.
+hyper has an HTTP/3 crate, `h3`, that is generic over any QUIC implementation,
+similar to how hyper's HTTP/1 and HTTP/2 can be provided any IO transport. It
+supports much of HTTP/3 already, and interoperates with most other
+implementations. While some brave users have been trying it out the hard way
+(such as reqwest), it's time to bring HTTP/3 to more users.
 
-### Focus on the `Connection` level
+The aim is to eventually support `hyper::client::conn::http3` and
+`hyper::server::conn::http3`.
 
-As mentioned in the *Known Issues*, the higher-level `Client` and `Server` have
-stability and complexity problems. Therefore, for hyper 1.0, the main API will
-focus on the "lower-level" connection types. The `Client` and `Server` helpers
-will be moved to `hyper-util`.
+To do so, work is needed:
 
-## Public API
+- Harden the `h3` crate itself, such as fixing any straggling interop issues,
+  and filling out the spec conformance tags we use for accountability.
+- Proposal for (initially unstable) `hyper::rt::quic` integration, allowing
+  people to bring their own QUIC.
+- Write the `hyper::proto::http3` glue that translates hyper's connection
+  patterns with the `h3` crate.
 
-### body
+### Observability
 
-The `Body` struct is removed. Its internal "variants" are [separated into
-distinct types](https://github.com/hyperium/hyper/issues/2345), and can start
-in either `hyper-util` or `http-body-util`.
+It's extremely common once operating a service using hyper to want more
+visibility in what exactly is happening. It's important to realize that there
+are 3 concepts involved that frequently get conflated: events, tracing, and
+metrics.
 
-The exported trait `HttpBody` is renamed to `Body`.
+Some existing ways to get some of these:
 
-A single `Body` implementation in `hyper` is the one provided by receiving
-client responses and server requests. It has the name `Streaming`.
+- Unstable `tracing` integraton inside hyper.
+- `tower_http::trace` which instruments outside of hyper, using `Service` and
+  `Body`.
 
-> **Unresolved**: Other names can be considered during implementation. Another
-> option is to not publicly name the implementation, but return `Response<impl
-Body>`s.
+However, there are some events and metrics that are only known inside hyper,
+and having official, stable support would be very helpful.
 
-The `Body` trait will be experimented on to see about making it possible to
-return more frame types beyonds just data and trailers.
+Some potential options would be:
 
-> **Unresolved**: What exactly this looks like will only be known after
-> experimentation.
+- Stabilizing specific `tracing` events (blocked on the `tracing` crate
+  stabilizing...)
+- Provide a rudimentary, programmatic way to query metrics without another
+  crate.
+- Provide some sort of `hyper-metrics` helper.
 
-### client
+## Beyond
 
-The high-level `hyper::Client` will be removed, along with the
-`hyper::client::connect` module. They will be explored more in `hyper-util`.
+The above are focus areas that are the most frequently asked for, and so have
+the most attention. That doesn't mean that nothing else can be worked on.
 
-As described in *Design*, the `client::conn` module will gain `http1` and
-`http2` sub-modules, providing per-version `SendRequest`, `Connection`, and
-`Builder` structs. An `auto` version can be explored in `hyper-util`.
+Motivated individuals that want to help make other improvements are certainly
+welcome!
 
-### error
-
-The `hyper::Error` struct remains in place.
-
-All errors returned from `Error::source()` are made opaque. They are wrapped an
-internal `Opaque` newtype that still allows printing, but prevents downcasting
-to the internal dependency.
-
-A new `hyper::error::Code` struct is defined. It is an opaque struct, with
-associated constants defining various code variants.
-
-> Alternative: define a non-exhaustive enum. It's not clear that this is
-> definitely better, though. Keeping it an opaque struct means we can add
-> secondary parts to the code in the future, or add bit flags, or similar
-> extensions.
-
-The purpose of `Code` is to provide an abstraction over the kind of error that
-is encountered. The `Code` could be some behavior noticed inside hyper, such as
-an incomplete HTTP message. Or it can be "translated" from the underlying
-protocol, if it defines protocol level errors. For example, an
-`h2::Reason::CANCEL`.
-
-### rt
-
-The `Executor` trait stays in here.
-
-Define a new trait `Timer`, which describes a way for users to provide a source
-of sleeping/timeout futures. Similar to `Executor`, a new generic is added to
-connection builders to provide a `Timer`.
-
-### server
-
-The higher-level `hyper::Server` struct, its related `Builder`, and the
-`Accept` trait are all removed.
-
-The `AddrStream` struct will be completely removed, as it provides no value but
-causes binary bloat.
-
-Similar to `client`, and as describe in the *Design*, the `conn` modules will
-be expanded to support `http1` and `http2` submodules. An `auto` version can be
-explored in `hyper-util`.
-
-### service
-
-A vendored and simplified `Service` trait will be explored.
-
-The error type for `Service`s used for a server will explore having the return
-type changed from any error to one that can become a `hyper::error::Code`.
-
-> **Unresolved**: Both of the above points are not set in stone. We will
-> explore and decide if they are the best outcome during development.
-
-The `MakeService` pieces will be removed.
-
-### Cargo Features
-
-Remove the `stream` feature. The `Stream` trait is not stable, and we cannot
-depend on an unstable API.
-
-Remove the `tcp` and `runtime` features. The automatic executor and timer parts
-are handled by providing implementations of `Executor` and `Timer`. The
-`connect` and `Accept` parts are also moving to `hyper-util`.
-
-### Public Dependencies
-
-- `http`
-- `http-body`
-- `bytes`
-
-Cannot be public while "unstable":
-
-- `tracing`
-
-## `hyper-util`
-
-
-### body
-
-A channel implementation of `Body` that has an API to know when the data has
-been successfully written is provided in `hyper_util::body::channel`.
-
-### client
-
-A `Pool` struct that implements `Service` is provided. It fills a similar role
-as the previous `hyper::Client`.
-
-> **Note**: The `Pool` might be something that goes into the `tower` crate
-> instead. Or it might stay here as a slightly more specialized racing-connect
-> pool. We'll find out as we go.
-
-A `connect` submodule that mostly mirrors the existing `hyper::client::connect`
-module is moved here. Connectors can be used as a source to provide `Service`s
-used by the `Pool`.
-
-### rt
-
-We can provide Tokio-backed implementations of `Executor` and `Timer`.
-
-### server
-
-A `GracefulShutdown` helper is provided, to allow for similar style of graceful
-shutdown as the previous `hyper::Server` did, but with better control.
-
-# Appendix
-
-## Unresolved Questions
-
-There are some parts of the proposal which are not fully resolved. They are
-mentioned in Design and API sections above, but also collected here for easy
-finding. While they all have _plans_, they are more exploratory parts of the
-API, and thus they have a higher possibility of changing as we implement them.
-
-The goal is to have these questions resolved and removed from the document by
-the time there is a [Release Candidate][timeline].
-
-### Should there be `hyper::io` traits?
-
-Depending on `tokio` just for `AsyncRead` and `AsyncWrite` is convenient, but
-can be confusing for users integrating hyper with other runtimes. It also ties
-our version directly to Tokio. We can consider having vendored traits, and
-providing Tokio wrappers in `hyper-util`.
-
-### Should returned body types be `impl Body`?
-
-### How could the `Body` trait prepare for unknown frames?
-
-We will experiment with this, and keep track of those experiments in a
-dedicated issue. It might be possible to use something like this:
-
-```rust
-pub trait Body {
-    type Data;
-    fn poll_frame(..) -> Result<Option<Frame<Self::Data>>>;
-}
-
-pub struct Frame<T>(Kind<T>);
-
-enum Kind<T> {
-   Data(T),
-   Trailers(HeaderMap),
-   Unknown(Box<dyn FrameThingy>),
-}
-```
-
-### Should there be a simplified `hyper::Service` trait, or should hyper depend on `tower-service`?
-
-- There's still a few uncertain decisions around tower, such as if it should be
-  changed to `async fn call`, and if `poll_ready` is the best way to handle
-  backpressure.
-- It's not clear that the backpressure is something needed at the `Server`
-  boundary, thus meaning we should remove `poll_ready` from hyper.
-- It's not 100% clear if we should keep the service pattern, or use a
-  pull-based API. This will be explored in a future blog post.
-
-## FAQ
-
-### Why did you pick _that_ name? Why not this other better name?
-
-Naming is hard. We certainly should solve it, but discussion for particular
-names for structs and traits should be scoped to the specific issues. This
-document is to define the shape of the library API.
-
-### Should I publicly depend on `hyper-util`?
-
-The `hyper-util` crate will not reach 1.0 when `hyper` does. Some types and
-traits are being moved to `hyper-util`. As with any pre-1.0 crate, you _can_
-publicly depend on it, but it is explicitly less stable.
-
-In most cases, it's recommended to not publicly expose your dependency on
-`hyper-util`. If you depend on a trait, such as used by the moved higher-level
-`Client` or `Server`, it may be better for your users to define your own
-abstraction, and then make an internal adapter.
-
-### Isn't this making hyper harder?
-
-We are making hyper more **flexible**. As noted in the [vision][], most use
-cases of hyper require it to be flexible. That _can_ mean that the exposed API
-is lower level, and that it feels more complicated. It should still be
-**understandable**.
-
-But the hyper 1.0 effort is more than just the single `hyper` crate. Many
-useful helpers will be migrated to a `hyper-util` crate, and likely improved in
-the process. The [timeline][] also points out that we will have a significant
-documentation push. While the flexible pieces will be in hyper to compose how
-they need, we will also write guides for the [hyper.rs][] showing people how to
-accomplish the most common tasks.
-
-[timeline]: https://seanmonstar.com/post/676912131372875776/hyper-10-timeline
-[vision]: https://github.com/hyperium/hyper/pull/2772
-[hyper.rs]: https://hyper.rs

From 909f4b92cc720db68ec56fd349a19e3f74175c09 Mon Sep 17 00:00:00 2001
From: ZenTeaCC <36598604+Muffeter@users.noreply.github.com>
Date: Sat, 12 Apr 2025 18:31:46 +0800
Subject: [PATCH 135/138] Fix the missing url in basic.md (#145)

* Fix the missing url in basic.md

* Fix the missing url in basic.md
---
 _stable/client/basic.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/_stable/client/basic.md b/_stable/client/basic.md
index 0de5e31..2df22e0 100644
--- a/_stable/client/basic.md
+++ b/_stable/client/basic.md
@@ -237,8 +237,8 @@ And that's it! You can see the [full example here][example].
 [Tokio]: https://tokio.rs
 [Tokio-Futures]: https://tokio.rs/tokio/tutorial/async
 [StatusCode]: {{ site.hyper_docs_url }}/hyper/struct.StatusCode.html
-[Response]: {{ site.hyper_docs_url }}/hyper/struct.Response.html
-[Request]: {{ site.hyper_docs_url }}/hyper/struct.Request.html
+[Response]: {{ site.http_docs_url }}/http/response/struct.Response.html
+[Request]: {{ site.http_docs_url }}/http/request/struct.Request.html
 [Connection]: {{ site.hyper_docs_url }}/hyper/client/conn/http1/struct.Connection.html
 [SendRequest]: {{ site.hyper_docs_url }}/hyper/client/conn/http1/struct.SendRequest.html
 [Frame]: {{ site.hyper_docs_url }}/hyper/body/struct.Frame.html

From 6865c09b44dae8941051ee721d052d3b0c88157c Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean@seanmonstar.com>
Date: Mon, 21 Apr 2025 13:49:26 -0400
Subject: [PATCH 136/138] blog: welcome katelyn martin (#146)

---
 _posts/2025-04-21-welcome-katelyn-martin.md | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 _posts/2025-04-21-welcome-katelyn-martin.md

diff --git a/_posts/2025-04-21-welcome-katelyn-martin.md b/_posts/2025-04-21-welcome-katelyn-martin.md
new file mode 100644
index 0000000..d3b784e
--- /dev/null
+++ b/_posts/2025-04-21-welcome-katelyn-martin.md
@@ -0,0 +1,11 @@
+---
+title: "Welcome katelyn martin"
+---
+
+We're thrilled to welcome katelyn martin ([@cratelyn](https://github.com/cratelyn)) as a hyper Collaborator. katelyn first contributed back in 2020, and more recently has been improving various utilities and documentation. Some highlights:
+
+- [Implementing `http_body_util::Channel`](https://github.com/hyperium/http-body/pull/140) and `Fused`
+- [Adding new `hyper-util` additive IO adapters](https://github.com/hyperium/hyper-util/pull/170)
+- Kind reviews that are based on hyper's VISION.
+
+Thank you for helping the project and ecosystem!

From 76239b99b313875480e12385912f4f7234a7b484 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 22 Apr 2025 06:00:55 -0400
Subject: [PATCH 137/138] doc: update contrib docs (#147)

Co-authored-by: github-actions <github-actions@github.com>
---
 _contrib/maintainers.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/_contrib/maintainers.md b/_contrib/maintainers.md
index 7d3a7e0..317f524 100644
--- a/_contrib/maintainers.md
+++ b/_contrib/maintainers.md
@@ -24,6 +24,7 @@ To see what these roles do, and how to become one, look at [governance](./govern
 - Noah Kennedy (@Noah-Kennedy)
 - dswij (@dswij)
 - tottoto (@tottoto)
+- katelyn martin (@cratelyn)
 
 <details>
 <summary>Emeriti</summary>

From f65072a1a780236e568f812cb2cc3a13319d6326 Mon Sep 17 00:00:00 2001
From: fokx <36614441+fokx@users.noreply.github.com>
Date: Tue, 29 Apr 2025 21:27:24 +0800
Subject: [PATCH 138/138] fix example in graceful-shutdown.md: add
 `drop(listener)` (#148)

Need to drop the listener for the graceful shutdown to fully succeed. Otherwise, even though we cannot `curl` the server addr, `netstat` still shows the process listening. This will align the example with the hyper-util example in:
https://github.com/hyperium/hyper-util/blob/e74ab7888638e768de17c47ed5f20c8b623a308f/examples/server_graceful.rs#L47
---
 _stable/server/graceful-shutdown.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/_stable/server/graceful-shutdown.md b/_stable/server/graceful-shutdown.md
index 3c67cfe..f38f092 100644
--- a/_stable/server/graceful-shutdown.md
+++ b/_stable/server/graceful-shutdown.md
@@ -88,6 +88,7 @@ loop {
         },
 
         _ = &mut signal => {
+            drop(listener);
             eprintln!("graceful shutdown signal received");
             // stop the accept loop
             break;
