This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/apisix-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 15adc4a  Deploy to GitHub pages
15adc4a is described below

commit 15adc4ad725373c6487976ed04f5d64a40b7b444
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Dec 17 00:52:50 2020 +0000

    Deploy to GitHub pages
---
 2fa.html                                           |   2 +-
 2fa/index.html                                     |   2 +-
 blog/2020/08/22/new-website.html                   |   2 +-
 blog/2020/08/22/new-website/index.html             |   2 +-
 .../16/another-way-to-implement-envoy-filter.html  | 175 +++++++++++++++++++++
 .../index.html                                     | 175 +++++++++++++++++++++
 blog/atom.xml                                      |  13 +-
 blog/feed.xml                                      |   9 +-
 blog/index.html                                    |  98 +++++++++++-
 committer-guide.html                               |   2 +-
 committer-guide/index.html                         |   2 +-
 contributor-guide.html                             |   2 +-
 contributor-guide/index.html                       |   2 +-
 downloads.html                                     |   2 +-
 downloads/index.html                               |   2 +-
 release-guide.html                                 |   2 +-
 release-guide/index.html                           |   2 +-
 security.html                                      |   2 +-
 security/index.html                                |   2 +-
 sitemap.xml                                        |   2 +-
 subscribe-guide.html                               |   2 +-
 subscribe-guide/index.html                         |   2 +-
 team.html                                          |   2 +-
 team/index.html                                    |   2 +-
 24 files changed, 485 insertions(+), 23 deletions(-)

diff --git a/2fa.html b/2fa.html
index bc2bf19..7fe5a90 100644
--- a/2fa.html
+++ b/2fa.html
@@ -70,7 +70,7 @@
 <h2><a class="anchor" aria-hidden="true" id="how-to-submit-codes"></a><a 
href="#how-to-submit-codes" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
 <p>After enabling 2FA, you need to generate a private access Token to perform 
operations such as git submit and so on. At this time, you will use username + 
private access Token in replace of username + password to submit codes.</p>
 <p>For detailed operations, please refer to Create a Private Token.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/committer-guide"><span class="arrow-prev">← 
</span><span>Committer Guide</span></a><a class="docs-next button" 
href="/release-guide"><span>Release Guide</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#two-factor-authentication2fa">Two-factor aut 
[...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/committer-guide"><span class="arrow-prev">← 
</span><span>Committer Guide</span></a><a class="docs-next button" 
href="/release-guide"><span>Release Guide</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#two-factor-authentication2fa">Two-factor 
authenti [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/2fa/index.html b/2fa/index.html
index bc2bf19..7fe5a90 100644
--- a/2fa/index.html
+++ b/2fa/index.html
@@ -70,7 +70,7 @@
 <h2><a class="anchor" aria-hidden="true" id="how-to-submit-codes"></a><a 
href="#how-to-submit-codes" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
 <p>After enabling 2FA, you need to generate a private access Token to perform 
operations such as git submit and so on. At this time, you will use username + 
private access Token in replace of username + password to submit codes.</p>
 <p>For detailed operations, please refer to Create a Private Token.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/committer-guide"><span class="arrow-prev">← 
</span><span>Committer Guide</span></a><a class="docs-next button" 
href="/release-guide"><span>Release Guide</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#two-factor-authentication2fa">Two-factor aut 
[...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/committer-guide"><span class="arrow-prev">← 
</span><span>Committer Guide</span></a><a class="docs-next button" 
href="/release-guide"><span>Release Guide</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#two-factor-authentication2fa">Two-factor 
authenti [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/blog/2020/08/22/new-website.html b/blog/2020/08/22/new-website.html
index cce8259..5a6a9b0 100644
--- a/blog/2020/08/22/new-website.html
+++ b/blog/2020/08/22/new-website.html
@@ -4,7 +4,7 @@
             {"zIndex":100}
           )
         });
-        </script><script src="/js/scrollSpy.js"></script><link 
rel="stylesheet" href="/css/main.css"/><script 
src="/js/codetabs.js"></script></head><body class="sideNavVisible 
separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper 
wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache 
APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div 
class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul 
class="nav-site n [...]
+        </script><script src="/js/scrollSpy.js"></script><link 
rel="stylesheet" href="/css/main.css"/><script 
src="/js/codetabs.js"></script></head><body class="sideNavVisible 
separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper 
wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache 
APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div 
class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul 
class="nav-site n [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/blog/2020/08/22/new-website/index.html 
b/blog/2020/08/22/new-website/index.html
index cce8259..5a6a9b0 100644
--- a/blog/2020/08/22/new-website/index.html
+++ b/blog/2020/08/22/new-website/index.html
@@ -4,7 +4,7 @@
             {"zIndex":100}
           )
         });
-        </script><script src="/js/scrollSpy.js"></script><link 
rel="stylesheet" href="/css/main.css"/><script 
src="/js/codetabs.js"></script></head><body class="sideNavVisible 
separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper 
wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache 
APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div 
class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul 
class="nav-site n [...]
+        </script><script src="/js/scrollSpy.js"></script><link 
rel="stylesheet" href="/css/main.css"/><script 
src="/js/codetabs.js"></script></head><body class="sideNavVisible 
separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper 
wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache 
APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div 
class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul 
class="nav-site n [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/blog/2020/12/16/another-way-to-implement-envoy-filter.html 
b/blog/2020/12/16/another-way-to-implement-envoy-filter.html
new file mode 100644
index 0000000..20a6884
--- /dev/null
+++ b/blog/2020/12/16/another-way-to-implement-envoy-filter.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta 
http-equiv="X-UA-Compatible" content="IE=edge"/><title>Envoy and Apache APISIX: 
Another way to implement the Envoy filter · Apache APISIX™</title><meta 
name="viewport" content="width=device-width"/><meta name="generator" 
content="Docusaurus"/><meta name="description" content="&gt; 
[@nic-chen](https://github.com/nic-chen), Apache APISIX PMC from [Shenzhen 
Zhiliu Technology Co.](http://www.apiseven.com/)"/><meta name="docsea [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link 
rel="stylesheet" href="/css/main.css"/><script 
src="/js/codetabs.js"></script></head><body class="sideNavVisible 
separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper 
wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache 
APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div 
class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul 
class="nav-site n [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, 
className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer postContainer 
blogContainer"><div class="wrapper"><div class="lonePost"><div 
class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a 
href="/blog/2020/12/16/another-way-to-implement-envoy-filter">Envoy and Apache 
APISIX: Another way to implement the Envoy filter</a></h1><p 
class="post-meta">December 16, 2020</p><div class="authorBlock"><p 
class="post-authorName"><a href="https://github.com/nic-chen"; target="_b [...]
+<p><a href="https://github.com/nic-chen";>@nic-chen</a>, Apache APISIX PMC from 
<a href="http://www.apiseven.com/";>Shenzhen Zhiliu Technology Co.</a></p>
+<p>Source: <a 
href="https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter";>https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter</a></p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" 
id="ways-to-implement-envoy-filter"></a><a 
href="#ways-to-implement-envoy-filter" aria-hidden="true" 
class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" 
version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 
9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<h3><a class="anchor" aria-hidden="true" id="envoy-filter"></a><a 
href="#envoy-filter" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>Envoy is an L7 proxy and communication bus designed for large modern 
service oriented architectures.
+A pluggable filter chain mechanism allows filters to be written to perform 
different tasks and inserted into the main server.</p>
+<p><img src="https://static.apiseven.com/filters.png"; alt="Envoy filter"></p>
+<h3><a class="anchor" aria-hidden="true" id="expansion-method"></a><a 
href="#expansion-method" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>The existing filters may not meet the user's custom requirements. In this 
case, Envoy needs to be extended. Customize new filters according to the 
existing filter chain to achieve customization requirements.</p>
+<p>Developers can extend Envoy in three ways:</p>
+<table>
+<thead>
+<tr><th style="text-align:center"></th><th style="text-align:center">Getting 
Started difficulty</th><th style="text-align:center">stability</th><th 
style="text-align:center">development efficiency</th><th 
style="text-align:center">Deploy and compile</th></tr>
+</thead>
+<tbody>
+<tr><td style="text-align:center">C++</td><td 
style="text-align:center">high</td><td style="text-align:center">stable</td><td 
style="text-align:center">low</td><td style="text-align:center">long time to 
compile</td></tr>
+<tr><td style="text-align:center">Lua</td><td 
style="text-align:center">low</td><td style="text-align:center">stable</td><td 
style="text-align:center">High</td><td style="text-align:center">no need to 
compile, deploy directly</td></tr>
+<tr><td style="text-align:center">WASM</td><td 
style="text-align:center">high-medium</td><td style="text-align:center">on the 
fence</td><td style="text-align:center">depends on language</td><td 
style="text-align:center">compilation time depends on language</td></tr>
+</tbody>
+</table>
+<ol>
+<li>Using C++ to extend</li>
+</ol>
+<p>In this way, C++ code is written directly on the basis of Envoy for 
functional enhancement. After implementing a custom filter, the new binary file 
is recompiled to complete the upgrade. There are two problems with this way:</p>
+<ul>
+<li><p>Limited by the C++ language, difficulty of getting started, scarcity of 
developers.</p></li>
+<li><p>Increasing the complexity of deployment, operation and maintenance, and 
upgrades. Envoy will become heavier and heavier, and every change requires 
recompiling the binary file, which is not conducive to iteration and 
management.</p></li>
+</ul>
+<ol start="2">
+<li>Using Lua to extend</li>
+</ol>
+<p>Lua is born to be embedded in the application, so as to provide flexible 
extension and customization features for application, and is widely used.</p>
+<p>Lua Filter allows Lua scripts to be run in the request and response 
process. The main features currently supported include: inspection of headers, 
body, and trailers while streaming in either the request flow, response 
flow;modification of headers and trailers;blocking and buffering the full 
request/response body for inspection;performing an outbound async HTTP call to 
an upstream host;performing a direct response and skipping further filter 
iteration, etc.</p>
+<p>At present, many people directly distribute Lua code in configuration, 
which is not conducive to code organization and management, and it is difficult 
to share with others to form an ecosystem.</p>
+<ol start="3">
+<li>Using WASM extension</li>
+</ol>
+<p>Developers can write filters in their own programming language, compile 
them into WASM format using tools, and embed them into Envoy to run.</p>
+<p>It currently supports few languages, and using these languages ​​to extend 
is still not that simple. On the other hand, many people still have 
reservations about WASM and may not directly use it.</p>
+<h2><a class="anchor" aria-hidden="true" id="apache-apisix-solution"></a><a 
href="#apache-apisix-solution" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>Based on the above analysis, we could see that Lua is very suitable for 
extending Envoy, and it is easy to learn, and the development efficiency is 
extremely high. Because it is embedded in Envoy, there is no additional network 
overhead, and the performance is good.</p>
+<p><a href="https://github.com/apache/apisix";>Apache APISIX</a> community 
proposes its own solution based on Lua, which is to provide a powerful and 
flexible basic library to implement all plugins of Apache APISIX and plugins 
that will be developed in the future to run on Envoy. Developers could also 
develop their own customized plugins based on this basic library.</p>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway, based 
on the Nginx library and Lua. Apache APISIX provides rich traffic management 
features such as load balancing, dynamic upstream, canary release, circuit 
breaking, authentication, observability, and more.</p>
+<h3><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" 
aria-hidden="true" class="hash-link"><svg class="hash-link-icon" 
aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" 
width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 
3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 
5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 
2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Please check the repo for specific code and how to run: <a 
href="https://github.com/api7/envoy-apisix";>https://github.com/api7/envoy-apisix</a></p>
+<p>The relevant configuration of Envoy is as follows:</p>
+<p>Define a Filter:</p>
+<pre><code class="hljs css language-yaml"><span 
class="hljs-attr">http_filters:</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span 
class="hljs-string">entry.lua</span>
+  <span class="hljs-attr">typed_config:</span>
+    <span class="hljs-string">"@type"</span><span class="hljs-string">:</span> 
<span 
class="hljs-string">type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua</span>
+    <span class="hljs-attr">source_codes:</span>
+      <span class="hljs-attr">entry.lua:</span>
+        <span class="hljs-attr">filename:</span> <span 
class="hljs-string">/apisix/entry.lua</span>
+</code></pre>
+<p>Enable the Filter for a route and configure it with metadata:</p>
+<pre><code class="hljs css language-yaml"><span 
class="hljs-attr">routes:</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">match:</span>
+    <span class="hljs-attr">prefix:</span> <span 
class="hljs-string">"/foo"</span>
+  <span class="hljs-attr">route:</span>
+    <span class="hljs-attr">cluster:</span> <span 
class="hljs-string">web_service</span>
+  <span class="hljs-attr">typed_per_filter_config:</span>
+    <span class="hljs-attr">envoy.filters.http.lua:</span>
+      <span class="hljs-string">"@type"</span><span 
class="hljs-string">:</span> <span 
class="hljs-string">type.googleapis.com/envoy.extensions.filters.http.lua.v3.LuaPerRoute</span>
+      <span class="hljs-attr">name:</span> <span 
class="hljs-string">entry.lua</span>
+  <span class="hljs-attr">metadata:</span>
+    <span class="hljs-attr">filter_metadata:</span>
+      <span class="hljs-attr">envoy.filters.http.lua:</span>
+        <span class="hljs-attr">plugins:</span>
+        <span class="hljs-bullet">-</span> <span 
class="hljs-attr">name:</span> <span class="hljs-string">uri-blocker</span>
+          <span class="hljs-attr">conf:</span>
+            <span class="hljs-attr">rejected_code:</span> <span 
class="hljs-number">403</span>
+            <span class="hljs-attr">block_rules:</span>
+            <span class="hljs-bullet">-</span> <span 
class="hljs-string">root.exe</span>
+            <span class="hljs-bullet">-</span> <span 
class="hljs-string">root.m+</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="how-does-it-works"></a><a 
href="#how-does-it-works" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>We don't need to make major changes to Envoy, only some optimizations that 
are suitable for public needs.</p>
+<p>We shield platform differences for the plugin layer. All interfaces that 
need to be used are abstracted in the underlying framework, which we call 
apisix.core, so that all plugins can run on Envoy and Apache APISIX at the same 
time.</p>
+<p><img src="https://static.apiseven.com/main.png"; alt="Architecture 
diagram"></p>
+<p>We use the previous example to show how the plugin runs:</p>
+<p><img src="https://static.apiseven.com/workflow.png"; alt="Plugin 
workflow"></p>
+<h4><a class="anchor" aria-hidden="true" 
id="first-step-read-configuration"></a><a href="#first-step-read-configuration" 
aria-hidden="true" class="hash-link"><svg class="hash-link-icon" 
aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" 
width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 
3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 
5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 
2.5S13.98 12  [...]
+<p>We configure through metadata to determine what plugins need to run on each 
route and what configuration is for each plugin.
+In the example, we configured plugin <code>uri-blocker</code> for the route 
whose prefix is ​​<code>/foo</code>, as well as the block rule of the plugin 
and the response status when a block is required.</p>
+<h4><a class="anchor" aria-hidden="true" id="second-step-parse-request"></a><a 
href="#second-step-parse-request" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>We encapsulated the client request data into <code>ctx</code> so that it 
can be used directly in the entire process.</p>
+<h4><a class="anchor" aria-hidden="true" id="third-step-run-the-plugin"></a><a 
href="#third-step-run-the-plugin" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>We determine whether we need to block this request by matching the 
configured rules and the obtained uri. If a block is needed, we call 
<code>respond</code> to directly respond, otherwise we let it go.</p>
+<h2><a class="anchor" aria-hidden="true" id="future-outlook"></a><a 
href="#future-outlook" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>More and more APISIX plugins are available to run on Envoy, and finally all 
APISIX plugins (Even that will be developed in the future) will be available to 
run on Envoy.</p>
+<p>At the same time, we hope that we could work with the Envoy community in 
the direction of Lua Filter, optimize and improve Lua Filter, enhance the 
expansion capabilities of Envoy, and reduce the difficulty of Envoy 
expansion.</p>
+</span></div></div><div class="blogSocialSection"></div></div><div 
class="blog-recent"><a class="button" href="/blog/">Recent 
Posts</a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#ways-to-implement-envoy-filter">Ways to 
implement Envoy filter</a><ul class="toc-headings"><li><a 
href="#envoy-filter">Envoy filter</a></li><li><a 
href="#expansion-method">Expansion method</a></li></ul></li><li><a 
href="#apache-apisix-solution">Apache APISIX solution</a><ul cl [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = 
document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                appId: 'ZHVP417Y1Y',
+                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
+                indexName: 'apache-apisix-website',
+                inputSelector: '#search_input_react'
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/blog/2020/12/16/another-way-to-implement-envoy-filter/index.html 
b/blog/2020/12/16/another-way-to-implement-envoy-filter/index.html
new file mode 100644
index 0000000..20a6884
--- /dev/null
+++ b/blog/2020/12/16/another-way-to-implement-envoy-filter/index.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta 
http-equiv="X-UA-Compatible" content="IE=edge"/><title>Envoy and Apache APISIX: 
Another way to implement the Envoy filter · Apache APISIX™</title><meta 
name="viewport" content="width=device-width"/><meta name="generator" 
content="Docusaurus"/><meta name="description" content="&gt; 
[@nic-chen](https://github.com/nic-chen), Apache APISIX PMC from [Shenzhen 
Zhiliu Technology Co.](http://www.apiseven.com/)"/><meta name="docsea [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link 
rel="stylesheet" href="/css/main.css"/><script 
src="/js/codetabs.js"></script></head><body class="sideNavVisible 
separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper 
wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache 
APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div 
class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul 
class="nav-site n [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, 
className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer postContainer 
blogContainer"><div class="wrapper"><div class="lonePost"><div 
class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a 
href="/blog/2020/12/16/another-way-to-implement-envoy-filter">Envoy and Apache 
APISIX: Another way to implement the Envoy filter</a></h1><p 
class="post-meta">December 16, 2020</p><div class="authorBlock"><p 
class="post-authorName"><a href="https://github.com/nic-chen"; target="_b [...]
+<p><a href="https://github.com/nic-chen";>@nic-chen</a>, Apache APISIX PMC from 
<a href="http://www.apiseven.com/";>Shenzhen Zhiliu Technology Co.</a></p>
+<p>Source: <a 
href="https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter";>https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter</a></p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" 
id="ways-to-implement-envoy-filter"></a><a 
href="#ways-to-implement-envoy-filter" aria-hidden="true" 
class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" 
version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 
9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<h3><a class="anchor" aria-hidden="true" id="envoy-filter"></a><a 
href="#envoy-filter" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>Envoy is an L7 proxy and communication bus designed for large modern 
service oriented architectures.
+A pluggable filter chain mechanism allows filters to be written to perform 
different tasks and inserted into the main server.</p>
+<p><img src="https://static.apiseven.com/filters.png"; alt="Envoy filter"></p>
+<h3><a class="anchor" aria-hidden="true" id="expansion-method"></a><a 
href="#expansion-method" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>The existing filters may not meet the user's custom requirements. In this 
case, Envoy needs to be extended. Customize new filters according to the 
existing filter chain to achieve customization requirements.</p>
+<p>Developers can extend Envoy in three ways:</p>
+<table>
+<thead>
+<tr><th style="text-align:center"></th><th style="text-align:center">Getting 
Started difficulty</th><th style="text-align:center">stability</th><th 
style="text-align:center">development efficiency</th><th 
style="text-align:center">Deploy and compile</th></tr>
+</thead>
+<tbody>
+<tr><td style="text-align:center">C++</td><td 
style="text-align:center">high</td><td style="text-align:center">stable</td><td 
style="text-align:center">low</td><td style="text-align:center">long time to 
compile</td></tr>
+<tr><td style="text-align:center">Lua</td><td 
style="text-align:center">low</td><td style="text-align:center">stable</td><td 
style="text-align:center">High</td><td style="text-align:center">no need to 
compile, deploy directly</td></tr>
+<tr><td style="text-align:center">WASM</td><td 
style="text-align:center">high-medium</td><td style="text-align:center">on the 
fence</td><td style="text-align:center">depends on language</td><td 
style="text-align:center">compilation time depends on language</td></tr>
+</tbody>
+</table>
+<ol>
+<li>Using C++ to extend</li>
+</ol>
+<p>In this way, C++ code is written directly on the basis of Envoy for 
functional enhancement. After implementing a custom filter, the new binary file 
is recompiled to complete the upgrade. There are two problems with this way:</p>
+<ul>
+<li><p>Limited by the C++ language, difficulty of getting started, scarcity of 
developers.</p></li>
+<li><p>Increasing the complexity of deployment, operation and maintenance, and 
upgrades. Envoy will become heavier and heavier, and every change requires 
recompiling the binary file, which is not conducive to iteration and 
management.</p></li>
+</ul>
+<ol start="2">
+<li>Using Lua to extend</li>
+</ol>
+<p>Lua is born to be embedded in the application, so as to provide flexible 
extension and customization features for application, and is widely used.</p>
+<p>Lua Filter allows Lua scripts to be run in the request and response 
process. The main features currently supported include: inspection of headers, 
body, and trailers while streaming in either the request flow, response 
flow;modification of headers and trailers;blocking and buffering the full 
request/response body for inspection;performing an outbound async HTTP call to 
an upstream host;performing a direct response and skipping further filter 
iteration, etc.</p>
+<p>At present, many people directly distribute Lua code in configuration, 
which is not conducive to code organization and management, and it is difficult 
to share with others to form an ecosystem.</p>
+<ol start="3">
+<li>Using WASM extension</li>
+</ol>
+<p>Developers can write filters in their own programming language, compile 
them into WASM format using tools, and embed them into Envoy to run.</p>
+<p>It currently supports few languages, and using these languages ​​to extend 
is still not that simple. On the other hand, many people still have 
reservations about WASM and may not directly use it.</p>
+<h2><a class="anchor" aria-hidden="true" id="apache-apisix-solution"></a><a 
href="#apache-apisix-solution" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>Based on the above analysis, we could see that Lua is very suitable for 
extending Envoy, and it is easy to learn, and the development efficiency is 
extremely high. Because it is embedded in Envoy, there is no additional network 
overhead, and the performance is good.</p>
+<p><a href="https://github.com/apache/apisix";>Apache APISIX</a> community 
proposes its own solution based on Lua, which is to provide a powerful and 
flexible basic library to implement all plugins of Apache APISIX and plugins 
that will be developed in the future to run on Envoy. Developers could also 
develop their own customized plugins based on this basic library.</p>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway, based 
on the Nginx library and Lua. Apache APISIX provides rich traffic management 
features such as load balancing, dynamic upstream, canary release, circuit 
breaking, authentication, observability, and more.</p>
+<h3><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" 
aria-hidden="true" class="hash-link"><svg class="hash-link-icon" 
aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" 
width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 
3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 
5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 
2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Please check the repo for specific code and how to run: <a 
href="https://github.com/api7/envoy-apisix";>https://github.com/api7/envoy-apisix</a></p>
+<p>The relevant configuration of Envoy is as follows:</p>
+<p>Define a Filter:</p>
+<pre><code class="hljs css language-yaml"><span 
class="hljs-attr">http_filters:</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span 
class="hljs-string">entry.lua</span>
+  <span class="hljs-attr">typed_config:</span>
+    <span class="hljs-string">"@type"</span><span class="hljs-string">:</span> 
<span 
class="hljs-string">type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua</span>
+    <span class="hljs-attr">source_codes:</span>
+      <span class="hljs-attr">entry.lua:</span>
+        <span class="hljs-attr">filename:</span> <span 
class="hljs-string">/apisix/entry.lua</span>
+</code></pre>
+<p>Enable the Filter for a route and configure it with metadata:</p>
+<pre><code class="hljs css language-yaml"><span 
class="hljs-attr">routes:</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">match:</span>
+    <span class="hljs-attr">prefix:</span> <span 
class="hljs-string">"/foo"</span>
+  <span class="hljs-attr">route:</span>
+    <span class="hljs-attr">cluster:</span> <span 
class="hljs-string">web_service</span>
+  <span class="hljs-attr">typed_per_filter_config:</span>
+    <span class="hljs-attr">envoy.filters.http.lua:</span>
+      <span class="hljs-string">"@type"</span><span 
class="hljs-string">:</span> <span 
class="hljs-string">type.googleapis.com/envoy.extensions.filters.http.lua.v3.LuaPerRoute</span>
+      <span class="hljs-attr">name:</span> <span 
class="hljs-string">entry.lua</span>
+  <span class="hljs-attr">metadata:</span>
+    <span class="hljs-attr">filter_metadata:</span>
+      <span class="hljs-attr">envoy.filters.http.lua:</span>
+        <span class="hljs-attr">plugins:</span>
+        <span class="hljs-bullet">-</span> <span 
class="hljs-attr">name:</span> <span class="hljs-string">uri-blocker</span>
+          <span class="hljs-attr">conf:</span>
+            <span class="hljs-attr">rejected_code:</span> <span 
class="hljs-number">403</span>
+            <span class="hljs-attr">block_rules:</span>
+            <span class="hljs-bullet">-</span> <span 
class="hljs-string">root.exe</span>
+            <span class="hljs-bullet">-</span> <span 
class="hljs-string">root.m+</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="how-does-it-works"></a><a 
href="#how-does-it-works" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>We don't need to make major changes to Envoy, only some optimizations that 
are suitable for public needs.</p>
+<p>We shield platform differences for the plugin layer. All interfaces that 
need to be used are abstracted in the underlying framework, which we call 
apisix.core, so that all plugins can run on Envoy and Apache APISIX at the same 
time.</p>
+<p><img src="https://static.apiseven.com/main.png"; alt="Architecture 
diagram"></p>
+<p>We use the previous example to show how the plugin runs:</p>
+<p><img src="https://static.apiseven.com/workflow.png"; alt="Plugin 
workflow"></p>
+<h4><a class="anchor" aria-hidden="true" 
id="first-step-read-configuration"></a><a href="#first-step-read-configuration" 
aria-hidden="true" class="hash-link"><svg class="hash-link-icon" 
aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" 
width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 
3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 
5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 
2.5S13.98 12  [...]
+<p>We configure through metadata to determine what plugins need to run on each 
route and what configuration is for each plugin.
+In the example, we configured plugin <code>uri-blocker</code> for the route 
whose prefix is ​​<code>/foo</code>, as well as the block rule of the plugin 
and the response status when a block is required.</p>
+<h4><a class="anchor" aria-hidden="true" id="second-step-parse-request"></a><a 
href="#second-step-parse-request" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>We encapsulated the client request data into <code>ctx</code> so that it 
can be used directly in the entire process.</p>
+<h4><a class="anchor" aria-hidden="true" id="third-step-run-the-plugin"></a><a 
href="#third-step-run-the-plugin" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>We determine whether we need to block this request by matching the 
configured rules and the obtained uri. If a block is needed, we call 
<code>respond</code> to directly respond, otherwise we let it go.</p>
+<h2><a class="anchor" aria-hidden="true" id="future-outlook"></a><a 
href="#future-outlook" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>More and more APISIX plugins are available to run on Envoy, and finally all 
APISIX plugins (Even that will be developed in the future) will be available to 
run on Envoy.</p>
+<p>At the same time, we hope that we could work with the Envoy community in 
the direction of Lua Filter, optimize and improve Lua Filter, enhance the 
expansion capabilities of Envoy, and reduce the difficulty of Envoy 
expansion.</p>
+</span></div></div><div class="blogSocialSection"></div></div><div 
class="blog-recent"><a class="button" href="/blog/">Recent 
Posts</a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#ways-to-implement-envoy-filter">Ways to 
implement Envoy filter</a><ul class="toc-headings"><li><a 
href="#envoy-filter">Envoy filter</a></li><li><a 
href="#expansion-method">Expansion method</a></li></ul></li><li><a 
href="#apache-apisix-solution">Apache APISIX solution</a><ul cl [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = 
document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                appId: 'ZHVP417Y1Y',
+                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
+                indexName: 'apache-apisix-website',
+                inputSelector: '#search_input_react'
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/blog/atom.xml b/blog/atom.xml
index b5cb6f5..66dc02c 100644
--- a/blog/atom.xml
+++ b/blog/atom.xml
@@ -2,13 +2,24 @@
 <feed xmlns="http://www.w3.org/2005/Atom";>
     <id>https://apisix.apache.org//blog</id>
     <title>Apache APISIX™ Blog</title>
-    <updated>2020-08-22T06:00:00.000Z</updated>
+    <updated>2020-12-16T06:00:00.000Z</updated>
     <generator>https://github.com/jpmonette/feed</generator>
     <link rel="alternate" href="https://apisix.apache.org//blog"/>
     <subtitle>The best place to stay up-to-date with the latest Apache APISIX™ 
news and events.</subtitle>
     <logo>https://apisix.apache.org//img/logo.png</logo>
     <rights>Copyright © 2019-2020 The Apache Software Foundation. Apache 
APISIX, APISIX™, Apache, the Apache feather logo, and the Apache APISIX project 
logo are either registered trademarks or trademarks of the Apache Software 
Foundation.</rights>
     <entry>
+        <title type="html"><![CDATA[Envoy and Apache APISIX: Another way to 
implement the Envoy filter]]></title>
+        
<id>https://apisix.apache.org//blog/2020/12/16/another-way-to-implement-envoy-filter.html</id>
+        <link 
href="https://apisix.apache.org//blog/2020/12/16/another-way-to-implement-envoy-filter.html"/>
+        <updated>2020-12-16T06:00:00.000Z</updated>
+        <summary type="html"><![CDATA[<blockquote> <p><a 
href="https://github.com/nic-chen";>@nic-chen</a>, Apache APISIX PMC from <a 
href="http://www.apiseven.com/";>Shenzhen Zhiliu Technology Co.</a></p> 
<p>Source: <a 
href="https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter";>https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter</a></p>
 </blockquote> <h2><a class="anchor" aria-hidden="true" 
id="ways-to-implement-envoy-filter"></a><a href="#ways-to-impl [...]
+        <author>
+            <name>nic-chen</name>
+            <uri>https://github.com/nic-chen</uri>
+        </author>
+    </entry>
+    <entry>
         <title type="html"><![CDATA[New website for Apache APISIX]]></title>
         <id>https://apisix.apache.org//blog/2020/08/22/new-website.html</id>
         <link 
href="https://apisix.apache.org//blog/2020/08/22/new-website.html"/>
diff --git a/blog/feed.xml b/blog/feed.xml
index ee31771..3672798 100644
--- a/blog/feed.xml
+++ b/blog/feed.xml
@@ -4,7 +4,7 @@
         <title>Apache APISIX™ Blog</title>
         <link>https://apisix.apache.org//blog</link>
         <description>The best place to stay up-to-date with the latest Apache 
APISIX™ news and events.</description>
-        <lastBuildDate>Sat, 22 Aug 2020 06:00:00 GMT</lastBuildDate>
+        <lastBuildDate>Wed, 16 Dec 2020 06:00:00 GMT</lastBuildDate>
         <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
         <generator>https://github.com/jpmonette/feed</generator>
         <image>
@@ -14,6 +14,13 @@
         </image>
         <copyright>Copyright © 2019-2020 The Apache Software Foundation. 
Apache APISIX, APISIX™, Apache, the Apache feather logo, and the Apache APISIX 
project logo are either registered trademarks or trademarks of the Apache 
Software Foundation.</copyright>
         <item>
+            <title><![CDATA[Envoy and Apache APISIX: Another way to implement 
the Envoy filter]]></title>
+            
<link>https://apisix.apache.org//blog/2020/12/16/another-way-to-implement-envoy-filter.html</link>
+            
<guid>https://apisix.apache.org//blog/2020/12/16/another-way-to-implement-envoy-filter.html</guid>
+            <pubDate>Wed, 16 Dec 2020 06:00:00 GMT</pubDate>
+            <description><![CDATA[<blockquote> <p><a 
href="https://github.com/nic-chen";>@nic-chen</a>, Apache APISIX PMC from <a 
href="http://www.apiseven.com/";>Shenzhen Zhiliu Technology Co.</a></p> 
<p>Source: <a 
href="https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter";>https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter</a></p>
 </blockquote> <h2><a class="anchor" aria-hidden="true" 
id="ways-to-implement-envoy-filter"></a><a href="#ways-to-implemen [...]
+        </item>
+        <item>
             <title><![CDATA[New website for Apache APISIX]]></title>
             
<link>https://apisix.apache.org//blog/2020/08/22/new-website.html</link>
             
<guid>https://apisix.apache.org//blog/2020/08/22/new-website.html</guid>
diff --git a/blog/index.html b/blog/index.html
index 669453f..9b94152 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -4,7 +4,7 @@
             {"zIndex":100}
           )
         });
-        </script><script src="/js/scrollSpy.js"></script><link 
rel="stylesheet" href="/css/main.css"/><script 
src="/js/codetabs.js"></script></head><body class="blog"><div 
class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a 
href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 
class="headerTitleWithLogo">Apache APISIX™</h2></a><div 
class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul 
class="nav-site nav-site-internal"><li class= [...]
+        </script><script src="/js/scrollSpy.js"></script><link 
rel="stylesheet" href="/css/main.css"/><script 
src="/js/codetabs.js"></script></head><body class="blog"><div 
class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a 
href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 
class="headerTitleWithLogo">Apache APISIX™</h2></a><div 
class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul 
class="nav-site nav-site-internal"><li class= [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -60,7 +60,101 @@
                 };
               }
             });
-        </script></nav></div><div class="container mainContainer postContainer 
blogContainer"><div class="wrapper"><div class="posts"><div 
class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a 
href="/blog/2020/08/22/new-website">New website for Apache APISIX</a></h1><p 
class="post-meta">August 22, 2020</p><div class="authorBlock"><p 
class="post-authorName"><a href="https://github.com/juzhiyuan"; target="_blank" 
rel="noreferrer noopener">juzhiyuan</a></p><div class="author [...]
+        </script></nav></div><div class="container mainContainer postContainer 
blogContainer"><div class="wrapper"><div class="posts"><div 
class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a 
href="/blog/2020/12/16/another-way-to-implement-envoy-filter">Envoy and Apache 
APISIX: Another way to implement the Envoy filter</a></h1><p 
class="post-meta">December 16, 2020</p><div class="authorBlock"><p 
class="post-authorName"><a href="https://github.com/nic-chen"; target="_blan 
[...]
+<p><a href="https://github.com/nic-chen";>@nic-chen</a>, Apache APISIX PMC from 
<a href="http://www.apiseven.com/";>Shenzhen Zhiliu Technology Co.</a></p>
+<p>Source: <a 
href="https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter";>https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter</a></p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" 
id="ways-to-implement-envoy-filter"></a><a 
href="#ways-to-implement-envoy-filter" aria-hidden="true" 
class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" 
version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 
9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<h3><a class="anchor" aria-hidden="true" id="envoy-filter"></a><a 
href="#envoy-filter" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>Envoy is an L7 proxy and communication bus designed for large modern 
service oriented architectures.
+A pluggable filter chain mechanism allows filters to be written to perform 
different tasks and inserted into the main server.</p>
+<p><img src="https://static.apiseven.com/filters.png"; alt="Envoy filter"></p>
+<h3><a class="anchor" aria-hidden="true" id="expansion-method"></a><a 
href="#expansion-method" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>The existing filters may not meet the user's custom requirements. In this 
case, Envoy needs to be extended. Customize new filters according to the 
existing filter chain to achieve customization requirements.</p>
+<p>Developers can extend Envoy in three ways:</p>
+<table>
+<thead>
+<tr><th style="text-align:center"></th><th style="text-align:center">Getting 
Started difficulty</th><th style="text-align:center">stability</th><th 
style="text-align:center">development efficiency</th><th 
style="text-align:center">Deploy and compile</th></tr>
+</thead>
+<tbody>
+<tr><td style="text-align:center">C++</td><td 
style="text-align:center">high</td><td style="text-align:center">stable</td><td 
style="text-align:center">low</td><td style="text-align:center">long time to 
compile</td></tr>
+<tr><td style="text-align:center">Lua</td><td 
style="text-align:center">low</td><td style="text-align:center">stable</td><td 
style="text-align:center">High</td><td style="text-align:center">no need to 
compile, deploy directly</td></tr>
+<tr><td style="text-align:center">WASM</td><td 
style="text-align:center">high-medium</td><td style="text-align:center">on the 
fence</td><td style="text-align:center">depends on language</td><td 
style="text-align:center">compilation time depends on language</td></tr>
+</tbody>
+</table>
+<ol>
+<li>Using C++ to extend</li>
+</ol>
+<p>In this way, C++ code is written directly on the basis of Envoy for 
functional enhancement. After implementing a custom filter, the new binary file 
is recompiled to complete the upgrade. There are two problems with this way:</p>
+<ul>
+<li><p>Limited by the C++ language, difficulty of getting started, scarcity of 
developers.</p></li>
+<li><p>Increasing the complexity of deployment, operation and maintenance, and 
upgrades. Envoy will become heavier and heavier, and every change requires 
recompiling the binary file, which is not conducive to iteration and 
management.</p></li>
+</ul>
+<ol start="2">
+<li>Using Lua to extend</li>
+</ol>
+<p>Lua is born to be embedded in the application, so as to provide flexible 
extension and customization features for application, and is widely used.</p>
+<p>Lua Filter allows Lua scripts to be run in the request and response 
process. The main features currently supported include: inspection of headers, 
body, and trailers while streaming in either the request flow, response 
flow;modification of headers and trailers;blocking and buffering the full 
request/response body for inspection;performing an outbound async HTTP call to 
an upstream host;performing a direct response and skipping further filter 
iteration, etc.</p>
+<p>At present, many people directly distribute Lua code in configuration, 
which is not conducive to code organization and management, and it is difficult 
to share with others to form an ecosystem.</p>
+<ol start="3">
+<li>Using WASM extension</li>
+</ol>
+<p>Developers can write filters in their own programming language, compile 
them into WASM format using tools, and embed them into Envoy to run.</p>
+<p>It currently supports few languages, and using these languages ​​to extend 
is still not that simple. On the other hand, many people still have 
reservations about WASM and may not directly use it.</p>
+<h2><a class="anchor" aria-hidden="true" id="apache-apisix-solution"></a><a 
href="#apache-apisix-solution" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>Based on the above analysis, we could see that Lua is very suitable for 
extending Envoy, and it is easy to learn, and the development efficiency is 
extremely high. Because it is embedded in Envoy, there is no additional network 
overhead, and the performance is good.</p>
+<p><a href="https://github.com/apache/apisix";>Apache APISIX</a> community 
proposes its own solution based on Lua, which is to provide a powerful and 
flexible basic library to implement all plugins of Apache APISIX and plugins 
that will be developed in the future to run on Envoy. Developers could also 
develop their own customized plugins based on this basic library.</p>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway, based 
on the Nginx library and Lua. Apache APISIX provides rich traffic management 
features such as load balancing, dynamic upstream, canary release, circuit 
breaking, authentication, observability, and more.</p>
+<h3><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" 
aria-hidden="true" class="hash-link"><svg class="hash-link-icon" 
aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" 
width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 
3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 
5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 
2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Please check the repo for specific code and how to run: <a 
href="https://github.com/api7/envoy-apisix";>https://github.com/api7/envoy-apisix</a></p>
+<p>The relevant configuration of Envoy is as follows:</p>
+<p>Define a Filter:</p>
+<pre><code class="hljs css language-yaml"><span 
class="hljs-attr">http_filters:</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span 
class="hljs-string">entry.lua</span>
+  <span class="hljs-attr">typed_config:</span>
+    <span class="hljs-string">"@type"</span><span class="hljs-string">:</span> 
<span 
class="hljs-string">type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua</span>
+    <span class="hljs-attr">source_codes:</span>
+      <span class="hljs-attr">entry.lua:</span>
+        <span class="hljs-attr">filename:</span> <span 
class="hljs-string">/apisix/entry.lua</span>
+</code></pre>
+<p>Enable the Filter for a route and configure it with metadata:</p>
+<pre><code class="hljs css language-yaml"><span 
class="hljs-attr">routes:</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">match:</span>
+    <span class="hljs-attr">prefix:</span> <span 
class="hljs-string">"/foo"</span>
+  <span class="hljs-attr">route:</span>
+    <span class="hljs-attr">cluster:</span> <span 
class="hljs-string">web_service</span>
+  <span class="hljs-attr">typed_per_filter_config:</span>
+    <span class="hljs-attr">envoy.filters.http.lua:</span>
+      <span class="hljs-string">"@type"</span><span 
class="hljs-string">:</span> <span 
class="hljs-string">type.googleapis.com/envoy.extensions.filters.http.lua.v3.LuaPerRoute</span>
+      <span class="hljs-attr">name:</span> <span 
class="hljs-string">entry.lua</span>
+  <span class="hljs-attr">metadata:</span>
+    <span class="hljs-attr">filter_metadata:</span>
+      <span class="hljs-attr">envoy.filters.http.lua:</span>
+        <span class="hljs-attr">plugins:</span>
+        <span class="hljs-bullet">-</span> <span 
class="hljs-attr">name:</span> <span class="hljs-string">uri-blocker</span>
+          <span class="hljs-attr">conf:</span>
+            <span class="hljs-attr">rejected_code:</span> <span 
class="hljs-number">403</span>
+            <span class="hljs-attr">block_rules:</span>
+            <span class="hljs-bullet">-</span> <span 
class="hljs-string">root.exe</span>
+            <span class="hljs-bullet">-</span> <span 
class="hljs-string">root.m+</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="how-does-it-works"></a><a 
href="#how-does-it-works" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>We don't need to make major changes to Envoy, only some optimizations that 
are suitable for public needs.</p>
+<p>We shield platform differences for the plugin layer. All interfaces that 
need to be used are abstracted in the underlying framework, which we call 
apisix.core, so that all plugins can run on Envoy and Apache APISIX at the same 
time.</p>
+<p><img src="https://static.apiseven.com/main.png"; alt="Architecture 
diagram"></p>
+<p>We use the previous example to show how the plugin runs:</p>
+<p><img src="https://static.apiseven.com/workflow.png"; alt="Plugin 
workflow"></p>
+<h4><a class="anchor" aria-hidden="true" 
id="first-step-read-configuration"></a><a href="#first-step-read-configuration" 
aria-hidden="true" class="hash-link"><svg class="hash-link-icon" 
aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" 
width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 
3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 
5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 
2.5S13.98 12  [...]
+<p>We configure through metadata to determine what plugins need to run on each 
route and what configuration is for each plugin.
+In the example, we configured plugin <code>uri-blocker</code> for the route 
whose prefix is ​​<code>/foo</code>, as well as the block rule of the plugin 
and the response status when a block is required.</p>
+<h4><a class="anchor" aria-hidden="true" id="second-step-parse-request"></a><a 
href="#second-step-parse-request" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>We encapsulated the client request data into <code>ctx</code> so that it 
can be used directly in the entire process.</p>
+<h4><a class="anchor" aria-hidden="true" id="third-step-run-the-plugin"></a><a 
href="#third-step-run-the-plugin" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>We determine whether we need to block this request by matching the 
configured rules and the obtained uri. If a block is needed, we call 
<code>respond</code> to directly respond, otherwise we let it go.</p>
+<h2><a class="anchor" aria-hidden="true" id="future-outlook"></a><a 
href="#future-outlook" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>More and more APISIX plugins are available to run on Envoy, and finally all 
APISIX plugins (Even that will be developed in the future) will be available to 
run on Envoy.</p>
+<p>At the same time, we hope that we could work with the Envoy community in 
the direction of Lua Filter, optimize and improve Lua Filter, enhance the 
expansion capabilities of Envoy, and reduce the difficulty of Envoy 
expansion.</p>
+</span></div></article></div><div class="post"><header class="postHeader"><h1 
class="postHeaderTitle"><a href="/blog/2020/08/22/new-website">New website for 
Apache APISIX</a></h1><p class="post-meta">August 22, 2020</p><div 
class="authorBlock"><p class="post-authorName"><a 
href="https://github.com/juzhiyuan"; target="_blank" rel="noreferrer 
noopener">juzhiyuan</a></p><div class="authorPhoto"><a 
href="https://github.com/juzhiyuan"; target="_blank" rel="noreferrer 
noopener"><img src="https:/ [...]
 </span></div><div class="read-more"><a class="button" 
href="/blog/2020/08/22/new-website">Read More</a></div></article></div><div 
class="docs-prevnext"></div></div></div></div></div><footer class="nav-footer" 
id="footer"><section class="sitemap"><a href="/" 
class="nav-home"></a><div><h5>ASF</h5><a 
href="https://www.apache.org/";>Foundation</a><a 
href="https://www.apache.org/licenses/";>License</a><a 
href="http://www.apache.org/events/current-event/";>Events</a><a 
href="https://www.apache.or [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
diff --git a/committer-guide.html b/committer-guide.html
index 9ef316c..78c0521 100644
--- a/committer-guide.html
+++ b/committer-guide.html
@@ -100,7 +100,7 @@
 <h2><a class="anchor" aria-hidden="true" 
id="how-to-become-a-apisix-pmc"></a><a href="#how-to-become-a-apisix-pmc" 
aria-hidden="true" class="hash-link"><svg class="hash-link-icon" 
aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" 
width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 
3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 
5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 
2.5S13.98 12 13 12H [...]
 <p>In APISIX community, if a committer who have earned even more merit, can be 
invited to be a part of the Project Management Committee (PMC).</p>
 <p>One thing that is sometimes hard to understand when you are new to the open 
development process used at the ASF, is that we value the community more than 
the code. A strong and healthy community will be respectful and be a fun and 
rewarding place. More importantly, a diverse and healthy community can continue 
to support the code over the longer term, even as individual companies come and 
go from the field.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/contributor-guide"><span class="arrow-prev">← 
</span><span>Contributor Guide</span></a><a class="docs-next button" 
href="/2fa"><span>2FA</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#what-can-i-contribute">What can I 
contribute?</a></li><li><a [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/contributor-guide"><span class="arrow-prev">← 
</span><span>Contributor Guide</span></a><a class="docs-next button" 
href="/2fa"><span>2FA</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#what-can-i-contribute">What can I 
contribute?</a></li><li><a href [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/committer-guide/index.html b/committer-guide/index.html
index 9ef316c..78c0521 100644
--- a/committer-guide/index.html
+++ b/committer-guide/index.html
@@ -100,7 +100,7 @@
 <h2><a class="anchor" aria-hidden="true" 
id="how-to-become-a-apisix-pmc"></a><a href="#how-to-become-a-apisix-pmc" 
aria-hidden="true" class="hash-link"><svg class="hash-link-icon" 
aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" 
width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 
3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 
5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 
2.5S13.98 12 13 12H [...]
 <p>In APISIX community, if a committer who have earned even more merit, can be 
invited to be a part of the Project Management Committee (PMC).</p>
 <p>One thing that is sometimes hard to understand when you are new to the open 
development process used at the ASF, is that we value the community more than 
the code. A strong and healthy community will be respectful and be a fun and 
rewarding place. More importantly, a diverse and healthy community can continue 
to support the code over the longer term, even as individual companies come and 
go from the field.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/contributor-guide"><span class="arrow-prev">← 
</span><span>Contributor Guide</span></a><a class="docs-next button" 
href="/2fa"><span>2FA</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#what-can-i-contribute">What can I 
contribute?</a></li><li><a [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/contributor-guide"><span class="arrow-prev">← 
</span><span>Contributor Guide</span></a><a class="docs-next button" 
href="/2fa"><span>2FA</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#what-can-i-contribute">What can I 
contribute?</a></li><li><a href [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/contributor-guide.html b/contributor-guide.html
index e0e507b..940e201 100644
--- a/contributor-guide.html
+++ b/contributor-guide.html
@@ -115,7 +115,7 @@ $ git push origin --delete issueNo
 <pre><code class="hljs css language-sh">$ git config --global user.name <span 
class="hljs-string">"username"</span>
 $ git config --global user.email <span class="hljs-string">"mail 
address"</span>
 </code></pre>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/subscribe-guide"><span class="arrow-prev">← 
</span><span>Subscribe Guide</span></a><a class="docs-next button" 
href="/committer-guide"><span>Committer Guide</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#submit-an-issue">Submit an issue</a></li 
[...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/subscribe-guide"><span class="arrow-prev">← 
</span><span>Subscribe Guide</span></a><a class="docs-next button" 
href="/committer-guide"><span>Committer Guide</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#submit-an-issue">Submit an 
issue</a></li><li> [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/contributor-guide/index.html b/contributor-guide/index.html
index e0e507b..940e201 100644
--- a/contributor-guide/index.html
+++ b/contributor-guide/index.html
@@ -115,7 +115,7 @@ $ git push origin --delete issueNo
 <pre><code class="hljs css language-sh">$ git config --global user.name <span 
class="hljs-string">"username"</span>
 $ git config --global user.email <span class="hljs-string">"mail 
address"</span>
 </code></pre>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/subscribe-guide"><span class="arrow-prev">← 
</span><span>Subscribe Guide</span></a><a class="docs-next button" 
href="/committer-guide"><span>Committer Guide</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#submit-an-issue">Submit an issue</a></li 
[...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/subscribe-guide"><span class="arrow-prev">← 
</span><span>Subscribe Guide</span></a><a class="docs-next button" 
href="/committer-guide"><span>Committer Guide</span><span class="arrow-next"> 
→</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#submit-an-issue">Submit an 
issue</a></li><li> [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/downloads.html b/downloads.html
index 606825a..eaafabb 100644
--- a/downloads.html
+++ b/downloads.html
@@ -49,7 +49,7 @@ or
 
 pgp apache-apisix-**\*\*\*\***.asc
 </code></pre>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div 
class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#apisix">APISIX™</a></li><li><a 
href="#apisix-dashboard">APISIX™ Dashboard</a></li><li><a 
href="#verify-the-releases">Verify the 
releases</a></li></ul></nav></div><footer class="nav-footer" 
id="footer"><section class="sitemap"><a href="/" 
class="nav-home"></a><div><h5>ASF</h5> [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"></div></div></div><nav 
class="onPageNav"><ul class="toc-headings"><li><a 
href="#apisix">APISIX™</a></li><li><a href="#apisix-dashboard">APISIX™ 
Dashboard</a></li><li><a href="#verify-the-releases">Verify the 
releases</a></li></ul></nav></div><footer class="nav-footer" 
id="footer"><section class="sitemap"><a href="/" 
class="nav-home"></a><div><h5>ASF</h5><a hr [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/downloads/index.html b/downloads/index.html
index 606825a..eaafabb 100644
--- a/downloads/index.html
+++ b/downloads/index.html
@@ -49,7 +49,7 @@ or
 
 pgp apache-apisix-**\*\*\*\***.asc
 </code></pre>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div 
class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#apisix">APISIX™</a></li><li><a 
href="#apisix-dashboard">APISIX™ Dashboard</a></li><li><a 
href="#verify-the-releases">Verify the 
releases</a></li></ul></nav></div><footer class="nav-footer" 
id="footer"><section class="sitemap"><a href="/" 
class="nav-home"></a><div><h5>ASF</h5> [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"></div></div></div><nav 
class="onPageNav"><ul class="toc-headings"><li><a 
href="#apisix">APISIX™</a></li><li><a href="#apisix-dashboard">APISIX™ 
Dashboard</a></li><li><a href="#verify-the-releases">Verify the 
releases</a></li></ul></nav></div><footer class="nav-footer" 
id="footer"><section class="sitemap"><a href="/" 
class="nav-home"></a><div><h5>ASF</h5><a hr [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/release-guide.html b/release-guide.html
index 309f12c..4c333bd 100644
--- a/release-guide.html
+++ b/release-guide.html
@@ -232,7 +232,7 @@ Committed revision 37435.
 <p>Remove <code>rc</code> from the package name, move KEYS and package to 
address</p>
 <h3><a class="anchor" aria-hidden="true" id="update-download-page"></a><a 
href="#update-download-page" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p>update address , source repo is <a 
href="https://github.com/apache/apisix-website";>https://github.com/apache/apisix-website</a></p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/2fa"><span class="arrow-prev">← 
</span><span>2FA</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#gpg-settings">GPG Settings</a><ul 
class="toc-headings"><li><a href="#install-gpg">Install GPG</a></li><li><a 
href="#create-key">Create Key</a></li><li><a href="#view-the-generated-ke [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/2fa"><span class="arrow-prev">← 
</span><span>2FA</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#gpg-settings">GPG Settings</a><ul 
class="toc-headings"><li><a href="#install-gpg">Install GPG</a></li><li><a 
href="#create-key">Create Key</a></li><li><a href="#view-the-generated-key">Vi 
[...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/release-guide/index.html b/release-guide/index.html
index 309f12c..4c333bd 100644
--- a/release-guide/index.html
+++ b/release-guide/index.html
@@ -232,7 +232,7 @@ Committed revision 37435.
 <p>Remove <code>rc</code> from the package name, move KEYS and package to 
address</p>
 <h3><a class="anchor" aria-hidden="true" id="update-download-page"></a><a 
href="#update-download-page" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p>update address , source repo is <a 
href="https://github.com/apache/apisix-website";>https://github.com/apache/apisix-website</a></p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/2fa"><span class="arrow-prev">← 
</span><span>2FA</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#gpg-settings">GPG Settings</a><ul 
class="toc-headings"><li><a href="#install-gpg">Install GPG</a></li><li><a 
href="#create-key">Create Key</a></li><li><a href="#view-the-generated-ke [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/2fa"><span class="arrow-prev">← 
</span><span>2FA</span></a></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#gpg-settings">GPG Settings</a><ul 
class="toc-headings"><li><a href="#install-gpg">Install GPG</a></li><li><a 
href="#create-key">Create Key</a></li><li><a href="#view-the-generated-key">Vi 
[...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/security.html b/security.html
index 9458dd3..131920b 100644
--- a/security.html
+++ b/security.html
@@ -63,7 +63,7 @@
         </script></nav></div><div class="container mainContainer 
docsContainer"><div class="wrapper"><div class="post"><header 
class="postHeader"><h1 id="__docusaurus" 
class="postHeaderTitle">Security</h1></header><article><div><span><p>The Apache 
Software Foundation takes a rigorous stance on eliminating security issues in 
its software projects. Apache APISIX is also very concerned Security issues 
related to its features and functionality.</p>
 <p>If you have apprehensions regarding APISIX’s security or you discover 
vulnerability or potential threat, don’t hesitate to get in touch with the 
Apache Security Team by dropping a mail at <a 
href="mailto:secur...@apache.org";>secur...@apache.org</a>. Please specify the 
project name as APISIX and its product name APISIX or APISIX-Dashboard in the 
email and provide a description of the relevant problem or potential threat. 
You are also urged to recommend the way to reproduce and replicat [...]
 <p>Please pay attention to report the security issue on the security email 
before disclosing it on public domain.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-next 
button" href="/subscribe-guide"><span>Subscribe Guide</span><span 
class="arrow-next"> →</span></a></div></div></div><nav 
class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section 
class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a 
href="https://www.apache.org/";>Foundation</a><a href="https://www.ap [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-next 
button" href="/subscribe-guide"><span>Subscribe Guide</span><span 
class="arrow-next"> →</span></a></div></div></div><nav 
class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section 
class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a 
href="https://www.apache.org/";>Foundation</a><a href="https://www.apache. [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/security/index.html b/security/index.html
index 9458dd3..131920b 100644
--- a/security/index.html
+++ b/security/index.html
@@ -63,7 +63,7 @@
         </script></nav></div><div class="container mainContainer 
docsContainer"><div class="wrapper"><div class="post"><header 
class="postHeader"><h1 id="__docusaurus" 
class="postHeaderTitle">Security</h1></header><article><div><span><p>The Apache 
Software Foundation takes a rigorous stance on eliminating security issues in 
its software projects. Apache APISIX is also very concerned Security issues 
related to its features and functionality.</p>
 <p>If you have apprehensions regarding APISIX’s security or you discover 
vulnerability or potential threat, don’t hesitate to get in touch with the 
Apache Security Team by dropping a mail at <a 
href="mailto:secur...@apache.org";>secur...@apache.org</a>. Please specify the 
project name as APISIX and its product name APISIX or APISIX-Dashboard in the 
email and provide a description of the relevant problem or potential threat. 
You are also urged to recommend the way to reproduce and replicat [...]
 <p>Please pay attention to report the security issue on the security email 
before disclosing it on public domain.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-next 
button" href="/subscribe-guide"><span>Subscribe Guide</span><span 
class="arrow-next"> →</span></a></div></div></div><nav 
class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section 
class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a 
href="https://www.apache.org/";>Foundation</a><a href="https://www.ap [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-next 
button" href="/subscribe-guide"><span>Subscribe Guide</span><span 
class="arrow-next"> →</span></a></div></div></div><nav 
class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section 
class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a 
href="https://www.apache.org/";>Foundation</a><a href="https://www.apache. [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/sitemap.xml b/sitemap.xml
index f63db25..74cabf9 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><urlset 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"; 
xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0"; 
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"; 
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1";><url><loc>https://apisix.apache.org/help</loc><changefreq>weekly</changefreq><priority>0.5</priority><x
 [...]
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><urlset 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"; 
xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0"; 
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"; 
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1";><url><loc>https://apisix.apache.org/help</loc><changefreq>weekly</changefreq><priority>0.5</priority><x
 [...]
\ No newline at end of file
diff --git a/subscribe-guide.html b/subscribe-guide.html
index d16653f..e3be29a 100644
--- a/subscribe-guide.html
+++ b/subscribe-guide.html
@@ -67,7 +67,7 @@
 <li><p>Receive the Welcome e-mail. After finishing the two steps above, an 
e-mail with the subject of WELCOME to <a 
href="mailto:d...@apisix.apache.org";>d...@apisix.apache.org</a> will be sent to 
your e-mail address. Until now, you have succeeded in subscribing Apache APISIX 
mailing-list.</p></li>
 <li><p>Until now, you can interact with community by your subscribed email or 
track email conversations by Archived email list.</p></li>
 </ol>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/security"><span class="arrow-prev">← 
</span><span>Security</span></a><a class="docs-next button" 
href="/contributor-guide"><span>Contributor Guide</span><span 
class="arrow-next"> →</span></a></div></div></div><nav 
class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section 
class="sitemap"><a href="/" c [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/security"><span class="arrow-prev">← 
</span><span>Security</span></a><a class="docs-next button" 
href="/contributor-guide"><span>Contributor Guide</span><span 
class="arrow-next"> →</span></a></div></div></div><nav 
class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section 
class="sitemap"><a href="/" class= [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/subscribe-guide/index.html b/subscribe-guide/index.html
index d16653f..e3be29a 100644
--- a/subscribe-guide/index.html
+++ b/subscribe-guide/index.html
@@ -67,7 +67,7 @@
 <li><p>Receive the Welcome e-mail. After finishing the two steps above, an 
e-mail with the subject of WELCOME to <a 
href="mailto:d...@apisix.apache.org";>d...@apisix.apache.org</a> will be sent to 
your e-mail address. Until now, you have succeeded in subscribing Apache APISIX 
mailing-list.</p></li>
 <li><p>Until now, you can interact with community by your subscribed email or 
track email conversations by Archived email list.</p></li>
 </ol>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/security"><span class="arrow-prev">← 
</span><span>Security</span></a><a class="docs-next button" 
href="/contributor-guide"><span>Contributor Guide</span><span 
class="arrow-next"> →</span></a></div></div></div><nav 
class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section 
class="sitemap"><a href="/" c [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"><a class="docs-prev 
button" href="/security"><span class="arrow-prev">← 
</span><span>Security</span></a><a class="docs-next button" 
href="/contributor-guide"><span>Contributor Guide</span><span 
class="arrow-next"> →</span></a></div></div></div><nav 
class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section 
class="sitemap"><a href="/" class= [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/team.html b/team.html
index 9c5d89f..72de888 100644
--- a/team.html
+++ b/team.html
@@ -73,7 +73,7 @@
 <h2><a class="anchor" aria-hidden="true" id="becoming-a-committer"></a><a 
href="#becoming-a-committer" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p>The Apache APISIX community follows the Apache Community’s process on 
accepting a new committer. After a contributor participates APISIX's community 
actively, PMC and Committers will make decisions to invite the contributor join 
Committers and PMC.</p>
 <p>You can read <a href="../docs/contributor-guide.md">Contributor Guide</a> 
to participate the community, and can get more information on <a 
href="../docs/committer-guide.md">Committer Guide</a>.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div 
class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#members">Members</a><ul 
class="toc-headings"><li><a href="#pmc">PMC</a></li><li><a 
href="#committer">Committer</a></li></ul></li><li><a 
href="#mentors">Mentors</a></li><li><a 
href="#contributors">Contributors</a></li><li><a 
href="#becoming-a-committer">Becoming a Committer</a [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"></div></div></div><nav 
class="onPageNav"><ul class="toc-headings"><li><a 
href="#members">Members</a><ul class="toc-headings"><li><a 
href="#pmc">PMC</a></li><li><a 
href="#committer">Committer</a></li></ul></li><li><a 
href="#mentors">Mentors</a></li><li><a 
href="#contributors">Contributors</a></li><li><a 
href="#becoming-a-committer">Becoming a Committer</a></li [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
diff --git a/team/index.html b/team/index.html
index 9c5d89f..72de888 100644
--- a/team/index.html
+++ b/team/index.html
@@ -73,7 +73,7 @@
 <h2><a class="anchor" aria-hidden="true" id="becoming-a-committer"></a><a 
href="#becoming-a-committer" aria-hidden="true" class="hash-link"><svg 
class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 
0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 
0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 
3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 
9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p>The Apache APISIX community follows the Apache Community’s process on 
accepting a new committer. After a contributor participates APISIX's community 
actively, PMC and Committers will make decisions to invite the contributor join 
Committers and PMC.</p>
 <p>You can read <a href="../docs/contributor-guide.md">Contributor Guide</a> 
to participate the community, and can get more information on <a 
href="../docs/committer-guide.md">Committer Guide</a>.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/16/2020 by nic-chen</em></div><div 
class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul 
class="toc-headings"><li><a href="#members">Members</a><ul 
class="toc-headings"><li><a href="#pmc">PMC</a></li><li><a 
href="#committer">Committer</a></li></ul></li><li><a 
href="#mentors">Mentors</a></li><li><a 
href="#contributors">Contributors</a></li><li><a 
href="#becoming-a-committer">Becoming a Committer</a [...]
+</span></div></article></div><div class="docLastUpdate"><em>Last updated on 
12/17/2020 by 琚致远</em></div><div class="docs-prevnext"></div></div></div><nav 
class="onPageNav"><ul class="toc-headings"><li><a 
href="#members">Members</a><ul class="toc-headings"><li><a 
href="#pmc">PMC</a></li><li><a 
href="#committer">Committer</a></li></ul></li><li><a 
href="#mentors">Mentors</a></li><li><a 
href="#contributors">Contributors</a></li><li><a 
href="#becoming-a-committer">Becoming a Committer</a></li [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;

Reply via email to