<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> File: README — Documentation by YARD 0.9.34 </title> <link rel="stylesheet" href="css/style.css" type="text/css" /> <link rel="stylesheet" href="css/common.css" type="text/css" /> <script type="text/javascript"> pathId = "README"; relpath = ''; </script> <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script> <script type="text/javascript" charset="utf-8" src="js/app.js"></script> </head> <body> <div class="nav_wrap"> <iframe id="nav" src="class_list.html?1"></iframe> <div id="resizer"></div> </div> <div id="main" tabindex="-1"> <div id="header"> <div id="menu"> <a href="_index.html">Index</a> » <span class="title">File: README</span> </div> <div id="search"> <a class="full_list_link" id="class_list_link" href="class_list.html"> <svg width="24" height="24"> <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect> <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect> <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect> </svg> </a> </div> <div class="clear"></div> </div> <div id="content"><div id='filecontents'><h1 id="the-strange-case-of-dr-rack-and-mr-hyde">The strange case of Dr. Rack and Mr. Hyde</h1> <p>Hyde is a library that provides a DSL for creating HTTP servers. As of now it is using Rack as the webserver adapter, but ideally it shouldn't take much work to make it run on top of any webserver.</p> <p>Hyde was made mostly for fun. Ideally it will become something more, but as of yet it's just an experiment revolving around Ruby Metaprogramming and its DSL capabilities.</p> <h1 id="examples">Examples</h1> <p>A simple "Hello, World!" HTTP API using Hyde</p> <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>hyde</span><span class='tstring_end'>'</span></span> <span class='id identifier rubyid_app'>app</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Hyde.html" title="Hyde (module)">Hyde</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyde/Server.html" title="Hyde::Server (class)">Server</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Hyde/Server.html#initialize-instance_method" title="Hyde::Server#initialize (method)">new</a></span></span> <span class='kw'>do</span> <span class='id identifier rubyid_get'>get</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>/hello</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='id identifier rubyid_header'>header</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>content-type</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>text/plain</span><span class='tstring_end'>"</span></span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Hello world!</span><span class='tstring_end'>"</span></span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='id identifier rubyid_run'>run</span> <span class='id identifier rubyid_app'>app</span> </code></pre> <p>A push/pull stack as an HTTP API</p> <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>hyde</span><span class='tstring_end'>'</span></span> <span class='id identifier rubyid_stack'>stack</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span> <span class='id identifier rubyid_app'>app</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Hyde.html" title="Hyde (module)">Hyde</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyde/Server.html" title="Hyde::Server (class)">Server</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Hyde/Server.html#initialize-instance_method" title="Hyde::Server#initialize (method)">new</a></span></span> <span class='kw'>do</span> <span class='id identifier rubyid_get'>get</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>/pop</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='id identifier rubyid_header'>header</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>content-type</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>text/plain</span><span class='tstring_end'>'</span></span> <span class='id identifier rubyid_stack'>stack</span><span class='period'>.</span><span class='id identifier rubyid_pop'>pop</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span> <span class='kw'>end</span> <span class='id identifier rubyid_post'>post</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>/push</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='id identifier rubyid_header'>header</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>content-type</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>text/plain</span><span class='tstring_end'>'</span></span> <span class='id identifier rubyid_stack'>stack</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span><span class='lparen'>(</span><span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span><span class='rparen'>)</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='id identifier rubyid_run'>run</span> <span class='id identifier rubyid_app'>app</span> </code></pre> <p>Several push/pull buckets</p> <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>hyde</span><span class='tstring_end'>'</span></span> <span class='id identifier rubyid_stack'>stack</span> <span class='op'>=</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>1</span><span class='tstring_end'>"</span></span> <span class='op'>=></span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>2</span><span class='tstring_end'>"</span></span> <span class='op'>=></span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>3</span><span class='tstring_end'>"</span></span> <span class='op'>=></span> <span class='lbracket'>[</span><span class='rbracket'>]</span> <span class='rbrace'>}</span> <span class='id identifier rubyid_app'>app</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Hyde.html" title="Hyde (module)">Hyde</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyde/Server.html" title="Hyde::Server (class)">Server</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Hyde/Server.html#initialize-instance_method" title="Hyde::Server#initialize (method)">new</a></span></span> <span class='kw'>do</span> <span class='id identifier rubyid_path'>path</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>bucket_(1|2|3)</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='id identifier rubyid_get'>get</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>pop</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_bucket'>bucket</span><span class='op'>|</span> <span class='id identifier rubyid_header'>header</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>content-type</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>text/plain</span><span class='tstring_end'>"</span></span> <span class='id identifier rubyid_stack'>stack</span><span class='lbracket'>[</span><span class='id identifier rubyid_bucket'>bucket</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_pop'>pop</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span> <span class='kw'>end</span> <span class='id identifier rubyid_post'>post</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>push</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_bucket'>bucket</span><span class='op'>|</span> <span class='id identifier rubyid_header'>header</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>content-type</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>text/plain</span><span class='tstring_end'>"</span></span> <span class='id identifier rubyid_stack'>stack</span><span class='lbracket'>[</span><span class='id identifier rubyid_bucket'>bucket</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span><span class='lparen'>(</span><span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span><span class='rparen'>)</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='id identifier rubyid_run'>run</span> <span class='id identifier rubyid_app'>app</span> </code></pre> <p>Static file serving (Note: index applies <em>only</em> to /var/www (to the path its defined in))</p> <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>hyde</span><span class='tstring_end'>'</span></span> <span class='id identifier rubyid_app'>app</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Hyde.html" title="Hyde (module)">Hyde</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyde/Server.html" title="Hyde::Server (class)">Server</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Hyde/Server.html#initialize-instance_method" title="Hyde::Server#initialize (method)">new</a></span></span> <span class='kw'>do</span> <span class='id identifier rubyid_root'>root</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>/var/www</span><span class='tstring_end'>"</span></span> <span class='id identifier rubyid_index'>index</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>index.html</span><span class='tstring_end'>"</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>index.htm</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span> <span class='id identifier rubyid_serve'>serve</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>**/*.(html|htm)</span><span class='tstring_end'>"</span></span> <span class='kw'>end</span> <span class='id identifier rubyid_run'>run</span> <span class='id identifier rubyid_app'>app</span> </code></pre> <p>Logging on a particular path</p> <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>hyde</span><span class='tstring_end'>'</span></span> <span class='id identifier rubyid_app'>app</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Hyde.html" title="Hyde (module)">Hyde</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyde/Server.html" title="Hyde::Server (class)">Server</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Hyde/Server.html#initialize-instance_method" title="Hyde::Server#initialize (method)">new</a></span></span> <span class='kw'>do</span> <span class='id identifier rubyid_path'>path</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>unimportant</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='id identifier rubyid_get'>get</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>version</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='id identifier rubyid_header'>header</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>content-type</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>text/plain</span><span class='tstring_end'>"</span></span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>1337 (the best one)</span><span class='tstring_end'>"</span></span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='id identifier rubyid_path'>path</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>important</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='id identifier rubyid_preprocess'>preprocess</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_req'>req</span><span class='op'>|</span> <span class='comment'># Implement logging logic here </span> <span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Client at </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_req'>req</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>REMOTE_ADDR</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_content'> wanted to access something /important!</span><span class='tstring_end'>"</span></span> <span class='kw'>end</span> <span class='id identifier rubyid_get'>get</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>answer</span><span class='tstring_end'>"</span></span> <span class='kw'>do</span> <span class='id identifier rubyid_header'>header</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>content-type</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>application/json</span><span class='tstring_end'>"</span></span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>{"answer":42, "desc":"something important!"}</span><span class='tstring_end'>'</span></span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='id identifier rubyid_run'>run</span> <span class='id identifier rubyid_app'>app</span> </code></pre> <p>And a lot more to be found in /examples in this repo.</p> <h1 id="documentation">Documentation</h1> <p>Someday it's gonna be there somewhere</p> <h1 id="license">License</h1> <pre class="code ruby"><code class="ruby"> Hyde - an HTTP request pattern matching system Copyright (C) 2022 yessiest (yessiest@memeware.net) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. </code></pre> </div></div> <div id="footer"> Generated on Sat Sep 9 19:10:57 2023 by <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a> 0.9.34 (ruby-3.0.6). </div> </div> </body> </html>