Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
276 changes: 276 additions & 0 deletions MIGRATION_SPDY_TO_HTTP2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,276 @@
# SPDY to HTTP/2 Migration Guide

## Overview

This guide helps you migrate from the deprecated SPDY support to native HTTP/2 support in Restify. SPDY support has been deprecated and will be removed in a future major version.

## Why Migrate?

### SPDY is Deprecated
- SPDY was an experimental protocol that preceded HTTP/2
- HTTP/2 is the official successor to SPDY and is widely supported
- Node.js has native HTTP/2 support since version 8.8.0
- The `spdy` npm package is no longer actively maintained and has security concerns

### Benefits of HTTP/2
- **Native Support**: Uses Node.js built-in HTTP/2 module instead of external dependencies
- **Better Performance**: Improved multiplexing and header compression
- **Security**: More secure implementation with regular updates
- **Compatibility**: Better browser and client support
- **Future-Proof**: HTTP/2 is the current standard with ongoing development

### Node.js HTTP Parser Evolution
- **Legacy**: `http_parser` (deprecated)
- **Current**: `llhttp` (default since Node.js 12.0.0) - significantly faster and more maintainable
- **Future**: Native HTTP/2 and HTTP/3 support

## Migration Steps

### 1. Update Your Server Configuration

**Before (SPDY - DEPRECATED):**
```javascript
const restify = require('restify');
const fs = require('fs');

const server = restify.createServer({
spdy: {
cert: fs.readFileSync('path/to/cert.pem'),
key: fs.readFileSync('path/to/key.pem'),
ca: fs.readFileSync('path/to/ca.pem')
}
});
```

**After (HTTP/2 - RECOMMENDED):**
```javascript
const restify = require('restify');
const fs = require('fs');

const server = restify.createServer({
http2: {
cert: fs.readFileSync('path/to/cert.pem'),
key: fs.readFileSync('path/to/key.pem'),
ca: fs.readFileSync('path/to/ca.pem'),
allowHTTP1: true // Enable HTTP/1.1 fallback for compatibility
}
});
```

### 2. Key Differences

| Feature | SPDY | HTTP/2 |
|---------|------|--------|
| Protocol | `spdy://` | `https://` |
| Node.js Support | External package | Native (8.8.0+) |
| Performance | Good | Better |
| Browser Support | Limited | Excellent |
| Security Updates | Infrequent | Regular |

### 3. Configuration Options

The HTTP/2 options are similar to SPDY but with additional features:

```javascript
const server = restify.createServer({
http2: {
// SSL Certificate options (same as SPDY)
cert: fs.readFileSync('cert.pem'),
key: fs.readFileSync('key.pem'),
ca: fs.readFileSync('ca.pem'),

// HTTP/2 specific options
allowHTTP1: true, // Allow HTTP/1.1 fallback
maxSessionMemory: 10000, // Max memory per session
maxDeflateDynamicTableSize: 4096, // Header compression table size
maxSettings: 32, // Max number of settings per session
maxHeaderListPairs: 128, // Max header pairs per request
maxOutstandingPings: 10, // Max outstanding ping frames
maxSendHeaderBlockLength: 65536, // Max header block size

// Performance tuning
paddingStrategy: require('http2').constants.PADDING_STRATEGY_NONE,
settings: {
headerTableSize: 4096,
enablePush: false, // Disable server push (recommended)
maxConcurrentStreams: 100,
initialWindowSize: 65535,
maxFrameSize: 16384,
maxHeaderListSize: 8192
}
}
});
```

## Breaking Changes

### 1. URL Protocol
- **SPDY**: `server.url` returns `spdy://localhost:8080`
- **HTTP/2**: `server.url` returns `https://localhost:8080`

### 2. Server Properties
- **SPDY**: `server.spdy` property is set to `true`
- **HTTP/2**: `server.http2` property is set to `true`

### 3. Dependencies
- Remove `spdy` from your `package.json` dependencies
- No new dependencies needed (HTTP/2 is built into Node.js)

## Migration Examples

### Basic HTTP/2 Server
```javascript
const restify = require('restify');
const fs = require('fs');

const server = restify.createServer({
http2: {
cert: fs.readFileSync('./ssl/cert.pem'),
key: fs.readFileSync('./ssl/key.pem'),
allowHTTP1: true
}
});

server.get('/', (req, res, next) => {
res.send({ message: 'Hello HTTP/2!' });
return next();
});

server.listen(8080, () => {
console.log('%s listening at %s', server.name, server.url);
});
```

### Advanced Configuration with Performance Tuning
```javascript
const restify = require('restify');
const http2 = require('http2');
const fs = require('fs');

const server = restify.createServer({
http2: {
cert: fs.readFileSync('./ssl/cert.pem'),
key: fs.readFileSync('./ssl/key.pem'),
allowHTTP1: true,
maxSessionMemory: 20000,
settings: {
enablePush: false, // Server push is generally not recommended
maxConcurrentStreams: 200,
initialWindowSize: 1024 * 1024, // 1MB
maxFrameSize: 32768,
maxHeaderListSize: 16384
},
paddingStrategy: http2.constants.PADDING_STRATEGY_ALIGNED
},
// Other restify options
name: 'MyHTTP2API',
version: '1.0.0'
});
```

## Testing Your Migration

### 1. Verify HTTP/2 is Working
```bash
# Test with curl (requires curl 7.46+ with HTTP/2 support)
curl -I --http2 https://localhost:8080/

# You should see: HTTP/2 200
```

### 2. Browser Testing
Open your browser's developer tools and check the Network tab. You should see `h2` in the Protocol column.

### 3. Node.js Client Testing
```javascript
const http2 = require('http2');

const client = http2.connect('https://localhost:8080', {
rejectUnauthorized: false // Only for self-signed certificates
});

const req = client.request({
':method': 'GET',
':path': '/'
});

req.on('response', (headers) => {
console.log('HTTP/2 Response received:', headers[':status']);
});

req.on('data', (chunk) => {
console.log(chunk.toString());
});

req.end();
```

## Deprecation Timeline

- **Current Version**: SPDY support is deprecated with warning messages
- **Next Minor Version**: SPDY support will continue to work but with deprecation warnings
- **Next Major Version**: SPDY support will be completely removed

## Troubleshooting

### Common Issues

1. **"http2 module is not available" Error**
- **Cause**: Node.js version < 8.8.0
- **Solution**: Upgrade Node.js to version 10+ (recommended)

2. **SSL Certificate Issues**
- **Cause**: Invalid or missing SSL certificates
- **Solution**: Ensure valid SSL certificates are provided for both SPDY and HTTP/2

3. **Client Compatibility**
- **Cause**: Older clients may not support HTTP/2
- **Solution**: Use `allowHTTP1: true` for backward compatibility

### Performance Tips

1. **Disable Server Push**: Set `enablePush: false` in settings
2. **Tune Concurrent Streams**: Adjust `maxConcurrentStreams` based on your needs
3. **Optimize Header Compression**: Configure `headerTableSize` appropriately
4. **Use Connection Pooling**: Reuse HTTP/2 connections in clients

## Need Help?

- [Restify Documentation](http://restify.com)
- [Node.js HTTP/2 Documentation](https://nodejs.org/api/http2.html)
- [HTTP/2 Specification (RFC 7540)](https://httpwg.org/specs/rfc7540.html)
- [Restify GitHub Issues](https://github.com/restify/node-restify/issues)

## Example Migration Commit

Here's a complete example of migrating an existing SPDY server:

```diff
- const server = restify.createServer({
- spdy: {
- cert: fs.readFileSync('./ssl/cert.pem'),
- key: fs.readFileSync('./ssl/key.pem')
- }
- });

+ const server = restify.createServer({
+ http2: {
+ cert: fs.readFileSync('./ssl/cert.pem'),
+ key: fs.readFileSync('./ssl/key.pem'),
+ allowHTTP1: true
+ }
+ });
```

```diff
- "dependencies": {
- "restify": "^11.2.0",
- "spdy": "^4.0.0"
- }

+ "dependencies": {
+ "restify": "^11.2.0"
+ }
```

This migration will improve your application's performance, security, and future compatibility!
34 changes: 21 additions & 13 deletions examples/http2/keys/http2-cert.pem
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
-----BEGIN CERTIFICATE-----
MIICHzCCAYgCCQCPPSUAa8QZojANBgkqhkiG9w0BAQUFADBUMQswCQYDVQQGEwJS
VTETMBEGA1UECBMKU29tZS1TdGF0ZTENMAsGA1UEBxMET21zazEhMB8GA1UEChMY
SW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMB4XDTExMDQwOTEwMDY0NVoXDTExMDUw
OTEwMDY0NVowVDELMAkGA1UEBhMCUlUxEzARBgNVBAgTClNvbWUtU3RhdGUxDTAL
BgNVBAcTBE9tc2sxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCB
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1bn25sPkv46wl70BffxradlkRd/x
p5Xf8HDhPSfzNNctERYslXT2fX7Dmfd5w1XTVqqGqJ4izp5VewoVOHA8uavo3ovp
gNWasil5zADWaM1T0nnV0RsFbZWzOTmm1U3D48K8rW3F5kOZ6f4yRq9QT1gF/gN7
5Pt494YyYyJu/a8CAwEAATANBgkqhkiG9w0BAQUFAAOBgQBuRZisIViI2G/R+w79
vk21TzC/cJ+O7tKsseDqotXYTH8SuimEH5IWcXNgnWhNzczwN8s2362NixyvCipV
yd4wzMpPbjIhnWGM0hluWZiK2RxfcqimIBjDParTv6CMUIuwGQ257THKY8hXGg7j
Uws6Lif3P9UbsuRiYPxMgg98wg==
MIIDvTCCAqWgAwIBAgIUHhRA/81iyVSR2nEAt5cyjYXlBSQwDQYJKoZIhvcNAQEL
BQAwbjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh
bmNpc2NvMRQwEgYDVQQKDAtSZXN0aWZ5VGVzdDEQMA4GA1UECwwHVGVzdGluZzES
MBAGA1UEAwwJbG9jYWxob3N0MB4XDTI1MDgyMTEzNDkzNVoXDTM1MDgxOTEzNDkz
NVowbjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh
bmNpc2NvMRQwEgYDVQQKDAtSZXN0aWZ5VGVzdDEQMA4GA1UECwwHVGVzdGluZzES
MBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEA2L1YQrLe9YGradm1U5z33nVHM8coaGeby5v7XZ/Xxsm4r/9O8WWClx+FXbm2
6gsFvV4upclUJXH4hO7NYoIjw+3oGLDHcE3dC8Qol1U/SsNXeW08+Vq0msPBoTBz
hduDCNOySHMNohM/zLpTL3KzcKisdHfCMll4cvpTRik9RUyUq/kzMvh3Hy9JmJr1
l1hSy7MpAYf5qPxxesPjNPEyRazE5Q17l2ehB0mA/iDKDS9Bxpsax+qK3rCptlfn
vx2io6r/zx17ERkTeBZO7l767eVLOdQ5bFZXlKRpC4CXqMO81+Gs4H2he5clDxO9
En6pWHX6WUceSVl8Qu/koM7m+QIDAQABo1MwUTAdBgNVHQ4EFgQUNq0Txd5RIIMw
59ch91di56ROApwwHwYDVR0jBBgwFoAUNq0Txd5RIIMw59ch91di56ROApwwDwYD
VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAESQzXKQctWrBr1koy+L7
wOCo6dbNlng1pjHzL5pjx2qfIfBpuV6BgJy9rm20EHVJ0mi4RHgwULo2dXSTLdmm
mPRO/zzNyrZmo68fDTBlQ/yrkwZiAIrLRO68oUa5XQ8caf7/ln9hhVKO01uR0CgO
r/cTRd+KB+m8UVZ6M9t7BgLvFFRWCZSjpssVRPCIO+0014z8aw29NvFLyVjBAvHb
QUGjOKO85pxQhpCW6ieHBWzWUL1vhQBEO3rq/Mjg4gzq4e7yjfpi6wxqt5ybefX9
X7T+fO2mNVGx0Lw7ZIQIFjfyiQGdEZSJg3JQEoP+vyUb9b2YKaIXQjLvJoXvs5Bc
Zg==
-----END CERTIFICATE-----

25 changes: 15 additions & 10 deletions examples/http2/keys/http2-csr.pem
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIBkzCB/QIBADBUMQswCQYDVQQGEwJSVTETMBEGA1UECBMKU29tZS1TdGF0ZTEN
MAsGA1UEBxMET21zazEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVufbmw+S/jrCXvQF9/Gtp2WRF
3/Gnld/wcOE9J/M01y0RFiyVdPZ9fsOZ93nDVdNWqoaoniLOnlV7ChU4cDy5q+je
i+mA1ZqyKXnMANZozVPSedXRGwVtlbM5OabVTcPjwrytbcXmQ5np/jJGr1BPWAX+
A3vk+3j3hjJjIm79rwIDAQABoAAwDQYJKoZIhvcNAQEFBQADgYEAiNWhz6EppIVa
FfUaB3sLeqfamb9tg9kBHtvqj/FJni0snqms0kPWaTySEPHZF0irIb7VVdq/sVCb
3gseMVSyoDvPJ4lHC3PXqGQ7kM1mIPhDnR/4HDA3BhlGhTXSDIHgZnvI+HMBdsyC
hC3dz5odyKqe4nmoofomALkBL9t4H8s=
MIICszCCAZsCAQAwbjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQH
DA1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKDAtSZXN0aWZ5VGVzdDEQMA4GA1UECwwH
VGVzdGluZzESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA2L1YQrLe9YGradm1U5z33nVHM8coaGeby5v7XZ/Xxsm4r/9O
8WWClx+FXbm26gsFvV4upclUJXH4hO7NYoIjw+3oGLDHcE3dC8Qol1U/SsNXeW08
+Vq0msPBoTBzhduDCNOySHMNohM/zLpTL3KzcKisdHfCMll4cvpTRik9RUyUq/kz
Mvh3Hy9JmJr1l1hSy7MpAYf5qPxxesPjNPEyRazE5Q17l2ehB0mA/iDKDS9Bxpsa
x+qK3rCptlfnvx2io6r/zx17ERkTeBZO7l767eVLOdQ5bFZXlKRpC4CXqMO81+Gs
4H2he5clDxO9En6pWHX6WUceSVl8Qu/koM7m+QIDAQABoAAwDQYJKoZIhvcNAQEL
BQADggEBADBk3WeGSgWOAzDVcNkU8Rg+i+sOk324pzKksd/Qvza5lirPmRTxvSf+
0g3i3LcJdTcAaoidv/Uty5nyjzLc1FgyJlK4BL1yGJ54n0K2CKxhfDSWRajYN8BO
hytgpXyp7R01XwWVDruilIj3kWKi/KNkvU+acBWAO3lT9pDnHxiY3ThgZdldeaEl
ESmy1X1Hp67SnTmqPgVWLis1JT8pirU3BR4KCnB40vdT2RWvNlWq3stFeEO/yMRE
qVLhXp6vFh3ma3A14J4jhh3xtvgllwdGcdZhpkSvAktHWW/ee0CiWhZiDsPX36gy
+OalBXw1olu7xGmg8h1TRWkHsA3rU6w=
-----END CERTIFICATE REQUEST-----

44 changes: 28 additions & 16 deletions examples/http2/keys/http2-key.pem
Original file line number Diff line number Diff line change
@@ -1,16 +1,28 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDVufbmw+S/jrCXvQF9/Gtp2WRF3/Gnld/wcOE9J/M01y0RFiyV
dPZ9fsOZ93nDVdNWqoaoniLOnlV7ChU4cDy5q+jei+mA1ZqyKXnMANZozVPSedXR
GwVtlbM5OabVTcPjwrytbcXmQ5np/jJGr1BPWAX+A3vk+3j3hjJjIm79rwIDAQAB
AoGAAv2QI9h32epQND9TxwSCKD//dC7W/cZOFNovfKCTeZjNK6EIzKqPTGA6smvR
C1enFl5adf+IcyWqAoe4lkqTvurIj+2EhtXdQ8DBlVuXKr3xvEFdYxXPautdTCF6
KbXEyS/s1TZCRFjYftvCrXxc3pK45AQX/wg7z1K+YB5pyIECQQD0OJvLoxLYoXAc
FZraIOZiDsEbGuSHqoCReFXH75EC3+XGYkH2bQ/nSIZ0h1buuwQ/ylKXOlTPT3Qt
Xm1OQEBvAkEA4AjWsIO/rRpOm/Q2aCrynWMpoUXTZSbL2yGf8pxp/+8r2br5ier0
M1LeBb/OPY1+k39NWLXxQoo64xoSFYk2wQJAd2wDCwX4HkR7HNCXw1hZL9QFK6rv
20NN0VSlpboJD/3KT0MW/FiCcVduoCbaJK0Au+zEjDyy4hj5N4I4Mw6KMwJAXVAx
I+psTsxzS4/njXG+BgIEl/C+gRYsuMQDnAi8OebDq/et8l0Tg8ETSu++FnM18neG
ntmBeMacinUUbTXuwQJBAJp/onZdsMzeVulsGrqR1uS+Lpjc5Q1gt5ttt2cxj91D
rio48C/ZvWuKNE8EYj2ALtghcVKRvgaWfOxt2GPguGg=
-----END RSA PRIVATE KEY-----

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDYvVhCst71gatp
2bVTnPfedUczxyhoZ5vLm/tdn9fGybiv/07xZYKXH4VdubbqCwW9Xi6lyVQlcfiE
7s1igiPD7egYsMdwTd0LxCiXVT9Kw1d5bTz5WrSaw8GhMHOF24MI07JIcw2iEz/M
ulMvcrNwqKx0d8IyWXhy+lNGKT1FTJSr+TMy+HcfL0mYmvWXWFLLsykBh/mo/HF6
w+M08TJFrMTlDXuXZ6EHSYD+IMoNL0HGmxrH6oresKm2V+e/HaKjqv/PHXsRGRN4
Fk7uXvrt5Us51DlsVleUpGkLgJeow7zX4azgfaF7lyUPE70SfqlYdfpZRx5JWXxC
7+Sgzub5AgMBAAECggEAArhZn7ir+KvQcWskjfCV4cpaAunYdXr7ZxJFlNa5OAr3
EOpk3L235lqka1k11PkfcNF6R2Vf83pbMpvmovpcJYzaUVkCn8OyZv/mvIN64F7U
PbdjwQNk6d5UE0hO4tqu6dDyV1tuS97u+YxLF/jaDKtpQqrwGn6p9tNycRp6ZOC7
wUjoDaRP6D+m/+21TxBNyLDEjm48KWL1M/Oyu7VWYcVfb6ZfTumfY54ptywCLdlJ
Q4vDLU0n7fi5NHd1dqoZFt2pn2wBlvATKDcY87Yr9eJwDwapyZXJQn4dEUnpAHS0
ewj5VuBIbfhUhkhot4Nd3nG2NtVY7wzHuxKkmyGUAQKBgQDtI+bTSh/ZAsHTPhgQ
uM0qE4xYHhPazsfaBHoAhGvvqoEmQ0EeHop7QNl647j0QJRhGn/bjMQJPtymftEX
nwypM0gHZAaVvPaemOB1DlT+zahx4MTTgMmookfSmMraSx/D8sUXH7OGpBhGgNfu
Uhp/WCaIiaUseis8nBJ9TqU3+QKBgQDp+hffMbg7lSwtztpHws6/NWmAXp3MfWq4
e3R39g/ka6BFw6DNvksURUET2XDoXODfesQHV65y9MAxiI4mJX50PKQuFP1eu2rK
r4KtRU+mhAYWXQmK4ZEW0PEwY8bsZ9jnY/VoM8HC/dqIdfoigD+hHJvOZItzoYQ4
ifVQW+jnAQKBgQCkncWAavZMuOM/9tzRztdtHADSsp5pyB1ntK/UaBhdWOkqXIl5
lQ3gnZXa/vXHaIUYG0Mib0cue9rEIUiYsyog0p5vsvn3PCOe2NUHrRlHgBAsbTF0
+PQEAhMFmFdIzdmRNpemg7UmBAdt+cbrg0ctm020foiQpYYaHuWe4tdCUQKBgQC7
DfALxcoOCGI7dQXZHQsAnojr0bjCBPpO5pPkW9m0ub52R8HE+n83g25Vmh7EBYzZ
3WHepOCYksccUpmiMZN5BgoTtUAifh8QT2RfdewJqb7cHiFE4LSH0x8fmoUr9pHX
23gUiFw9sYkGU5tX/cPg3+hIBuXd2aDFOrXeOrxmAQKBgCc/Ja1tQnPUYcFyduiI
Bpwj2qoWuQy2cNiebjLlNzYUR3KrR/uaCtb+p0s+09Fak2RMHrEkFuv49Emf+MXc
VJbsmgjD4univZH0xBUyWuMhMn6naiT2+VGMTx/qr1uCIT6ydkjQ03DdzOWlD60T
3L6kCSP5acz1YfQdRU9opAD5
-----END PRIVATE KEY-----
Loading