zeek/auxil/libunistd/qdecoder/doc/html/qcgireq_8c.html
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

247 lines
17 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-------------------------------------------------------------->
<!-- qDecoder Project -->
<!-- -->
<!-- Copyright (c) The qDecoder Project -->
<!-- http://www.qdecoder.org -->
<!-------------------------------------------------------------->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>qcgireq.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<center><h1>qDecoder API Reference</h1></center>
<!-- Generated by Doxygen 1.8.2 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">qcgireq.c File Reference</div> </div>
</div><!--header-->
<div class="contents">
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>CGI Request Parsing API. </p>
<p>qDecoder supports parsing of</p>
<ul>
<li>COOKIE </li>
<li>GET method </li>
<li>POST method (application/x-www-form-urlencoded: default FORM encoding) </li>
<li>POST method (multipart/form-data: especially used for file uploading)</li>
</ul>
<p>And parsed elements are stored in qentry_t linked-list structure.</p>
<div class="fragment"><div class="line">[HTML sample]</div>
<div class="line">&lt;form action=<span class="stringliteral">&quot;your_program.cgi&quot;</span>&gt;</div>
<div class="line"> &lt;input type=<span class="stringliteral">&quot;text&quot;</span> name=<span class="stringliteral">&quot;color&quot;</span>&gt;</div>
<div class="line"> &lt;input type=<span class="stringliteral">&quot;submit&quot;</span>&gt;</div>
<div class="line">&lt;/form&gt;</div>
<div class="line"></div>
<div class="line">[Your Source]</div>
<div class="line"><a class="code" href="structqentry__s.html">qentry_t</a> *req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(NULL, 0); <span class="comment">// 0 is equivalent to Q_CGI_ALL.</span></div>
<div class="line"></div>
<div class="line"><a class="code" href="qcgires_8c.html#a5f6be1dd6d4ffb9be553339d95b1de2b" title="Set responding content-type.">qcgires_setcontenttype</a>(req, <span class="stringliteral">&quot;text/plain&quot;</span>);</div>
<div class="line"><span class="keywordtype">char</span> *color = req-&gt;getstr(req, <span class="stringliteral">&quot;color&quot;</span>, <span class="keyword">false</span>);</div>
<div class="line"><span class="keywordflow">if</span> (color != NULL) {</div>
<div class="line"> printf(<span class="stringliteral">&quot;Color = %s\n&quot;</span>, color);</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line">req-&gt;free(req);</div>
</div><!-- fragment --><p>The order of parsing sequence is (1)COOKIE (2)POST (3)GET. Thus if there is a same query name existing in different methods, COOKIE values will be stored first than POST, GET values will be added at the very last into a qentry linked-list.</p>
<p>Below is an example to parse only two given methods. Please note that when multiple methods are specified, it'll be parsed in the order of COOKIE, POST and GET.</p>
<div class="fragment"><div class="line"><a class="code" href="structqentry__s.html">qentry_t</a> *req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(req, Q_CGI_COOKIE | Q_CGI_POST);</div>
</div><!-- fragment --><p>To change the order of parsing sequence, you can call <a class="el" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse()</a> multiple times in the order that you want as below.</p>
<div class="fragment"><div class="line"><a class="code" href="structqentry__s.html">qentry_t</a> *req;</div>
<div class="line">req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(req, Q_CGI_POST);</div>
<div class="line">req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(req, Q_CGI_GET);</div>
<div class="line">req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(req, Q_CGI_COOKIE);</div>
</div><!-- fragment --><p>In terms of multipart/form-data encoding(used for file uploading), qDecoder can handle that in two different ways internally.</p>
<ul>
<li><b>default mode</b> : Uploading file will be processed only in memory. (see examples/upload.c) </li>
<li><b>file mode</b> : Uploading file will be stored directly into disk. (see examples/uploadfile.c)</li>
</ul>
<p>You can switch to file mode by calling <a class="el" href="qcgireq_8c.html#a4a33fd9f17145e0fcdc61b6907f130e4" title="Set request parsing option for file uploading in case of multipart/form-data encoding.">qcgireq_setoption()</a>. </p>
<div class="fragment"><div class="line"><a class="code" href="structqentry__s.html">qentry_t</a> *req = <a class="code" href="qcgireq_8c.html#a4a33fd9f17145e0fcdc61b6907f130e4" title="Set request parsing option for file uploading in case of multipart/form-data encoding.">qcgireq_setoption</a>(NULL, <span class="keyword">true</span>, <span class="stringliteral">&quot;/tmp&quot;</span>, 86400);</div>
<div class="line">req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(req, 0);</div>
<div class="line">(...your codes here...)</div>
<div class="line">req-&gt;free(req);</div>
</div><!-- fragment --><p>Basically, when file is uploaded qDecoder store it's meta information like below. </p>
<ul>
<li>(VARIABLE_NAME) - In the <b>default mode</b>, this is binary data. In the <b>file mode</b> this value is same as "(VARIABLE_NAME).savepath". </li>
<li>(VARIABLE_NAME).filename - File name itself, path info will be removed. </li>
<li>(VARIABLE_NAME).length - File size, the number of bytes. </li>
<li>(VARIABLE_NAME).contenttype - Mime type like 'text/plain'. </li>
<li>(VARIABLE_NAME).savepath - Only appended only in <b>file mode</b>. The file path where the uploaded file is saved.</li>
</ul>
<div class="fragment"><div class="line">[<span class="keywordflow">default</span> mode example]</div>
<div class="line">binary = (...binary data...)</div>
<div class="line">binary.filename = hello.xls</div>
<div class="line">binary.length = 3292</div>
<div class="line">binary.contenttype = application/vnd.ms-excel</div>
<div class="line"></div>
<div class="line">[file mode example]</div>
<div class="line">binary = tmp/q_wcktIq</div>
<div class="line">binary.length = 60014</div>
<div class="line">binary.filename = hello.xls</div>
<div class="line">binary.contenttype = application/vnd.ms-excel</div>
<div class="line">binary.savepath = tmp/q_wcktIq</div>
</div><!-- fragment --> </div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:a4a33fd9f17145e0fcdc61b6907f130e4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structqentry__s.html">qentry_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qcgireq_8c.html#a4a33fd9f17145e0fcdc61b6907f130e4">qcgireq_setoption</a> (<a class="el" href="structqentry__s.html">qentry_t</a> *request, bool filemode, const char *basepath, int clearold)</td></tr>
<tr class="memdesc:a4a33fd9f17145e0fcdc61b6907f130e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set request parsing option for file uploading in case of multipart/form-data encoding. <a href="#a4a33fd9f17145e0fcdc61b6907f130e4"></a><br/></td></tr>
<tr class="separator:a4a33fd9f17145e0fcdc61b6907f130e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa6f632664932495df12271c427e83b3d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structqentry__s.html">qentry_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d">qcgireq_parse</a> (<a class="el" href="structqentry__s.html">qentry_t</a> *request, Q_CGI_T method)</td></tr>
<tr class="memdesc:aa6f632664932495df12271c427e83b3d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parse one or more request(COOKIE/POST/GET) queries. <a href="#aa6f632664932495df12271c427e83b3d"></a><br/></td></tr>
<tr class="separator:aa6f632664932495df12271c427e83b3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a013152489ce3d964811704897a77fc20"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qcgireq_8c.html#a013152489ce3d964811704897a77fc20">qcgireq_getquery</a> (Q_CGI_T method)</td></tr>
<tr class="memdesc:a013152489ce3d964811704897a77fc20"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get raw query string. <a href="#a013152489ce3d964811704897a77fc20"></a><br/></td></tr>
<tr class="separator:a013152489ce3d964811704897a77fc20"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h2 class="groupheader">Function Documentation</h2>
<a class="anchor" id="a4a33fd9f17145e0fcdc61b6907f130e4"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structqentry__s.html">qentry_t</a>* qcgireq_setoption </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structqentry__s.html">qentry_t</a> *&#160;</td>
<td class="paramname"><em>request</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>filemode</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>basepath</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>clearold</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Set request parsing option for file uploading in case of multipart/form-data encoding. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">request</td><td>qentry_t container pointer that options will be set. NULL can be used to create a new container. </td></tr>
<tr><td class="paramname">filemode</td><td>false for parsing in memory, true for storing attached files into file-system directly. </td></tr>
<tr><td class="paramname">basepath</td><td>the base path where the uploaded files are located. Set to NULL if filemode is false. </td></tr>
<tr><td class="paramname">clearold</td><td>saved files older than this seconds will be removed automatically. Set to 0 to disable.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>qentry_t container pointer, otherwise returns NULL.</dd></dl>
<dl class="section note"><dt>Note</dt><dd>This method should be called before calling <a class="el" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse()</a>.</dd></dl>
<div class="fragment"><div class="line"><a class="code" href="structqentry__s.html">qentry_t</a> *req = <a class="code" href="qcgireq_8c.html#a4a33fd9f17145e0fcdc61b6907f130e4" title="Set request parsing option for file uploading in case of multipart/form-data encoding.">qcgireq_setoption</a>(NULL, <span class="keyword">true</span>, <span class="stringliteral">&quot;/tmp&quot;</span>, 86400);</div>
<div class="line">req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(req, 0);</div>
<div class="line">req-&gt;free(req);</div>
</div><!-- fragment -->
</div>
</div>
<a class="anchor" id="aa6f632664932495df12271c427e83b3d"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structqentry__s.html">qentry_t</a>* qcgireq_parse </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structqentry__s.html">qentry_t</a> *&#160;</td>
<td class="paramname"><em>request</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">Q_CGI_T&#160;</td>
<td class="paramname"><em>method</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Parse one or more request(COOKIE/POST/GET) queries. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">request</td><td>qentry_t container pointer that parsed key/value pairs will be stored. NULL can be used to create a new container. </td></tr>
<tr><td class="paramname">method</td><td>Target mask consists of one or more of Q_CGI_COOKIE, Q_CGI_POST and Q_CGI_GET. Q_CGI_ALL or 0 can be used for parsing all of those types.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>qentry_t* handle if successful, NULL if there was insufficient memory to allocate a new object.</dd></dl>
<div class="fragment"><div class="line"><a class="code" href="structqentry__s.html">qentry_t</a> *req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(NULL, 0);</div>
</div><!-- fragment --><div class="fragment"><div class="line"><a class="code" href="structqentry__s.html">qentry_t</a> *req = <a class="code" href="qcgireq_8c.html#aa6f632664932495df12271c427e83b3d" title="Parse one or more request(COOKIE/POST/GET) queries.">qcgireq_parse</a>(req, Q_CGI_COOKIE | Q_CGI_POST);</div>
</div><!-- fragment --><dl class="section note"><dt>Note</dt><dd>When multiple methods are specified, it'll be parsed in the order of (1)COOKIE, (2)POST (3)GET unless you call it separately multiple times. </dd></dl>
</div>
</div>
<a class="anchor" id="a013152489ce3d964811704897a77fc20"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">char* qcgireq_getquery </td>
<td>(</td>
<td class="paramtype">Q_CGI_T&#160;</td>
<td class="paramname"><em>method</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Get raw query string. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">method</td><td>One of Q_CGI_COOKIE, Q_CGI_POST or Q_CGI_GET.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>malloced query string otherwise returns NULL;</dd></dl>
<div class="fragment"><div class="line"><span class="keywordtype">char</span> *query = <a class="code" href="qcgireq_8c.html#a013152489ce3d964811704897a77fc20" title="Get raw query string.">qcgireq_getquery</a>(Q_CGI_GET);</div>
<div class="line"><span class="keywordflow">if</span>(query != NULL) {</div>
<div class="line"> printf(<span class="stringliteral">&quot;%s\n&quot;</span>, query);</div>
<div class="line"> free(query);</div>
<div class="line">}</div>
</div><!-- fragment -->
</div>
</div>
</div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
<a href="http://www.qdecoder.org/">The qDecoder Project</a>.
Sat Mar 22 2014 07:44:36
</small></address>
</body>
</html>