UNPKG

connect-form

Version:

urlencoded / multipart form parsing middleware for Connect

662 lines (602 loc) 155 kB
<html> <head> <title>Connect</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <style>body { margin: 0; padding: 0; font: 14px/1.5 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; color: #252519; } a { color: #252519; } a:hover { text-decoration: underline; color: #19469D; } p { margin: 12px 0; } h1, h2, h3 { margin: 0; padding: 0; } table#source { width: 100%; border-collapse: collapse; } table#source td:first-child { padding: 30px 40px 30px 40px; vertical-align: top; } table#source td:first-child, table#source td:first-child pre { width: 450px; } table#source td:last-child { padding: 30px 0 30px 40px; border-left: 1px solid #E5E5EE; background: #F5F5FF; } table#source tr { border-bottom: 1px solid #E5E5EE; } table#source tr.filename { padding-top: 40px; border-top: 1px solid #E5E5EE; } table#source tr.filename td:first-child { text-transform: capitalize; } table#source tr.filename td:last-child { font-size: 12px; } table#source tr.filename h2 { margin: 0; padding: 0; cursor: pointer; } table#source tr.code h1, table#source tr.code h2, table#source tr.code h3 { margin-top: 30px; font-family: "Lucida Grande", "Helvetica Nueue", Arial, sans-serif; font-size: 18px; } table#source tr.code h2 { font-size: 16px; } table#source tr.code h3 { font-size: 14px; } table#source tr.code ul { margin: 15px 0 15px 35px; padding: 0; } table#source tr.code ul li { margin: 0; padding: 1px 0; } table#source tr.code ul li p { margin: 0; padding: 0; } table#source tr.code td:first-child pre { padding: 20px; } #ribbon { position: fixed; top: 0; right: 0; } code .string { color: #219161; } code .regexp { color: #219161; } code .keyword { color: #954121; } code .number { color: #19469D; } code .comment { color: #bbb; } code .this { color: #19469D; }</style> <script> $(function(){ $('tr.code').hide(); $('tr.filename').toggle(function(){ $(this).nextUntil('.filename').fadeIn(); }, function(){ $(this).nextUntil('.filename').fadeOut(); }); }); </script> </head> <body> <table id="source"><tbody><tr><td><h1>Connect</h1><p>High performance middleware for <a href="http://nodejs.org">node</a>.</p></td><td></td></tr><tr class="filename"><td><h2 id="lib/connect/middleware/bodyDecoder.js"><a href="#">bodyDecoder</a></h2></td><td>lib/connect/middleware/bodyDecoder.js</td></tr><tr class="code"> <td class="docs"> <p>Module dependencies. </p> </td> <td class="code"> <pre><code><span class="keyword">var</span> <span class="variable">queryString</span> = <span class="variable">require</span>(<span class="string">'querystring'</span>);</code></pre> </td> </tr> <tr class="code"> <td class="docs"> <p>Supported decoders.</p> <ul><li>application/x-www-form-urlencoded</li><li>application/json</li></ul> </td> <td class="code"> <pre><code><span class="variable">exports</span>.<span class="variable">decode</span> = { <span class="string">'application/x-www-form-urlencoded'</span>: <span class="variable">queryString</span>.<span class="variable">parse</span>, <span class="string">'application/json'</span>: <span class="class">JSON</span>.<span class="variable">parse</span> };</code></pre> </td> </tr> <tr class="code"> <td class="docs"> <p>Decode request bodies.</p> <h2></h2> <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul> </td> <td class="code"> <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">bodyDecoder</span>(){ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">bodyDecoder</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) { <span class="keyword">var</span> <span class="variable">decoder</span> = <span class="variable">exports</span>.<span class="variable">decode</span>[<span class="variable">mime</span>(<span class="variable">req</span>)]; <span class="keyword">if</span> (<span class="variable">decoder</span>) { <span class="keyword">var</span> <span class="variable">data</span> = <span class="string">''</span>; <span class="variable">req</span>.<span class="variable">setEncoding</span>(<span class="string">'utf8'</span>); <span class="variable">req</span>.<span class="variable">addListener</span>(<span class="string">'data'</span>, <span class="keyword">function</span>(<span class="variable">chunk</span>) { <span class="variable">data</span> += <span class="variable">chunk</span>; }); <span class="variable">req</span>.<span class="variable">addListener</span>(<span class="string">'end'</span>, <span class="keyword">function</span>() { <span class="variable">req</span>.<span class="variable">rawBody</span> = <span class="variable">data</span>; <span class="keyword">try</span> { <span class="variable">req</span>.<span class="variable">body</span> = <span class="variable">data</span> ? <span class="variable">decoder</span>(<span class="variable">data</span>) : {}; } <span class="keyword">catch</span> (<span class="variable">err</span>) { <span class="keyword">return</span> <span class="variable">next</span>(<span class="variable">err</span>); } <span class="variable">next</span>(); }); } <span class="keyword">else</span> { <span class="variable">next</span>(); } } };</code></pre> </td> </tr><tr class="filename"><td><h2 id="lib/connect/middleware/cache.js"><a href="#">cache</a></h2></td><td>lib/connect/middleware/cache.js</td></tr><tr class="code"> <td class="docs"> <p>Module dependencies. </p> </td> <td class="code"> <pre><code><span class="keyword">var</span> <span class="class">Buffer</span> = <span class="variable">require</span>(<span class="string">'buffer'</span>).<span class="class">Buffer</span>;</code></pre> </td> </tr> <tr class="code"> <td class="docs"> <p>Cache in memory for the given <code>cacheDuration</code>.</p> <h2></h2> <ul><li><p><strong>param</strong>: <em>Number</em> cacheDuration</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul> </td> <td class="code"> <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">cache</span>(<span class="variable">cacheDuration</span>){ <span class="keyword">var</span> <span class="variable">cache</span> = {}, <span class="variable">queue</span> = {}; <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">cache</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) { <span class="comment">// Skip all requests that are not GET method</span> <span class="keyword">if</span> (<span class="variable">req</span>.<span class="variable">method</span> !== &<span class="variable">quot</span>;<span class="class">GET</span>&<span class="variable">quot</span>;) { <span class="variable">next</span>(); <span class="keyword">return</span>; } <span class="keyword">var</span> <span class="variable">key</span> = <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="variable">accept</span>-<span class="variable">encoding</span>&<span class="variable">quot</span>;] + <span class="variable">req</span>.<span class="variable">url</span>, <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>, <span class="variable">write</span> = <span class="variable">res</span>.<span class="variable">write</span>, <span class="variable">end</span> = <span class="variable">res</span>.<span class="variable">end</span>, <span class="variable">code</span>, <span class="variable">headers</span>, <span class="variable">chunks</span> = [], <span class="variable">totalSize</span> = <span class="number integer">0</span>; <span class="keyword">function</span> <span class="variable">serve</span>() { <span class="keyword">var</span> <span class="variable">resp</span> = <span class="variable">cache</span>[<span class="variable">key</span>]; <span class="keyword">var</span> <span class="variable">headers</span> = <span class="variable">resp</span>.<span class="variable">headers</span>; <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Date</span>&<span class="variable">quot</span>;] = (<span class="keyword">new</span> <span class="class">Date</span>).<span class="variable">toUTCString</span>(); <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Length</span>&<span class="variable">quot</span>;] = <span class="variable">resp</span>.<span class="variable">body</span>.<span class="variable">length</span>; <span class="keyword">if</span> (<span class="variable">localQueue</span>) { <span class="comment">// Send everyone in the wait queue the response.</span> <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">l</span> = <span class="variable">localQueue</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">l</span>; <span class="variable">i</span>++) { <span class="keyword">var</span> <span class="variable">localRes</span> = <span class="variable">localQueue</span>[<span class="variable">i</span>]; <span class="variable">localRes</span>.<span class="variable">writeHead</span>(<span class="variable">resp</span>.<span class="variable">code</span>, <span class="variable">headers</span>); <span class="variable">localRes</span>.<span class="variable">end</span>(<span class="variable">resp</span>.<span class="variable">body</span>); } <span class="comment">// Kill the wait queue</span> <span class="keyword">delete</span> <span class="variable">queue</span>[<span class="variable">key</span>]; } <span class="keyword">else</span> { <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">resp</span>.<span class="variable">code</span>, <span class="variable">headers</span>); <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">resp</span>.<span class="variable">body</span>); } } <span class="comment">// If there is a cache-hit, serve it right away!</span> <span class="keyword">if</span> (<span class="variable">cache</span>[<span class="variable">key</span>]) { <span class="variable">serve</span>(); <span class="keyword">return</span>; } <span class="keyword">var</span> <span class="variable">localQueue</span> = <span class="variable">queue</span>[<span class="variable">key</span>]; <span class="keyword">if</span> (<span class="variable">localQueue</span>) { <span class="variable">localQueue</span>[<span class="variable">localQueue</span>.<span class="variable">length</span>] = <span class="variable">res</span>; <span class="keyword">return</span>; } <span class="variable">localQueue</span> = <span class="variable">queue</span>[<span class="variable">key</span>] = [<span class="variable">res</span>]; <span class="comment">// Defer the call to writeHead</span> <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span> (<span class="variable">setCode</span>, <span class="variable">setHeaders</span>) { <span class="variable">code</span> = <span class="variable">setCode</span>; <span class="variable">headers</span> = <span class="variable">setHeaders</span>; }; <span class="comment">// Buffer the response body as an array of Buffer objects</span> <span class="variable">res</span>.<span class="variable">write</span> = <span class="keyword">function</span> (<span class="variable">chunk</span>, <span class="variable">encoding</span>) { <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">chunk</span> === <span class="string">'string'</span>) { <span class="keyword">var</span> <span class="variable">length</span>; <span class="keyword">if</span> (!<span class="variable">encoding</span> || <span class="variable">encoding</span> === <span class="string">'utf8'</span>) { <span class="variable">length</span> = <span class="class">Buffer</span>.<span class="variable">byteLength</span>(<span class="variable">chunk</span>); } <span class="keyword">var</span> <span class="variable">buffer</span> = <span class="keyword">new</span> <span class="class">Buffer</span>(<span class="variable">length</span>); <span class="variable">buffer</span>.<span class="variable">write</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>); <span class="variable">chunks</span>.<span class="variable">push</span>(<span class="variable">buffer</span>); } <span class="keyword">else</span> { <span class="variable">chunks</span>.<span class="variable">push</span>(<span class="variable">chunk</span>); } <span class="variable">totalSize</span> += <span class="variable">chunk</span>.<span class="variable">length</span>; }; <span class="variable">res</span>.<span class="variable">end</span> = <span class="keyword">function</span> (<span class="variable">chunk</span>, <span class="variable">encoding</span>) { <span class="keyword">if</span> (<span class="variable">chunk</span>) { <span class="variable">res</span>.<span class="variable">write</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>); } <span class="comment">// Combine the buffer array into a single buffer</span> <span class="keyword">var</span> <span class="variable">body</span> = <span class="keyword">new</span> <span class="class">Buffer</span>(<span class="variable">totalSize</span>); <span class="keyword">var</span> <span class="variable">offset</span> = <span class="number integer">0</span>; <span class="variable">chunks</span>.<span class="variable">forEach</span>(<span class="keyword">function</span> (<span class="variable">chunk</span>) { <span class="variable">chunk</span>.<span class="variable">copy</span>(<span class="variable">body</span>, <span class="variable">offset</span>); <span class="variable">offset</span> += <span class="variable">chunk</span>.<span class="variable">length</span>; }); <span class="comment">// Store the result in the cache</span> <span class="variable">cache</span>[<span class="variable">key</span>] = { <span class="variable">body</span>: <span class="variable">body</span>, <span class="variable">code</span>: <span class="variable">code</span>, <span class="variable">headers</span>: <span class="variable">headers</span> }; <span class="comment">// Put the original methods back in place</span> <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>; <span class="variable">res</span>.<span class="variable">write</span> = <span class="variable">write</span>; <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>; <span class="comment">// Serve the response from the cache</span> <span class="variable">serve</span>(); <span class="keyword">if</span> (<span class="variable">cacheDuration</span>) { <span class="comment">// Expire the ram cache after 100ms or the specified length</span> <span class="variable">setTimeout</span>(<span class="keyword">function</span>(){ <span class="keyword">delete</span> <span class="variable">cache</span>[<span class="variable">key</span>]; }, <span class="variable">cacheDuration</span>); } <span class="keyword">else</span> { <span class="comment">// When the timeout is zero, just kill it right away</span> <span class="keyword">delete</span> <span class="variable">cache</span>[<span class="variable">key</span>]; } }; <span class="variable">next</span>(); }; };</code></pre> </td> </tr><tr class="filename"><td><h2 id="lib/connect/middleware/cacheManifest.js"><a href="#">cacheManifest</a></h2></td><td>lib/connect/middleware/cacheManifest.js</td></tr><tr class="code"> <td class="docs"> <p>Module dependencies. </p> </td> <td class="code"> <pre><code><span class="keyword">var</span> <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>), <span class="class">Utils</span> = <span class="variable">require</span>(<span class="string">'../utils'</span>), <span class="class">Url</span> = <span class="variable">require</span>(<span class="string">'url'</span>), <span class="class">Path</span> = <span class="variable">require</span>(<span class="string">'path'</span>);</code></pre> </td> </tr> <tr class="code"> <td class="docs"> <p>Generate cache manifest for the given <code>root</code>, <code>networks</code>, and <code>fallbacks</code>.</p> <h2></h2> <ul><li><p><strong>param</strong>: <em>String</em> root</p></li><li><p><strong>param</strong>: <em>Array</em> networks</p></li><li><p><strong>param</strong>: <em>Array</em> fallbacks</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul> </td> <td class="code"> <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">cacheManifest</span>(<span class="variable">root</span>, <span class="variable">networks</span>, <span class="variable">fallbacks</span>) { <span class="variable">root</span> = <span class="variable">root</span> || <span class="variable">process</span>.<span class="variable">cwd</span>(); <span class="keyword">var</span> <span class="variable">suffix</span> = &<span class="variable">quot</span>;&<span class="variable">quot</span>;; <span class="comment">// List of networks as an array of strings</span> <span class="keyword">if</span> (<span class="variable">networks</span>) { <span class="variable">suffix</span> += &<span class="variable">quot</span>;\<span class="variable">n</span>\<span class="variable">nNETWORK</span>:\<span class="variable">n</span>&<span class="variable">quot</span>; + <span class="variable">networks</span>.<span class="variable">join</span>(&<span class="variable">quot</span>;\<span class="variable">n</span>&<span class="variable">quot</span>;); } <span class="comment">// List of fallbacks as key/value pairs</span> <span class="keyword">if</span> (<span class="variable">fallbacks</span>) { <span class="variable">suffix</span> += &<span class="variable">quot</span>;\<span class="variable">n</span>\<span class="variable">nFALLBACK</span>:\<span class="variable">n</span>&<span class="variable">quot</span>; + <span class="variable">fallbacks</span>.<span class="variable">map</span>(<span class="keyword">function</span> (<span class="variable">second</span>, <span class="variable">first</span>) { <span class="keyword">return</span> <span class="variable">first</span> + &<span class="variable">quot</span>; &<span class="variable">quot</span>; + <span class="variable">second</span>; }).<span class="variable">join</span>(&<span class="variable">quot</span>;\<span class="variable">n</span>&<span class="variable">quot</span>;); } <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">cacheManifest</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) { <span class="keyword">if</span> (<span class="class">Url</span>.<span class="variable">parse</span>(<span class="variable">req</span>.<span class="variable">url</span>).<span class="variable">pathname</span> === &<span class="variable">quot</span>;/<span class="variable">cache</span>.<span class="variable">manifest</span>&<span class="variable">quot</span>;) { <span class="class">Utils</span>.<span class="variable">find</span>(<span class="variable">root</span>, (<span class="regexp">/./</span>), <span class="keyword">function</span> (<span class="variable">err</span>, <span class="variable">files</span>) { <span class="keyword">var</span> <span class="variable">latestMtime</span> = <span class="number integer">0</span>; <span class="variable">files</span> = <span class="variable">files</span>.<span class="variable">map</span>(<span class="keyword">function</span> (<span class="variable">entry</span>) { <span class="keyword">if</span> (<span class="variable">entry</span>.<span class="variable">mtime</span> &<span class="variable">gt</span>; <span class="variable">latestMtime</span>) { <span class="variable">latestMtime</span> = <span class="variable">entry</span>.<span class="variable">mtime</span>; } <span class="keyword">return</span> <span class="variable">entry</span>.<span class="variable">path</span>.<span class="variable">substr</span>(<span class="number integer">1</span>); }); <span class="keyword">var</span> <span class="variable">manifest</span> = &<span class="variable">quot</span>;<span class="class">CACHE</span> <span class="class">MANIFEST</span>\<span class="variable">n</span>&<span class="variable">quot</span>; + &<span class="variable">quot</span>;# &<span class="variable">quot</span>; + <span class="variable">latestMtime</span>.<span class="variable">toUTCString</span>() + &<span class="variable">quot</span>;\<span class="variable">n</span>&<span class="variable">quot</span>; + <span class="variable">files</span>.<span class="variable">join</span>(&<span class="variable">quot</span>;\<span class="variable">n</span>&<span class="variable">quot</span>;) + <span class="variable">suffix</span>; <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">200</span>, { &<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Type</span>&<span class="variable">quot</span>;: &<span class="variable">quot</span>;<span class="variable">text</span>/<span class="variable">cache</span>-<span class="variable">manifest</span>&<span class="variable">quot</span>;, &<span class="variable">quot</span>;<span class="class">Last</span>-<span class="class">Modified</span>&<span class="variable">quot</span>;: <span class="variable">latestMtime</span>.<span class="variable">toUTCString</span>(), &<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Length</span>&<span class="variable">quot</span>;: <span class="variable">manifest</span>.<span class="variable">length</span> }); <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">manifest</span>); }); <span class="keyword">return</span>; } <span class="variable">next</span>(); }; };</code></pre> </td> </tr><tr class="filename"><td><h2 id="lib/connect/middleware/compiler.js"><a href="#">compiler</a></h2></td><td>lib/connect/middleware/compiler.js</td></tr><tr class="code"> <td class="docs"> <p>Module dependencies. </p> </td> <td class="code"> <pre><code><span class="keyword">var</span> <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>), <span class="variable">path</span> = <span class="variable">require</span>(<span class="string">'path'</span>);</code></pre> </td> </tr> <tr class="code"> <td class="docs"> <p>Bundled compilers:</p> <ul><li><a href="http://github.com/visionmedia/sass.js">sass</a> to <em>css</em></li><li><a href="http://github.com/cloudhead/less.js">less</a> to <em>css</em></li></ul> </td> <td class="code"> <pre><code><span class="keyword">var</span> <span class="variable">compilers</span> = <span class="variable">exports</span>.<span class="variable">compilers</span> = { <span class="variable">sass</span>: { <span class="variable">match</span>: <span class="regexp">/\.css$/</span>, <span class="variable">ext</span>: <span class="string">'.sass'</span>, <span class="variable">compile</span>: <span class="keyword">function</span>(<span class="variable">str</span>, <span class="variable">fn</span>){ <span class="variable">require</span>.<span class="variable">async</span>(<span class="string">'sass'</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">sass</span>){ <span class="keyword">if</span> (<span class="variable">err</span>) { <span class="variable">fn</span>(<span class="variable">err</span>); } <span class="keyword">else</span> { <span class="keyword">try</span> { <span class="variable">fn</span>(<span class="keyword">null</span>, <span class="variable">sass</span>.<span class="variable">render</span>(<span class="variable">str</span>)); } <span class="keyword">catch</span> (<span class="variable">err</span>) { <span class="variable">fn</span>(<span class="variable">err</span>); } } }); } }, <span class="variable">less</span>: { <span class="variable">match</span>: <span class="regexp">/\.css$/</span>, <span class="variable">ext</span>: <span class="string">'.less'</span>, <span class="variable">compile</span>: <span class="keyword">function</span>(<span class="variable">str</span>, <span class="variable">fn</span>){ <span class="variable">require</span>.<span class="variable">async</span>(<span class="string">'less'</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">less</span>){ <span class="keyword">if</span> (<span class="variable">err</span>) { <span class="variable">fn</span>(<span class="variable">err</span>); } <span class="keyword">else</span> { <span class="keyword">try</span> { <span class="variable">less</span>.<span class="variable">render</span>(<span class="variable">str</span>, <span class="variable">fn</span>); } <span class="keyword">catch</span> (<span class="variable">err</span>) { <span class="variable">fn</span>(<span class="variable">err</span>); } } }); } } };</code></pre> </td> </tr> <tr class="code"> <td class="docs"> <p>Setup compiler.</p> <h2>Options</h2> <ul><li><code>src</code> Source directory, defaults to <strong>CWD</strong>.</li><li><code>dest</code> Destination directory, defaults <code>src</code>.</li><li><code>enable</code> Array of enabled compilers.</li></ul> <h2>Compilers</h2> <ul><li><code>sass</code> Compiles cass to css</li><li><code>less</code> Compiles less to css</li></ul> <h2></h2> <ul><li><p><strong>param</strong>: <em>Object</em> options</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul> </td> <td class="code"> <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">compiler</span>(<span class="variable">options</span>){ <span class="variable">options</span> = <span class="variable">options</span> || {}; <span class="keyword">var</span> <span class="variable">srcDir</span> = <span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">compilerSrc</span> || <span class="variable">options</span>.<span class="variable">src</span> || <span class="variable">process</span>.<span class="variable">cwd</span>(), <span class="variable">destDir</span> = <span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">compilerDest</span> || <span class="variable">options</span>.<span class="variable">dest</span> || <span class="variable">srcDir</span>, <span class="variable">enable</span> = <span class="variable">options</span>.<span class="variable">enable</span>; <span class="keyword">if</span> (!<span class="variable">enable</span> || <span class="variable">enable</span>.<span class="variable">length</span> === <span class="number integer">0</span>) { <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="variable">s</span> &<span class="variable">quot</span>;<span class="variable">enable</span>&<span class="variable">quot</span>; <span class="variable">option</span> <span class="variable">is</span> <span class="variable">not</span> <span class="variable">set</span>, <span class="variable">nothing</span> <span class="variable">will</span> <span class="variable">be</span> <span class="variable">compiled</span>.'); } <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">compiler</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){ <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">enable</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) { <span class="keyword">var</span> <span class="variable">name</span> = <span class="variable">enable</span>[<span class="variable">i</span>], <span class="variable">compiler</span> = <span class="variable">compilers</span>[<span class="variable">name</span>]; <span class="keyword">if</span> (<span class="variable">compiler</span>.<span class="variable">match</span>.<span class="variable">test</span>(<span class="variable">req</span>.<span class="variable">url</span>)) { <span class="keyword">var</span> <span class="variable">src</span> = (<span class="variable">srcDir</span> + <span class="variable">req</span>.<span class="variable">url</span>).<span class="variable">replace</span>(<span class="variable">compiler</span>.<span class="variable">match</span>, <span class="variable">compiler</span>.<span class="variable">ext</span>), <span class="variable">dest</span> = <span class="variable">destDir</span> + <span class="variable">req</span>.<span class="variable">url</span>; <span class="comment">// Compare mtimes</span> <span class="variable">fs</span>.<span class="variable">stat</span>(<span class="variable">src</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">srcStats</span>){ <span class="keyword">if</span> (<span class="variable">err</span>) { <span class="keyword">if</span> (<span class="variable">err</span>.<span class="variable">errno</span> === <span class="variable">process</span>.<span class="class">ENOENT</span>) { <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">404</span>, { <span class="string">'Content-Type'</span>: <span class="string">'text/plain'</span> }); <span class="variable">res</span>.<span class="variable">end</span>(<span class="string">'Not Found'</span>); } <span class="keyword">else</span> { <span class="variable">next</span>(<span class="variable">err</span>); } } <span class="keyword">else</span> { <span class="variable">fs</span>.<span class="variable">stat</span>(<span class="variable">dest</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">destStats</span>){ <span class="keyword">if</span> (<span class="variable">err</span>) { <span class="comment">// Oh snap! it does not exist, compile it</span> <span class="keyword">if</span> (<span class="variable">err</span>.<span class="variable">errno</span> === <span class="variable">process</span>.<span class="class">ENOENT</span>) { <span class="variable">compile</span>(); } <span class="keyword">else</span> { <span class="variable">next</span>(<span class="variable">err</span>); } } <span class="keyword">else</span> { <span class="comment">// Source has changed, compile it</span> <span class="keyword">if</span> (<span class="variable">srcStats</span>.<span class="variable">mtime</span> &<span class="variable">gt</span>; <span class="variable">destStats</span>.<span class="variable">mtime</span>) { <span class="variable">compile</span>(); } <span class="keyword">else</span> { <span class="comment">// Defer file serving</span> <span class="variable">next</span>(); } } }) } }); <span class="comment">// Compile to the destination</span> <span class="keyword">function</span> <span class="variable">compile</span>() { <span class="variable">fs</span>.<span class="variable">readFile</span>(<span class="variable">src</span>, <span class="string">'utf8'</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">str</span>){ <span class="keyword">if</span> (<span class="variable">err</span>) { <span class="variable">next</span>(<span class="variable">err</span>); } <span class="keyword">else</span> { <span class="variable">compiler</span>.<span class="variable">compile</span>(<span class="variable">str</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">str</span>){ <span class="keyword">if</span> (<span class="variable">err</span>) { <span class="variable">next</span>(<span class="variable">err</span>); } <span class="keyword">else</span> { <span class="variable">fs</span>.<span class="variable">writeFile</span>(<span class="variable">dest</span>, <span class="variable">str</span>, <span class="string">'utf8'</span>, <span class="keyword">function</span>(<span class="variable">err</span>){ <span class="variable">next</span>(<span class="variable">err</span>); }); } }); } }); } <span class="keyword">return</span>; } } <span class="variable">next</span>(); }; };</code></pre> </td> </tr><tr class="filename"><td><h2 id="lib/connect/middleware/conditionalGet.js"><a href="#">conditionalGet</a></h2></td><td>lib/connect/middleware/conditionalGet.js</td></tr><tr class="code"> <td class="docs"> <p>Conditional GET request support.</p> <h2></h2> <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul> </td> <td class="code"> <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">conditionalGet</span>(){ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">conditionalGet</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) { <span class="comment">// Skip all requests that are not conditional gets.</span> <span class="keyword">if</span> (!(<span class="variable">req</span>.<span class="variable">method</span> === &<span class="variable">quot</span>;<span class="class">GET</span>&<span class="variable">quot</span>; &<span class="variable">amp</span>;&<span class="variable">amp</span>; (<span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="keyword">if</span>-<span class="variable">modified</span>-<span class="variable">since</span>&<span class="variable">quot</span>;] || <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="keyword">if</span>-<span class="variable">none</span>-<span class="variable">match</span>&<span class="variable">quot</span>;]) )) { <span class="variable">next</span>(); <span class="keyword">return</span>; } <span class="keyword">var</span> <span class="variable">since</span> = <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="keyword">if</span>-<span class="variable">modified</span>-<span class="variable">since</span>&<span class="variable">quot</span>;], <span class="variable">oldEtag</span> = <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="keyword">if</span>-<span class="variable">none</span>-<span class="variable">match</span>&<span class="variable">quot</span>;], <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>, <span class="variable">write</span> = <span class="variable">res</span>.<span class="variable">write</span>, <span class="variable">end</span> = <span class="variable">res</span>.<span class="variable">end</span>; <span class="variable">since</span> = <span class="variable">since</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="class">Date</span>.<span class="variable">parse</span>(<span class="variable">since</span>).<span class="variable">valueOf</span>(); <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span> (<span class="variable">code</span>, <span class="variable">headers</span>) { <span class="keyword">var</span> <span class="variable">lastModified</span> = <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Last</span>-<span class="class">Modified</span>&<span class="variable">quot</span>;], <span class="variable">etag</span> = <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Etag</span>&<span class="variable">quot</span>;]; <span class="variable">lastModified</span> = <span class="variable">lastModified</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="class">Date</span>.<span class="variable">parse</span>(<span class="variable">lastModified</span>).<span class="variable">valueOf</span>(); <span class="comment">// If there is no match, then move on.</span> <span class="keyword">if</span> (!(<span class="variable">code</span> === <span class="number integer">200</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; (<span class="variable">lastModified</span> === <span class="variable">since</span> || <span class="variable">oldEtag</span> === <span class="variable">etag</span>) )) { <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>; <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">code</span>, <span class="variable">headers</span>); <span class="keyword">return</span>; } <span class="comment">// Ignore writes</span> <span class="variable">res</span>.<span class="variable">write</span> = <span class="keyword">function</span> () {}; <span class="variable">res</span>.<span class="variable">end</span> = <span class="keyword">function</span> () { <span class="comment">// Put the original functions back on.</span> <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>; <span class="variable">res</span>.<span class="variable">write</span> = <span class="variable">write</span>; <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>; <span class="comment">// Filter out any Content based headers since there is no</span> <span class="comment">// content.</span> <span class="keyword">var</span> <span class="variable">newHeaders</span> = {}; <span class="variable">headers</span>.<span class="variable">forEach</span>(<span class="keyword">function</span> (<span class="variable">value</span>, <span class="variable">key</span>) { <span class="keyword">if</span> (<span class="variable">key</span>.<span class="variable">indexOf</span>(&<span class="variable">quot</span>;<span class="class">Content</span>&<span class="variable">quot</span>;) &<span class="variable">lt</span>; <span class="number integer">0</span>) { <span class="variable">newHeaders</span>[<span class="variable">key</span>] = <span class="variable">value</span>; } }); <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">304</span>, <span class="variable">newHeaders</span>); <span class="variable">res</span>.<span class="variable">end</span>(); }; }; <span class="variable">next</span>(); }; };</code></pre> </td> </tr><tr class="filename"><td><h2 id="lib/connect/middleware/cookieDecoder.js"><a href="#">cookieDecoder</a></h2></td><td>lib/connect/middleware/cookieDecoder.js</td></tr><tr class="code"> <td class="docs"> <p>Module dependencies. </p> </td> <td class="code"> <pre><code><span class="keyword">var</span> <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../utils'</span>);</code></pre> </td> </tr> <tr class="code"> <td class="docs"> <p>Parse <em>Cookie</em> header and populate <code>req.cookies</code>.</p> <h2></h2> <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul> </td> <td class="code"> <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">cookieDecoder</span>(){ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">cookieDecoder</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) { <span class="keyword">var</span> <span class="variable">cookie</span> = <span class="variable">req</span>.<span class="variable">headers</span>.<span class="variable">cookie</span>; <span class="variable">req</span>.<span class="variable">cookies</span> = {}; <span class="keyword">if</span> (<span class="variable">cookie</span>) { <span class="keyword">try</span> { <span class="variable">req</span>.<span class="variable">cookies</span> = <span class="variable">utils</span>.<span class="variable">parseCookie</span>(<span class="variable">cookie</span>); <span class="keyword">delete</span> <span class="variable">req</span>.<span class="variable">headers</span>.<span class="variable">cookie</span>; } <span class="keyword">catch</span> (<span class="variable">err</span>) { <span class="comment">// Ignore</span> } <span class="variable">next</span>(); } <span class="keyword">else</span> { <span class="variable">next</span>(); } }; };</code></pre> </td> </tr><tr class="filename"><td><h2 id="lib/connect/middleware/errorHandler.js"><a href="#">errorHandler</a></h2></td><td>lib/connect/middleware/errorHandler.js</td></tr><tr class="code"> <td class="docs"> <p>Module dependencies. </p> </td> <td class="code"> <pre><code><span class="keyword">var</span> <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../utils'</span>), <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>), <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>);</code></pre> </td> </tr> <tr class="code"> <td class="docs"> <p>Setup error handler with the given <code>options</code>.</p> <h2>Options</h2> <ul><li><code>showStack</code> respond with both the error message and stack trace. Defaults to <code>false</code></li><li><code>showMessage</code> respond with the exception message only. Defaults to <code>false</code></li><li><code>dumpExceptions</code> dump exceptions to stderr (without terminating the process). Defaults to <code>false</code></li></ul> <h2></h2> <ul><li><p><strong>param</strong>: <em>Object</em> options</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul> </td> <td class="code"> <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">errorHandler</span>(<span class="variable">options</span>){ <span class="variable">options</span> = <span class="variable">options</span> || {}; <span class="comment">// Defaults</span> <span class="keyword">var</span> <span class="variable">showStack</span> = <span class="variable">options</span>.<span class="variable">showStack</span>, <span class="variable">showMessage</span> = <span class="variable">options</span>.<span class="variable">showMessage</span>, <span class="variable">dumpExceptions</span> = <span class="variable">options</span>.<span class="variable">dumpExceptions</span>; <span class="comment">// --showErrorStack</span> <span class="keyword">if</span> (<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">showErrorStack</span> !== <span class="variable">undefined</span>) { <span class="variable">showStack</span> = <span class="variable">op</span> = <span class="variable">utils</span>.<span class="variable">toBoolean</span>(<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">showErrorStack</span>); } <span class="comment">// --showErrorMessage</span> <span class="keyword">if</span> (<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">showErrorMessage</span> !== <span class="variable">undefined</span>) { <span class="variable">showMessage</span> = <span class=