connect-form
Version:
urlencoded / multipart form parsing middleware for Connect
662 lines (602 loc) • 155 kB
HTML
<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=