Name: js-handler/node_modules/restify/node_modules/spdy/README.md 
1:
# SPDY Server for node.js [![Build Status](https://secure.travis-ci.org/indutny/node-spdy.png)](http://travis-ci.org/indutny/node-spdy)
2:
 
3:
<a href="http://flattr.com/thing/758213/indutnynode-spdy-on-GitHub" target="_blank">
4:
<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>
5:
 
6:
With this module you can create [SPDY](http://www.chromium.org/spdy) servers
7:
in node.js with natural http module interface and fallback to regular https
8:
(for browsers that doesn't support SPDY yet).
9:
 
10:
## Usage
11:
 
12:
```javascript
13:
var spdy = require('spdy'),
14:
    fs = require('fs');
15:
 
16:
var options = {
17:
  key: fs.readFileSync(__dirname + '/keys/spdy-key.pem'),
18:
  cert: fs.readFileSync(__dirname + '/keys/spdy-cert.pem'),
19:
  ca: fs.readFileSync(__dirname + '/keys/spdy-csr.pem'),
20:
 
21:
  // SPDY-specific options
22:
  windowSize: 1024, // Server's window size
23:
};
24:
 
25:
var server = spdy.createServer(options, function(req, res) {
26:
  res.writeHead(200);
27:
  res.end('hello world!');
28:
});
29:
 
30:
server.listen(443);
31:
```
32:
 
33:
And by popular demand - usage with
34:
[express](https://github.com/visionmedia/express):
35:
 
36:
```javascript
37:
var spdy = require('spdy'),
38:
    express = require('express'),
39:
    fs = require('fs');
40:
 
41:
var options = { /* the same as above */ };
42:
 
43:
var app = express();
44:
 
45:
app.use(/* your favorite middleware */);
46:
 
47:
var server = spdy.createServer(options, app);
48:
 
49:
server.listen(443);
50:
```
51:
 
52:
## API
53:
 
54:
API is compatible with `http` and `https` module, but you can use another
55:
function as base class for SPDYServer.
56:
 
57:
```javascript
58:
spdy.createServer(
59:
  [base class constructor, i.e. https.Server],
60:
  { /* keys and options */ }, // <- the only one required argument
61:
  [request listener]
62:
).listen([port], [host], [callback]);
63:
```
64:
 
65:
Request listener will receive two arguments: `request` and `response`. They're
66:
both instances of `http`'s `IncomingMessage` and `OutgoingMessage`. But three
67:
custom properties are added to both of them: `streamID`, `isSpdy`,
68:
`spdyVersion`. The first one indicates on which spdy stream are sitting request
69:
and response. Second is always true and can be checked to ensure that incoming
70:
request wasn't received by HTTPS fallback and last one is a number representing
71:
used SPDY protocol version (2 or 3 for now).
72:
 
73:
### Push streams
74:
 
75:
It is possible to initiate 'push' streams to send content to clients _before_
76:
the client requests it.
77:
 
78:
```javascript
79:
spdy.createServer(options, function(req, res) {
80:
  var headers = { 'content-type': 'application/javascript' };
81:
  res.push('/main.js', headers, function(err, stream) {
82:
    if (err) return;
83:
 
84:
    stream.end('alert("hello from push stream!");');
85:
  });
86:
 
87:
  res.end('<script src="/main.js"></script>');
88:
}).listen(443);
89:
```
90:
 
91:
Push is accomplished via the `push()` method invoked on the current response
92:
object (this works for express.js response objects as well).  The format of the
93:
`push()` method is:
94:
 
95:
`.push('full or relative url', { ... headers ... }, optional priority, callback)`
96:
 
97:
You can use either full ( `http://host/path` ) or relative ( `/path` ) urls with
98:
`.push()`. `headers` are the same as for regular response object. `callback`
99:
will receive two arguments: `err` (if any error is happened) and `stream`
100:
(stream object have API compatible with a
101:
[net.Socket](http://nodejs.org/docs/latest/api/net.html#net.Socket) ).
102:
 
103:
### Options
104:
 
105:
All options supported by
106:
[tls](http://nodejs.org/docs/latest/api/tls.html#tls.createServer) are working
107:
with node-spdy. In addition, `maxStreams` options is available. it allows you
108:
controlling [maximum concurrent streams][http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-SETTINGS]
109:
protocol option (if client will start more streams than that limit, RST_STREAM
110:
will be sent for each additional stream).
111:
 
112:
Additional options:
113:
 
114:
* `plain` - if defined, server will accept only plain (non-encrypted)
115:
  connections.
116:
 
117:
#### Contributors
118:
 
119:
* [Fedor Indutny](https://github.com/indutny)
120:
* [Chris Strom](https://github.com/eee-c)
121:
* [François de Metz](https://github.com/francois2metz)
122:
* [Ilya Grigorik](https://github.com/igrigorik)
123:
* [Roberto Peon](https://github.com/grmocg)
124:
* [Tatsuhiro Tsujikawa](https://github.com/tatsuhiro-t)
125:
* [Jesse Cravens](https://github.com/jessecravens)
126:
 
127:
#### LICENSE
128:
 
129:
This software is licensed under the MIT License.
130:
 
131:
Copyright Fedor Indutny, 2012.
132:
 
133:
Permission is hereby granted, free of charge, to any person obtaining a
134:
copy of this software and associated documentation files (the
135:
"Software"), to deal in the Software without restriction, including
136:
without limitation the rights to use, copy, modify, merge, publish,
137:
distribute, sublicense, and/or sell copies of the Software, and to permit
138:
persons to whom the Software is furnished to do so, subject to the
139:
following conditions:
140:
 
141:
The above copyright notice and this permission notice shall be included
142:
in all copies or substantial portions of the Software.
143:
 
144:
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
145:
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
146:
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
147:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
148:
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
149:
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
150:
USE OR OTHER DEALINGS IN THE SOFTWARE.