Files
metasploit-gs/api/Rex/Proto/Http/Packet.html
T
jenkins-metasploit c3f5bd3de2 Reboot gh-pages
2026-05-08 17:08:43 +00:00

2945 lines
95 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
Class: Rex::Proto::Http::Packet
&mdash; Documentation by YARD 0.9.37
</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 = "Rex::Proto::Http::Packet";
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 (P)</a> &raquo;
<span class='title'><span class='object_link'><a href="../../../Rex.html" title="Rex (module)">Rex</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../../Proto.html" title="Rex::Proto (module)">Proto</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../Http.html" title="Rex::Proto::Http (module)">Http</a></span></span>
&raquo;
<span class="title">Packet</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"><h1>Class: Rex::Proto::Http::Packet
</h1>
<div class="box_info">
<dl>
<dt>Inherits:</dt>
<dd>
<span class="inheritName">Object</span>
<ul class="fullTree">
<li>Object</li>
<li class="next">Rex::Proto::Http::Packet</li>
</ul>
<a href="#" class="inheritanceTree">show all</a>
</dd>
</dl>
<dl>
<dt>Defined in:</dt>
<dd>lib/rex/proto/http/packet.rb</dd>
</dl>
</div>
<h2>Overview</h2><div class="docstring">
<div class="discussion">
<p>This class represents an HTTP packet.</p>
</div>
</div>
<div class="tags">
</div><div id="subclasses">
<h2>Direct Known Subclasses</h2>
<p class="children"><span class='object_link'><a href="Request.html" title="Rex::Proto::Http::Request (class)">Request</a></span>, <span class='object_link'><a href="Response.html" title="Rex::Proto::Http::Response (class)">Response</a></span></p>
</div>
<h2>Defined Under Namespace</h2>
<p class="children">
<strong class="modules">Modules:</strong> <span class='object_link'><a href="Packet/ParseCode.html" title="Rex::Proto::Http::Packet::ParseCode (module)">ParseCode</a></span>, <span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span>
<strong class="classes">Classes:</strong> <span class='object_link'><a href="Packet/Header.html" title="Rex::Proto::Http::Packet::Header (class)">Header</a></span>
</p>
<h2>Instance Attribute Summary <small><a href="#" class="summary_toggle">collapse</a></small></h2>
<ul class="summary">
<li class="public ">
<span class="summary_signature">
<a href="#auto_cl-instance_method" title="#auto_cl (instance method)">#<strong>auto_cl</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute auto_cl.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#body-instance_method" title="#body (instance method)">#<strong>body</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute body.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#body_bytes_left-instance_method" title="#body_bytes_left (instance method)">#<strong>body_bytes_left</strong> &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute body_bytes_left.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#bufq-instance_method" title="#bufq (instance method)">#<strong>bufq</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute bufq.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#chunk_max_size-instance_method" title="#chunk_max_size (instance method)">#<strong>chunk_max_size</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute chunk_max_size.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#chunk_min_size-instance_method" title="#chunk_min_size (instance method)">#<strong>chunk_min_size</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute chunk_min_size.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#compress-instance_method" title="#compress (instance method)">#<strong>compress</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute compress.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#error-instance_method" title="#error (instance method)">#<strong>error</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute error.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#headers-instance_method" title="#headers (instance method)">#<strong>headers</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute headers.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#incomplete-instance_method" title="#incomplete (instance method)">#<strong>incomplete</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute incomplete.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#inside_chunk-instance_method" title="#inside_chunk (instance method)">#<strong>inside_chunk</strong> &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute inside_chunk.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#keepalive-instance_method" title="#keepalive (instance method)">#<strong>keepalive</strong> &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute keepalive.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#max_data-instance_method" title="#max_data (instance method)">#<strong>max_data</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute max_data.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#state-instance_method" title="#state (instance method)">#<strong>state</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute state.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#transfer_chunked-instance_method" title="#transfer_chunked (instance method)">#<strong>transfer_chunked</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the value of attribute transfer_chunked.</p>
</div></span>
</li>
</ul>
<h2>
Instance Method Summary
<small><a href="#" class="summary_toggle">collapse</a></small>
</h2>
<ul class="summary">
<li class="public ">
<span class="summary_signature">
<a href="#[]-instance_method" title="#[] (instance method)">#<strong>[]</strong>(key) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Return the associated header value, if any.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#[]=-instance_method" title="#[]= (instance method)">#<strong>[]=</strong>(key, value) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Set the associated header value.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#check_100-instance_method" title="#check_100 (instance method)">#<strong>check_100</strong> &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Override this as needed.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#chunk-instance_method" title="#chunk (instance method)">#<strong>chunk</strong>(str, min_size = 1, max_size = 1000) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Build a Transfer-Encoding: chunked payload with random chunk sizes.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#cmd_string-instance_method" title="#cmd_string (instance method)">#<strong>cmd_string</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the command string, such as:.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#completed%3F-instance_method" title="#completed? (instance method)">#<strong>completed?</strong> &#x21d2; Boolean </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns whether or not parsing has completed.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#from_s-instance_method" title="#from_s (instance method)">#<strong>from_s</strong>(str) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Converts the packet from a string.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#initialize-instance_method" title="#initialize (instance method)">#<strong>initialize</strong> &#x21d2; Packet </a>
</span>
<span class="note title constructor">constructor</span>
<span class="summary_desc"><div class='inline'>
<p>Initializes an instance of an HTTP packet.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#output_packet-instance_method" title="#output_packet (instance method)">#<strong>output_packet</strong>(ignore_chunk = false, headers_only: false) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Converts the packet to a string.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#parse-instance_method" title="#parse (instance method)">#<strong>parse</strong>(buf, opts = {}) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Parses the supplied buffer.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#parse_body-instance_method" title="#parse_body (instance method)">#<strong>parse_body</strong> &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Parses the body portion of the request.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#parse_header-instance_method" title="#parse_header (instance method)">#<strong>parse_header</strong>(opts) &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Parse the HTTP header returned by the target server.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#reset-instance_method" title="#reset (instance method)">#<strong>reset</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Reset the parsing state and buffers.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#reset_except_queue-instance_method" title="#reset_except_queue (instance method)">#<strong>reset_except_queue</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Reset the parsing state but leave the buffers.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#to_s-instance_method" title="#to_s (instance method)">#<strong>to_s</strong>(headers_only: false) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Converts the packet to a string.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#to_terminal_output-instance_method" title="#to_terminal_output (instance method)">#<strong>to_terminal_output</strong>(headers_only: false) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Outputs a readable string of the packet for terminal output.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#update_cmd_parts-instance_method" title="#update_cmd_parts (instance method)">#<strong>update_cmd_parts</strong>(str) &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Allows derived classes to split apart the command string.</p>
</div></span>
</li>
</ul>
<div id="constructor_details" class="method_details_list">
<h2>Constructor Details</h2>
<div class="method_details first">
<h3 class="signature first" id="initialize-instance_method">
#<strong>initialize</strong> &#x21d2; <tt><span class='object_link'><a href="" title="Rex::Proto::Http::Packet (class)">Packet</a></span></tt>
</h3><div class="docstring">
<div class="discussion">
<p>Initializes an instance of an HTTP packet.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
39
40
41
42
43
44</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 39</span>
<span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Packet/Header.html" title="Rex::Proto::Http::Packet::Header (class)">Header</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Packet/Header.html#initialize-instance_method" title="Rex::Proto::Http::Packet::Header#initialize (method)">new</a></span></span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_auto_cl'>auto_cl</span> <span class='op'>=</span> <span class='kw'>true</span>
<span class='id identifier rubyid_reset'>reset</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
</div>
<div id="instance_attr_details" class="attr_details">
<h2>Instance Attribute Details</h2>
<span id="auto_cl=-instance_method"></span>
<div class="method_details first">
<h3 class="signature first" id="auto_cl-instance_method">
#<strong>auto_cl</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute auto_cl.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
258
259
260</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 258</span>
<span class='kw'>def</span> <span class='id identifier rubyid_auto_cl'>auto_cl</span>
<span class='ivar'>@auto_cl</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="body=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="body-instance_method">
#<strong>body</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute body.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
257
258
259</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 257</span>
<span class='kw'>def</span> <span class='id identifier rubyid_body'>body</span>
<span class='ivar'>@body</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="body_bytes_left=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="body_bytes_left-instance_method">
#<strong>body_bytes_left</strong> &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute body_bytes_left.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
270
271
272</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 270</span>
<span class='kw'>def</span> <span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span>
<span class='ivar'>@body_bytes_left</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="bufq=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="bufq-instance_method">
#<strong>bufq</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute bufq.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
256
257
258</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 256</span>
<span class='kw'>def</span> <span class='id identifier rubyid_bufq'>bufq</span>
<span class='ivar'>@bufq</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="chunk_max_size=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="chunk_max_size-instance_method">
#<strong>chunk_max_size</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute chunk_max_size.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
265
266
267</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 265</span>
<span class='kw'>def</span> <span class='id identifier rubyid_chunk_max_size'>chunk_max_size</span>
<span class='ivar'>@chunk_max_size</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="chunk_min_size=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="chunk_min_size-instance_method">
#<strong>chunk_min_size</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute chunk_min_size.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
264
265
266</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 264</span>
<span class='kw'>def</span> <span class='id identifier rubyid_chunk_min_size'>chunk_min_size</span>
<span class='ivar'>@chunk_min_size</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="compress=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="compress-instance_method">
#<strong>compress</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute compress.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
261
262
263</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 261</span>
<span class='kw'>def</span> <span class='id identifier rubyid_compress'>compress</span>
<span class='ivar'>@compress</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="error=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="error-instance_method">
#<strong>error</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute error.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
254
255
256</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 254</span>
<span class='kw'>def</span> <span class='id identifier rubyid_error'>error</span>
<span class='ivar'>@error</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="headers=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="headers-instance_method">
#<strong>headers</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute headers.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
253
254
255</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 253</span>
<span class='kw'>def</span> <span class='id identifier rubyid_headers'>headers</span>
<span class='ivar'>@headers</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="incomplete=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="incomplete-instance_method">
#<strong>incomplete</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute incomplete.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
262
263
264</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 262</span>
<span class='kw'>def</span> <span class='id identifier rubyid_incomplete'>incomplete</span>
<span class='ivar'>@incomplete</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="inside_chunk=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="inside_chunk-instance_method">
#<strong>inside_chunk</strong> &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute inside_chunk.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
271
272
273</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 271</span>
<span class='kw'>def</span> <span class='id identifier rubyid_inside_chunk'>inside_chunk</span>
<span class='ivar'>@inside_chunk</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="keepalive=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="keepalive-instance_method">
#<strong>keepalive</strong> &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute keepalive.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
272
273
274</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 272</span>
<span class='kw'>def</span> <span class='id identifier rubyid_keepalive'>keepalive</span>
<span class='ivar'>@keepalive</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="max_data=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="max_data-instance_method">
#<strong>max_data</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute max_data.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
259
260
261</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 259</span>
<span class='kw'>def</span> <span class='id identifier rubyid_max_data'>max_data</span>
<span class='ivar'>@max_data</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="state=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="state-instance_method">
#<strong>state</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute state.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
255
256
257</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 255</span>
<span class='kw'>def</span> <span class='id identifier rubyid_state'>state</span>
<span class='ivar'>@state</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="transfer_chunked=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="transfer_chunked-instance_method">
#<strong>transfer_chunked</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the value of attribute transfer_chunked.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
260
261
262</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 260</span>
<span class='kw'>def</span> <span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span>
<span class='ivar'>@transfer_chunked</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
</div>
<div id="instance_method_details" class="method_details_list">
<h2>Instance Method Details</h2>
<div class="method_details first">
<h3 class="signature first" id="[]-instance_method">
#<strong>[]</strong>(key) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Return the associated header value, if any.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
49
50
51
52
53
54
55
56
57
58
59
60
61</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 49</span>
<span class='kw'>def</span> <span class='op'>[]</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span><span class='rparen'>)</span>
<span class='kw'>return</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='id identifier rubyid_key'>key</span><span class='rbracket'>]</span>
<span class='kw'>end</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_each_pair'>each_pair</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_k'>k</span><span class='comma'>,</span><span class='id identifier rubyid_v'>v</span><span class='op'>|</span>
<span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span> <span class='op'>==</span> <span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span><span class='rparen'>)</span>
<span class='kw'>return</span> <span class='id identifier rubyid_v'>v</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>return</span> <span class='kw'>nil</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="[]=-instance_method">
#<strong>[]=</strong>(key, value) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Set the associated header value.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
66
67
68</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 66</span>
<span class='kw'>def</span> <span class='op'>[]=</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='id identifier rubyid_key'>key</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="check_100-instance_method">
#<strong>check_100</strong> &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Override this as needed</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
437
438</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 437</span>
<span class='kw'>def</span> <span class='id identifier rubyid_check_100'>check_100</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="chunk-instance_method">
#<strong>chunk</strong>(str, min_size = 1, max_size = 1000) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Build a Transfer-Encoding: chunked payload with random chunk sizes</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 154</span>
<span class='kw'>def</span> <span class='id identifier rubyid_chunk'>chunk</span><span class='lparen'>(</span><span class='id identifier rubyid_str'>str</span><span class='comma'>,</span> <span class='id identifier rubyid_min_size'>min_size</span> <span class='op'>=</span> <span class='int'>1</span><span class='comma'>,</span> <span class='id identifier rubyid_max_size'>max_size</span> <span class='op'>=</span> <span class='int'>1000</span><span class='rparen'>)</span>
<span class='id identifier rubyid_chunked'>chunked</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span>
<span class='comment'># min chunk size is 1 byte
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_min_size'>min_size</span> <span class='op'>&lt;</span> <span class='int'>1</span><span class='rparen'>)</span><span class='semicolon'>;</span> <span class='id identifier rubyid_min_size'>min_size</span> <span class='op'>=</span> <span class='int'>1</span><span class='semicolon'>;</span> <span class='kw'>end</span>
<span class='comment'># don&#39;t be dumb
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_max_size'>max_size</span> <span class='op'>&lt;</span> <span class='id identifier rubyid_min_size'>min_size</span><span class='rparen'>)</span><span class='semicolon'>;</span> <span class='id identifier rubyid_max_size'>max_size</span> <span class='op'>=</span> <span class='id identifier rubyid_min_size'>min_size</span><span class='semicolon'>;</span> <span class='kw'>end</span>
<span class='kw'>while</span> <span class='lparen'>(</span><span class='id identifier rubyid_str'>str</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span> <span class='op'>&gt;</span> <span class='int'>0</span><span class='rparen'>)</span>
<span class='id identifier rubyid_chunk'>chunk</span> <span class='op'>=</span> <span class='id identifier rubyid_str'>str</span><span class='period'>.</span><span class='id identifier rubyid_slice!'>slice!</span><span class='lparen'>(</span><span class='int'>0</span><span class='comma'>,</span> <span class='id identifier rubyid_rand'>rand</span><span class='lparen'>(</span><span class='id identifier rubyid_max_size'>max_size</span> <span class='op'>-</span> <span class='id identifier rubyid_min_size'>min_size</span><span class='rparen'>)</span> <span class='op'>+</span> <span class='id identifier rubyid_min_size'>min_size</span><span class='rparen'>)</span>
<span class='id identifier rubyid_chunked'>chunked</span> <span class='op'>+=</span> <span class='id identifier rubyid_sprintf'>sprintf</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>%x</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='id identifier rubyid_chunk'>chunk</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span><span class='rparen'>)</span> <span class='op'>+</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\r\n</span><span class='tstring_end'>&quot;</span></span> <span class='op'>+</span> <span class='id identifier rubyid_chunk'>chunk</span> <span class='op'>+</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\r\n</span><span class='tstring_end'>&quot;</span></span>
<span class='kw'>end</span>
<span class='id identifier rubyid_chunked'>chunked</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>0\r\n\r\n</span><span class='tstring_end'>&quot;</span></span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="cmd_string-instance_method">
#<strong>cmd_string</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the command string, such as:</p>
<p>HTTP/1.0 200 OK for a response</p>
<p>or</p>
<p>GET /foo HTTP/1.0 for a request</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
249
250
251</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 249</span>
<span class='kw'>def</span> <span class='id identifier rubyid_cmd_string'>cmd_string</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_cmd_string'>cmd_string</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="completed?-instance_method">
#<strong>completed?</strong> &#x21d2; <tt>Boolean</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns whether or not parsing has completed.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Boolean</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
136
137
138
139
140
141
142
143
144
145
146
147
148
149</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 136</span>
<span class='kw'>def</span> <span class='id identifier rubyid_completed?'>completed?</span>
<span class='kw'>return</span> <span class='kw'>true</span> <span class='kw'>if</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>==</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#Completed-constant" title="Rex::Proto::Http::Packet::ParseState::Completed (constant)">Completed</a></span></span>
<span class='comment'># If the parser state is processing the body and there are an
</span> <span class='comment'># undetermined number of bytes left to read, we just need to say that
</span> <span class='comment'># things are completed as it&#39;s hard to tell whether or not they really
</span> <span class='comment'># are.
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>==</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#ProcessingBody-constant" title="Rex::Proto::Http::Packet::ParseState::ProcessingBody (constant)">ProcessingBody</a></span></span> <span class='kw'>and</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>&lt;</span> <span class='int'>0</span><span class='rparen'>)</span>
<span class='kw'>return</span> <span class='kw'>true</span>
<span class='kw'>end</span>
<span class='kw'>false</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="from_s-instance_method">
#<strong>from_s</strong>(str) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Converts the packet from a string.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
235
236
237
238</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 235</span>
<span class='kw'>def</span> <span class='id identifier rubyid_from_s'>from_s</span><span class='lparen'>(</span><span class='id identifier rubyid_str'>str</span><span class='rparen'>)</span>
<span class='id identifier rubyid_reset'>reset</span>
<span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_str'>str</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="output_packet-instance_method">
#<strong>output_packet</strong>(ignore_chunk = false, headers_only: false) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Converts the packet to a string. If ignore_chunk is set the chunked encoding is omitted (for pretty print)</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 188</span>
<span class='kw'>def</span> <span class='id identifier rubyid_output_packet'>output_packet</span><span class='lparen'>(</span><span class='id identifier rubyid_ignore_chunk'>ignore_chunk</span> <span class='op'>=</span> <span class='kw'>false</span><span class='comma'>,</span> <span class='label'>headers_only:</span> <span class='kw'>false</span><span class='rparen'>)</span>
<span class='id identifier rubyid_content'>content</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span>
<span class='comment'># Update the content length field in the header with the body length.
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_content'>content</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='op'>!</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_compress'>compress</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
<span class='kw'>case</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_compress'>compress</span>
<span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>gzip</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Content-Encoding</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>gzip</span><span class='tstring_end'>&#39;</span></span>
<span class='id identifier rubyid_content'>content</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'>Text</span><span class='period'>.</span><span class='id identifier rubyid_gzip'>gzip</span><span class='lparen'>(</span><span class='id identifier rubyid_content'>content</span><span class='rparen'>)</span>
<span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>deflate</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Content-Encoding</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>deflate</span><span class='tstring_end'>&#39;</span></span>
<span class='id identifier rubyid_content'>content</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'>Text</span><span class='period'>.</span><span class='id identifier rubyid_zlib_deflate'>zlib_deflate</span><span class='lparen'>(</span><span class='id identifier rubyid_content'>content</span><span class='rparen'>)</span>
<span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>none</span><span class='tstring_end'>&#39;</span></span>
<span class='comment'># this one is fine...
</span> <span class='comment'># when &#39;compress&#39;
</span> <span class='kw'>else</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'>RuntimeError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Invalid Content-Encoding</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>unless</span> <span class='id identifier rubyid_ignore_chunk'>ignore_chunk</span>
<span class='kw'>if</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_auto_cl'>auto_cl</span> <span class='op'>&amp;&amp;</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'>RuntimeError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&#39;Content-Length&#39; and &#39;Transfer-Encoding: chunked&#39; are incompatible</span><span class='tstring_end'>&quot;</span></span>
<span class='kw'>end</span>
<span class='kw'>if</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_auto_cl'>auto_cl</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Content-Length</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_content'>content</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span>
<span class='kw'>elsif</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span>
<span class='kw'>if</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_proto'>proto</span> <span class='op'>!=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>1.1</span><span class='tstring_end'>&#39;</span></span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'>RuntimeError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Chunked encoding is only available via 1.1</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>end</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Transfer-Encoding</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>chunked</span><span class='tstring_end'>&#39;</span></span>
<span class='id identifier rubyid_content'>content</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_chunk'>chunk</span><span class='lparen'>(</span><span class='id identifier rubyid_content'>content</span><span class='comma'>,</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_chunk_min_size'>chunk_min_size</span><span class='comma'>,</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_chunk_max_size'>chunk_max_size</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='lparen'>(</span><span class='id identifier rubyid_cmd_string'>cmd_string</span><span class='rparen'>)</span>
<span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='id identifier rubyid_content'>content</span> <span class='op'>||</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span> <span class='kw'>unless</span> <span class='id identifier rubyid_headers_only'>headers_only</span>
<span class='id identifier rubyid_str'>str</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="parse-instance_method">
#<strong>parse</strong>(buf, opts = {}) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Parses the supplied buffer. Returns one of the two parser processing codes (Completed, Partial, or Error).</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>buf</span>
<span class='type'>(<tt>String</tt>)</span>
&mdash;
<div class='inline'>
<p>The buffer to parse; possibly not a complete request/response</p>
</div>
</li>
<li>
<span class='name'>opts</span>
<span class='type'>(<tt>Hash</tt>)</span>
<em class="default">(defaults to: <tt>{}</tt>)</em>
&mdash;
<div class='inline'>
<p>Parsing options</p>
</div>
</li>
<li>
<span class='name'>[Boolean]</span>
<span class='type'>(<tt>Hash</tt>)</span>
&mdash;
<div class='inline'>
<p>a customizable set of options</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 77</span>
<span class='kw'>def</span> <span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_buf'>buf</span><span class='comma'>,</span> <span class='id identifier rubyid_opts'>opts</span><span class='op'>=</span><span class='lbrace'>{</span><span class='rbrace'>}</span><span class='rparen'>)</span>
<span class='comment'># Append the incoming buffer to the buffer queue.
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span> <span class='op'>+=</span> <span class='id identifier rubyid_buf'>buf</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span>
<span class='kw'>begin</span>
<span class='comment'># Process the header
</span> <span class='kw'>if</span><span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>==</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#ProcessingHeader-constant" title="Rex::Proto::Http::Packet::ParseState::ProcessingHeader (constant)">ProcessingHeader</a></span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_parse_header'>parse_header</span><span class='lparen'>(</span><span class='id identifier rubyid_opts'>opts</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='comment'># Continue on to the body if the header was processed
</span> <span class='kw'>if</span><span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>==</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#ProcessingBody-constant" title="Rex::Proto::Http::Packet::ParseState::ProcessingBody (constant)">ProcessingBody</a></span></span><span class='rparen'>)</span>
<span class='comment'># Chunked encoding sets the parsing state on its own.
</span> <span class='comment'># HEAD requests can return immediately.
</span> <span class='id identifier rubyid_orig_method'>orig_method</span> <span class='op'>=</span> <span class='id identifier rubyid_opts'>opts</span><span class='period'>.</span><span class='id identifier rubyid_fetch'>fetch</span><span class='lparen'>(</span><span class='symbol'>:orig_method</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span> <span class='rbrace'>}</span>
<span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>==</span> <span class='int'>0</span> <span class='op'>&amp;&amp;</span> <span class='lparen'>(</span><span class='op'>!</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span> <span class='op'>||</span> <span class='id identifier rubyid_orig_method'>orig_method</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>HEAD</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#Completed-constant" title="Rex::Proto::Http::Packet::ParseState::Completed (constant)">Completed</a></span></span>
<span class='kw'>else</span>
<span class='id identifier rubyid_parse_body'>parse_body</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>rescue</span>
<span class='comment'># XXX: BUG: This rescue might be a problem because it will swallow TimeoutError
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_error'>error</span> <span class='op'>=</span> <span class='gvar'>$!</span>
<span class='kw'>return</span> <span class='const'><span class='object_link'><a href="Packet/ParseCode.html" title="Rex::Proto::Http::Packet::ParseCode (module)">ParseCode</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseCode.html#Error-constant" title="Rex::Proto::Http::Packet::ParseCode::Error (constant)">Error</a></span></span>
<span class='kw'>end</span>
<span class='comment'># Return completed or partial to the parsing status to the caller
</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>==</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#Completed-constant" title="Rex::Proto::Http::Packet::ParseState::Completed (constant)">Completed</a></span></span><span class='rparen'>)</span> <span class='op'>?</span> <span class='const'><span class='object_link'><a href="Packet/ParseCode.html" title="Rex::Proto::Http::Packet::ParseCode (module)">ParseCode</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseCode.html#Completed-constant" title="Rex::Proto::Http::Packet::ParseCode::Completed (constant)">Completed</a></span></span> <span class='op'>:</span> <span class='const'><span class='object_link'><a href="Packet/ParseCode.html" title="Rex::Proto::Http::Packet::ParseCode (module)">ParseCode</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseCode.html#Partial-constant" title="Rex::Proto::Http::Packet::ParseCode::Partial (constant)">Partial</a></span></span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="parse_body-instance_method">
#<strong>parse_body</strong> &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Parses the body portion of the request.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 359</span>
<span class='kw'>def</span> <span class='id identifier rubyid_parse_body'>parse_body</span>
<span class='comment'># Just return if the buffer is empty
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span> <span class='op'>==</span> <span class='int'>0</span><span class='rparen'>)</span>
<span class='kw'>return</span>
<span class='kw'>end</span>
<span class='comment'># Handle chunked transfer-encoding responses
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span> <span class='kw'>and</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_inside_chunk'>inside_chunk</span> <span class='op'>!=</span> <span class='int'>1</span> <span class='kw'>and</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span><span class='rparen'>)</span>
<span class='comment'># Remove any leading newlines or spaces
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_lstrip!'>lstrip!</span>
<span class='comment'># If we didn&#39;t get a newline, then this might not be the full
</span> <span class='comment'># length, go back and get more.
</span> <span class='comment'># e.g.
</span> <span class='comment'># first packet: &quot;200&quot;
</span> <span class='comment'># second packet: &quot;0\r\n\r\n&lt;html&gt;...&quot;
</span> <span class='kw'>if</span> <span class='kw'>not</span> <span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_index'>index</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
<span class='kw'>return</span>
<span class='kw'>end</span>
<span class='comment'># Extract the actual hexadecimal length value
</span> <span class='id identifier rubyid_clen'>clen</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_slice!'>slice!</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^[a-fA-F0-9]+\r?\n</span><span class='regexp_end'>/</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_clen'>clen</span><span class='period'>.</span><span class='id identifier rubyid_rstrip!'>rstrip!</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_clen'>clen</span><span class='rparen'>)</span>
<span class='comment'># if we happen to fall upon the end of the buffer for the next chunk len and have no data left, go get some more...
</span> <span class='kw'>if</span> <span class='id identifier rubyid_clen'>clen</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span> <span class='kw'>and</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span> <span class='op'>==</span> <span class='int'>0</span>
<span class='kw'>return</span>
<span class='kw'>end</span>
<span class='comment'># Invalid chunk length, exit out early
</span> <span class='kw'>if</span> <span class='id identifier rubyid_clen'>clen</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#Completed-constant" title="Rex::Proto::Http::Packet::ParseState::Completed (constant)">Completed</a></span></span>
<span class='kw'>return</span>
<span class='kw'>end</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>=</span> <span class='id identifier rubyid_clen'>clen</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='lparen'>(</span><span class='int'>16</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>==</span> <span class='int'>0</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_sub!'>sub!</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^\r?\n</span><span class='regexp_end'>/s</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#Completed-constant" title="Rex::Proto::Http::Packet::ParseState::Completed (constant)">Completed</a></span></span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_check_100'>check_100</span>
<span class='kw'>return</span>
<span class='kw'>end</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_inside_chunk'>inside_chunk</span> <span class='op'>=</span> <span class='int'>1</span>
<span class='kw'>end</span>
<span class='comment'># If there are bytes remaining, slice as many as we can and append them
</span> <span class='comment'># to our body state.
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>&gt;</span> <span class='int'>0</span><span class='rparen'>)</span>
<span class='id identifier rubyid_part'>part</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_slice!'>slice!</span><span class='lparen'>(</span><span class='int'>0</span><span class='comma'>,</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='op'>+=</span> <span class='id identifier rubyid_part'>part</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>-=</span> <span class='id identifier rubyid_part'>part</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span>
<span class='comment'># Otherwise, just read it all.
</span> <span class='kw'>else</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='op'>+=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>end</span>
<span class='comment'># Finish this chunk and move on to the next one
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span> <span class='kw'>and</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>==</span> <span class='int'>0</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_inside_chunk'>inside_chunk</span> <span class='op'>=</span> <span class='int'>0</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_parse_body'>parse_body</span>
<span class='kw'>return</span>
<span class='kw'>end</span>
<span class='comment'># If there are no more bytes left, then parsing has completed and we&#39;re
</span> <span class='comment'># ready to go.
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>not</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span> <span class='kw'>and</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>==</span> <span class='int'>0</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#Completed-constant" title="Rex::Proto::Http::Packet::ParseState::Completed (constant)">Completed</a></span></span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_check_100'>check_100</span>
<span class='kw'>return</span>
<span class='kw'>end</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="parse_header-instance_method">
#<strong>parse_header</strong>(opts) &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Parse the HTTP header returned by the target server.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>opts</span>
<span class='type'>(<tt>Hash</tt>)</span>
&mdash;
<div class='inline'>
<p>Parsing options</p>
</div>
</li>
<li>
<span class='name'>[Boolean]</span>
<span class='type'>(<tt>Hash</tt>)</span>
&mdash;
<div class='inline'>
<p>a customizable set of options</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 293</span>
<span class='kw'>def</span> <span class='id identifier rubyid_parse_header'>parse_header</span><span class='lparen'>(</span><span class='id identifier rubyid_opts'>opts</span><span class='rparen'>)</span>
<span class='id identifier rubyid_head'>head</span><span class='comma'>,</span><span class='id identifier rubyid_data'>data</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>\r?\n\r?\n</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='int'>2</span><span class='rparen'>)</span>
<span class='kw'>return</span> <span class='kw'>if</span> <span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_from_s'>from_s</span><span class='lparen'>(</span><span class='id identifier rubyid_head'>head</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span> <span class='op'>=</span> <span class='id identifier rubyid_data'>data</span> <span class='op'>||</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_end'>&quot;</span></span>
<span class='comment'># Set the content-length to -1 as a placeholder (read until EOF)
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>=</span> <span class='op'>-</span><span class='int'>1</span>
<span class='id identifier rubyid_orig_method'>orig_method</span> <span class='op'>=</span> <span class='id identifier rubyid_opts'>opts</span><span class='period'>.</span><span class='id identifier rubyid_fetch'>fetch</span><span class='lparen'>(</span><span class='symbol'>:orig_method</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span> <span class='rbrace'>}</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>=</span> <span class='int'>0</span> <span class='kw'>if</span> <span class='id identifier rubyid_orig_method'>orig_method</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>HEAD</span><span class='tstring_end'>&#39;</span></span>
<span class='comment'># Extract the content length if it was specified (ignoring it for HEAD requests, per RFC9110)
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Content-Length</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_orig_method'>orig_method</span> <span class='op'>!=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>HEAD</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Content-Length</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span>
<span class='kw'>end</span>
<span class='comment'># Look for a chunked transfer header
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Transfer-Encoding</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>chunked</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span> <span class='op'>=</span> <span class='kw'>true</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_auto_cl'>auto_cl</span> <span class='op'>=</span> <span class='kw'>false</span>
<span class='kw'>end</span>
<span class='comment'># Determine how to handle data when there is no length header
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>==</span> <span class='op'>-</span><span class='int'>1</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>not</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Connection</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>keep-alive</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='rparen'>)</span>
<span class='comment'># If we are using keep-alive, but have no content-length and
</span> <span class='comment'># no chunked transfer header, pretend this is the entire
</span> <span class='comment'># buffer and call it done
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span>
<span class='kw'>elsif</span> <span class='lparen'>(</span><span class='kw'>not</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Content-Length</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='kw'>and</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'><span class='object_link'><a href="../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../Proto.html" title="Rex::Proto (module)">Proto</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../Http.html" title="Rex::Proto::Http (module)">Http</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Request.html" title="Rex::Proto::Http::Request (class)">Request</a></span></span><span class='rparen'>)</span>
<span class='comment'># RFC 2616 says: &quot;The presence of a message-body in a request
</span> <span class='comment'># is signaled by the inclusion of a Content-Length or
</span> <span class='comment'># Transfer-Encoding header field in the request&#39;s
</span> <span class='comment'># message-headers.&quot;
</span> <span class='comment'>#
</span> <span class='comment'># So if we haven&#39;t seen either a Content-Length or a
</span> <span class='comment'># Transfer-Encoding header, there shouldn&#39;t be a message body.
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>=</span> <span class='int'>0</span>
<span class='kw'>elsif</span> <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Connection</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='op'>&amp;.</span><span class='id identifier rubyid_downcase'>downcase</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>upgrade</span><span class='tstring_end'>&#39;</span></span> <span class='op'>&amp;&amp;</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Upgrade</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='op'>&amp;.</span><span class='id identifier rubyid_downcase'>downcase</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>websocket</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='comment'># The server appears to be responding to a websocket request
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body_bytes_left'>body_bytes_left</span> <span class='op'>=</span> <span class='int'>0</span>
<span class='comment'>#else
</span> <span class='comment'># Otherwise we need to keep reading until EOF
</span> <span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='comment'># Throw an error if we didnt parse the header properly
</span> <span class='kw'>if</span> <span class='op'>!</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_cmd_string'>cmd_string</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'>RuntimeError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Invalid command string</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='id identifier rubyid_caller'>caller</span>
<span class='kw'>end</span>
<span class='comment'># Move the state into body processing
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#ProcessingBody-constant" title="Rex::Proto::Http::Packet::ParseState::ProcessingBody (constant)">ProcessingBody</a></span></span>
<span class='comment'># Allow derived classes to update the parts of the command string
</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_update_cmd_parts'>update_cmd_parts</span><span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_cmd_string'>cmd_string</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="reset-instance_method">
#<strong>reset</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Reset the parsing state and buffers.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
113
114
115
116
117
118
119
120</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 113</span>
<span class='kw'>def</span> <span class='id identifier rubyid_reset'>reset</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#ProcessingHeader-constant" title="Rex::Proto::Http::Packet::ParseState::ProcessingHeader (constant)">ProcessingHeader</a></span></span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span> <span class='op'>=</span> <span class='kw'>false</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_inside_chunk'>inside_chunk</span> <span class='op'>=</span> <span class='kw'>false</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_reset'>reset</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_bufq'>bufq</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="reset_except_queue-instance_method">
#<strong>reset_except_queue</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Reset the parsing state but leave the buffers.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
125
126
127
128
129
130
131</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 125</span>
<span class='kw'>def</span> <span class='id identifier rubyid_reset_except_queue'>reset_except_queue</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_state'>state</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Packet/ParseState.html" title="Rex::Proto::Http::Packet::ParseState (module)">ParseState</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Packet/ParseState.html#ProcessingHeader-constant" title="Rex::Proto::Http::Packet::ParseState::ProcessingHeader (constant)">ProcessingHeader</a></span></span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_transfer_chunked'>transfer_chunked</span> <span class='op'>=</span> <span class='kw'>false</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_inside_chunk'>inside_chunk</span> <span class='op'>=</span> <span class='kw'>false</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='period'>.</span><span class='id identifier rubyid_reset'>reset</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="to_s-instance_method">
#<strong>to_s</strong>(headers_only: false) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Converts the packet to a string.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
180
181
182</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 180</span>
<span class='kw'>def</span> <span class='id identifier rubyid_to_s'>to_s</span><span class='lparen'>(</span><span class='label'>headers_only:</span> <span class='kw'>false</span><span class='rparen'>)</span>
<span class='id identifier rubyid_output_packet'>output_packet</span><span class='lparen'>(</span><span class='kw'>false</span><span class='comma'>,</span> <span class='label'>headers_only:</span> <span class='id identifier rubyid_headers_only'>headers_only</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="to_terminal_output-instance_method">
#<strong>to_terminal_output</strong>(headers_only: false) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Outputs a readable string of the packet for terminal output</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
173
174
175</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 173</span>
<span class='kw'>def</span> <span class='id identifier rubyid_to_terminal_output'>to_terminal_output</span><span class='lparen'>(</span><span class='label'>headers_only:</span> <span class='kw'>false</span><span class='rparen'>)</span>
<span class='id identifier rubyid_output_packet'>output_packet</span><span class='lparen'>(</span><span class='kw'>true</span><span class='comma'>,</span> <span class='label'>headers_only:</span> <span class='id identifier rubyid_headers_only'>headers_only</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="update_cmd_parts-instance_method">
#<strong>update_cmd_parts</strong>(str) &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Allows derived classes to split apart the command string.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
283
284</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/packet.rb', line 283</span>
<span class='kw'>def</span> <span class='id identifier rubyid_update_cmd_parts'>update_cmd_parts</span><span class='lparen'>(</span><span class='id identifier rubyid_str'>str</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
</div>
</div>
<div id="footer">
Generated on Fri May 8 17:04:11 2026 by
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
0.9.37 (ruby-3.1.5).
</div>
</div>
</body>
</html>