From 80631de410142f8845a5d7a45302d67fd0548527 Mon Sep 17 00:00:00 2001 From: Jason Dalton Date: Thu, 21 Aug 2025 08:57:34 -0500 Subject: [PATCH] Migrate from SPDY to native HTTP/2 and fix unit tests - Remove SPDY dependency and migrate to Node.js native HTTP/2 - Add deprecation warnings for SPDY usage with automatic migration - Update SSL certificates to 2048-bit keys (fixes test failures) - Fix HTTP/2 tests that were failing due to weak certificate keys - Add comprehensive migration guide and update documentation - Maintain backward compatibility while encouraging HTTP/2 adoption - All 939 tests now passing (730 unit + 209 plugin tests) Benefits: - Better performance with native HTTP/2 and llhttp parser - Improved security with regular Node.js updates - Reduced external dependencies - Future-proof implementation --- MIGRATION_SPDY_TO_HTTP2.md | 276 +++++++++++++++++++++++++++ examples/http2/keys/http2-cert.pem | 34 ++-- examples/http2/keys/http2-csr.pem | 25 ++- examples/http2/keys/http2-key.pem | 44 +++-- examples/spdy/keys/spdy-cert.pem | 34 ++-- examples/spdy/keys/spdy-csr.pem | 25 ++- examples/spdy/keys/spdy-key.pem | 44 +++-- examples/spdy/spdy.js | 21 +- lib/index.js | 8 +- lib/server.js | 39 +++- package.json | 297 ++++++++++++++--------------- test/keys/http2-cert.pem | 34 ++-- test/keys/http2-csr.pem | 25 ++- test/keys/http2-key.pem | 44 +++-- 14 files changed, 671 insertions(+), 279 deletions(-) create mode 100644 MIGRATION_SPDY_TO_HTTP2.md diff --git a/MIGRATION_SPDY_TO_HTTP2.md b/MIGRATION_SPDY_TO_HTTP2.md new file mode 100644 index 000000000..1bd1164b8 --- /dev/null +++ b/MIGRATION_SPDY_TO_HTTP2.md @@ -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! \ No newline at end of file diff --git a/examples/http2/keys/http2-cert.pem b/examples/http2/keys/http2-cert.pem index 2f13995ff..dd78422fe 100644 --- a/examples/http2/keys/http2-cert.pem +++ b/examples/http2/keys/http2-cert.pem @@ -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----- - diff --git a/examples/http2/keys/http2-csr.pem b/examples/http2/keys/http2-csr.pem index b4d764fdc..b751ce4b6 100644 --- a/examples/http2/keys/http2-csr.pem +++ b/examples/http2/keys/http2-csr.pem @@ -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----- - diff --git a/examples/http2/keys/http2-key.pem b/examples/http2/keys/http2-key.pem index 957810910..1d68553a2 100644 --- a/examples/http2/keys/http2-key.pem +++ b/examples/http2/keys/http2-key.pem @@ -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----- diff --git a/examples/spdy/keys/spdy-cert.pem b/examples/spdy/keys/spdy-cert.pem index 2f13995ff..0b8512cdc 100644 --- a/examples/spdy/keys/spdy-cert.pem +++ b/examples/spdy/keys/spdy-cert.pem @@ -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== +MIIDvTCCAqWgAwIBAgIUComqGZhHNUezsNoLrGDFiGlYAI0wDQYJKoZIhvcNAQEL +BQAwbjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh +bmNpc2NvMRQwEgYDVQQKDAtSZXN0aWZ5VGVzdDEQMA4GA1UECwwHVGVzdGluZzES +MBAGA1UEAwwJbG9jYWxob3N0MB4XDTI1MDgyMTEzNDkyMFoXDTM1MDgxOTEzNDky +MFowbjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh +bmNpc2NvMRQwEgYDVQQKDAtSZXN0aWZ5VGVzdDEQMA4GA1UECwwHVGVzdGluZzES +MBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAkFd0UNl8dzaWgINS3eCXAPOCNPtyu+iQ2D87KdtgnRhmsy5dboGtXBnRJuax +e93VMYtulyAXX61OgVflfKs3hdZNP6klrsRmemqosdL6nL0uKQmTAVYFONUmX0u0 +VoNFTZLyH0JHQSE7PstsdqXXzgX8Sp2h6blmQo2OrvMcn1lAuL11LZWGbInHjMJC +FeIKKfNARX+EVBN8mPnf/IO9XRGTnkgedilruDdW7qbzFJWdm6TCRTugByYaWja2 +gbXXU+6jEyhhWQ5excQ4ZETYqCXri/Gd8OlIAXm8nm3dRcV66t4ytmzOPrVQE7Fb +pPQ8UePv/02UPp2Xy1GTFYiKVQIDAQABo1MwUTAdBgNVHQ4EFgQUnhKmU0kcqbWh +3jXTzIA/djavtc4wHwYDVR0jBBgwFoAUnhKmU0kcqbWh3jXTzIA/djavtc4wDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAjpFtgOXzNFyu8Mzi/s3j +8qbobssEqFpkOIcdBQ5BQjQukbS8tBTVzVDS1xeALJLwtzuQAs+3vs1A7bgZjBmB +WIAiPdmUQQ4UzNkTRljoD294EjBn0P9rePT9wLvlVZujMwzBjivT4dkuOu32kONv +ooil1zHh7fipjtlpKMTy8/a0ANV5Sej+Il3UHtjsqkVsZQBk4Dk2Qb1n/w/KrI+D +SX2DzrIV83TsBPpmzoX5dCYrTswK961OzdBkIvEKPc0UC+qkdAUAUK9zR/1k5iW1 +YqhCuJT+WkNMnPxnULOlzCISrew9zOEGudlED3F+aSYxgoyyMeDWf/qcAzERHzYQ +sQ== -----END CERTIFICATE----- - diff --git a/examples/spdy/keys/spdy-csr.pem b/examples/spdy/keys/spdy-csr.pem index b4d764fdc..fc77b8a81 100644 --- a/examples/spdy/keys/spdy-csr.pem +++ b/examples/spdy/keys/spdy-csr.pem @@ -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 +AQ8AMIIBCgKCAQEAkFd0UNl8dzaWgINS3eCXAPOCNPtyu+iQ2D87KdtgnRhmsy5d +boGtXBnRJuaxe93VMYtulyAXX61OgVflfKs3hdZNP6klrsRmemqosdL6nL0uKQmT +AVYFONUmX0u0VoNFTZLyH0JHQSE7PstsdqXXzgX8Sp2h6blmQo2OrvMcn1lAuL11 +LZWGbInHjMJCFeIKKfNARX+EVBN8mPnf/IO9XRGTnkgedilruDdW7qbzFJWdm6TC +RTugByYaWja2gbXXU+6jEyhhWQ5excQ4ZETYqCXri/Gd8OlIAXm8nm3dRcV66t4y +tmzOPrVQE7FbpPQ8UePv/02UPp2Xy1GTFYiKVQIDAQABoAAwDQYJKoZIhvcNAQEL +BQADggEBAInqeeT5Jdu1p8kVraCoaMQ6XNB8fwn2z1ELER4VRBUXx+v3fECRT0Dj +78bZu+V9e/JVvS2b6kxjP8kar2d3qhgzhzA5kRVvVAve8LEDnYjvwQqVlppGDovk +z5rM0ewFOs5sdbEpmeR7LFOHfLCIECb2X5dvDlWt8c9ILbycK/ajUbvWwGgUPCzX +F9Id8iX19KBMUFKLs2SVUl4dRJstMlBLudj7MwsfQqd0PKswlDjZ77cFEgy6jisW +aXQXV5VrFPJ6XuKUtxSePhDeudA/BEtpgOBelQatq3i6CoIPS7qrN98t0OLfzwLK +9yQnTPGDdFB10DlEZEoAOBvzQV5Ft8A= -----END CERTIFICATE REQUEST----- - diff --git a/examples/spdy/keys/spdy-key.pem b/examples/spdy/keys/spdy-key.pem index 957810910..b8cdb8791 100644 --- a/examples/spdy/keys/spdy-key.pem +++ b/examples/spdy/keys/spdy-key.pem @@ -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----- +MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCQV3RQ2Xx3NpaA +g1Ld4JcA84I0+3K76JDYPzsp22CdGGazLl1uga1cGdEm5rF73dUxi26XIBdfrU6B +V+V8qzeF1k0/qSWuxGZ6aqix0vqcvS4pCZMBVgU41SZfS7RWg0VNkvIfQkdBITs+ +y2x2pdfOBfxKnaHpuWZCjY6u8xyfWUC4vXUtlYZsiceMwkIV4gop80BFf4RUE3yY ++d/8g71dEZOeSB52KWu4N1bupvMUlZ2bpMJFO6AHJhpaNraBtddT7qMTKGFZDl7F +xDhkRNioJeuL8Z3w6UgBebyebd1FxXrq3jK2bM4+tVATsVuk9DxR4+//TZQ+nZfL +UZMViIpVAgMBAAECgf8DzkqC1zkw63+MY+oLb6CLpeAJBZhA3CD1krU8pUwm2D3c ++5v7DfBEPWoGXI7RdUfpxoNj+LSlESzAvFCQuPL91Gi1BQC5WvRYxfcsuSNifpp4 ++oelwV7h4LziRly66zsokHdR262FShsFzNdPSZAnHoFIdl+OihToLFNWyZI3oViu +9YlThdnFuiaNRW5TBbLpP2GMGC9ONsnzCfyv4Cwog1Az7HTyUX/79WvpAK8JUS+S +sbzJrNK/zsrTX2yikEx9mDgT92q/yX4fxnM7RwdTu+on7yq0c9j8eiHIryhgMjBb +dSPoMSv0+sRr+n70lIIkPeUXFhrGn4WCdKak7qkCgYEAxtv2WiCO3ayrZ5KF+mbR +Cb913DmBxaNoUBYr9XCjQGqy0wUCjbXO3S+afKQ9+x0IsM76U3nRmRhr3cMB9lt6 +NVp4xJy9snxwbSHt8G48AjlsS3+NZjOCQiBXfs6RNpIG2FuYaoDmqMd7irUprVQ6 +Z+pjJ9xDInmAo+6qvk3vt6kCgYEAudEwi3yOK8ZmCYtsVwYskSomdU9KRzk/TD16 +/msoL87kkn1SeTqocBhnie54XsgcM1Xz/bJJXyKlssnV70MhsuEPGkl0WtTgn6yk +DtD1fSJkmrzJwK9lCDOif8Pe3VD+jZMy6coa3XF9HnGnPwt41Xp16vRYZAhUC0XQ +JlKpuM0CgYA/sW5bebgoukiAOQcep9XmeGOIsQamxesAU8mqqHQxirtSKXWi7Aug +/sFNkNGlX6xL7U9ycz81+QN7mR1EyhH/isXJu6Zqx76+xbJPYw9navsLx4QDqxXa +lj9QB1utjeIRZG0SF81JW/Nu/w2lTagTZphxyPPb0+znFOetYosYWQKBgDBklqv9 +KFmmNfTOZszTQtAbliB/Ie0ir6V/bYTNC45H56dvFAeWiz+GW5DElny4yP9lp0Gv +KQSp1VWW0yyY4zHfAzvpXXA6eLWdFKz3JrgMOP9Do5eXFkzoha2YqXYiHelpKJ1S +kWSSpe9D0jbNGg8e8Y7bTBnhQWIeMHOKm8ERAoGAdB/QT8t19c5Uqt1mInpoHd+S +E6U/DiX44iotuMyKmQ+7LNr54rk4HDSFbGhG1L6lg0OsmoaDsc7GIh0bA3ArXow6 +Nb9pp9GMWOBmh9xolHibUwtjBl2jOR+gKowp+GIQsZgPWynPvhGB/+OAMj9lK+Zi +Za0E11CyogoDEw4csWA= +-----END PRIVATE KEY----- diff --git a/examples/spdy/spdy.js b/examples/spdy/spdy.js index c02f0964a..ca404cb87 100644 --- a/examples/spdy/spdy.js +++ b/examples/spdy/spdy.js @@ -1,13 +1,28 @@ +// MIGRATION NOTICE: This example has been updated to use HTTP/2 instead of SPDY +// SPDY support is deprecated and will be removed in a future version +// Please use the 'http2' option instead of 'spdy' option + var path = require('path'); var fs = require('fs'); var pino = require('pino'); var restify = require('../../lib'); +// OLD (DEPRECATED) - using SPDY: +// var srv = restify.createServer({ +// spdy: { +// cert: fs.readFileSync(path.join(__dirname, './keys/spdy-cert.pem')), +// key: fs.readFileSync(path.join(__dirname, './keys/spdy-key.pem')), +// ca: fs.readFileSync(path.join(__dirname, 'keys/spdy-csr.pem')) +// } +// }); + +// NEW - using native HTTP/2: var srv = restify.createServer({ - spdy: { + http2: { cert: fs.readFileSync(path.join(__dirname, './keys/spdy-cert.pem')), key: fs.readFileSync(path.join(__dirname, './keys/spdy-key.pem')), - ca: fs.readFileSync(path.join(__dirname, 'keys/spdy-csr.pem')) + ca: fs.readFileSync(path.join(__dirname, 'keys/spdy-csr.pem')), + allowHTTP1: true // Allow HTTP/1.1 fallback for compatibility } }); @@ -21,7 +36,7 @@ srv.on( restify.plugins.auditLogger({ event: 'after', body: true, - log: pino({name: 'audit'}) + log: pino({ name: 'audit' }) }) ); diff --git a/lib/index.js b/lib/index.js index bd264b977..8c4f850eb 100644 --- a/lib/index.js +++ b/lib/index.js @@ -36,10 +36,12 @@ var InternalError = errors.InternalError; * will use a domain to catch and respond to any uncaught * exceptions that occur in its handler stack. * Comes with significant negative performance impact. - * @param {Object} [options.spdy] - Any options accepted by - * [node-spdy](https://github.com/indutny/node-spdy). + * @param {Object} [options.spdy] - DEPRECATED: Use options.http2 instead. + * Any options accepted by [node-spdy](https://github.com/indutny/node-spdy). + * This option is deprecated and will be removed in a future version. * @param {Object} [options.http2] - Any options accepted by * [http2.createSecureServer](https://nodejs.org/api/http2.html). + * Recommended replacement for options.spdy. * @param {Boolean} [options.handleUpgrades=false] - Hook the `upgrade` event * from the node HTTP server, pushing `Connection: Upgrade` requests through the * regular request handling chain. @@ -50,7 +52,7 @@ var InternalError = errors.InternalError; * @param {Object} [options.httpsServerOptions] - Any options accepted by * [node-https Server](http://nodejs.org/api/https.html#https_https). * If provided the following restify server options will be ignored: - * spdy, ca, certificate, key, passphrase, rejectUnauthorized, requestCert and + * spdy (deprecated), http2, ca, certificate, key, passphrase, rejectUnauthorized, requestCert and * ciphers; however these can all be specified on httpsServerOptions. * @param {Boolean} [options.noWriteContinue=false] - prevents * `res.writeContinue()` in `server.on('checkContinue')` when proxing diff --git a/lib/server.js b/lib/server.js index 53600e23d..54f57c0d3 100644 --- a/lib/server.js +++ b/lib/server.js @@ -27,7 +27,6 @@ var patchResponse = require('./response'); var domain; var http2; -var spdy; patchResponse(http.ServerResponse); patchRequest(http.IncomingMessage); @@ -187,9 +186,37 @@ function Server(options) { ]; if (options.spdy) { - spdy = require('spdy'); - this.spdy = true; - this.server = spdy.createServer(options.spdy); + // Deprecation warning for SPDY + console.warn( + 'DEPRECATION WARNING: options.spdy is deprecated and will be ' + + 'removed in a future version. Please use options.http2 ' + + 'instead. SPDY functionality is now handled by native ' + + 'HTTP/2 support.' + ); + + // Map SPDY options to HTTP/2 options for backward compatibility + options.http2 = options.spdy; + delete options.spdy; + + // http2 module is not available < v8.4.0 (only with flag <= 8.8.0) + // load http2 module here to avoid experimental warning in other cases + if (!http2) { + try { + http2 = require('http2'); + patchResponse(http2.Http2ServerResponse); + patchRequest(http2.Http2ServerRequest); + // eslint-disable-next-line no-empty + } catch (err) {} + } + + assert( + http2, + 'http2 module is not available, ' + + 'upgrade your Node.js version to >= 8.8.0' + ); + + this.http2 = true; + this.server = http2.createSecureServer(options.http2); } else if (options.http2) { // http2 module is not available < v8.4.0 (only with flag <= 8.8.0) // load http2 module here to avoid experimental warning in other cases @@ -285,9 +312,7 @@ function Server(options) { var addr = self.address(); var str = ''; - if (self.spdy) { - str += 'spdy://'; - } else if (self.secure) { + if (self.secure || self.http2) { str += 'https://'; } else { str += 'http://'; diff --git a/package.json b/package.json index 6b07f155e..0c3bb3f40 100644 --- a/package.json +++ b/package.json @@ -1,151 +1,150 @@ { - "author": "Mark Cavage ", - "contributors": [ - "Adam Argo", - "Alex Liu", - "Alexander Olsson", - "Andrew Robinson", - "Andrew Sliwinski", - "Anro Robinson", - "Armin Tamzarian", - "Asa Ayers", - "Bastiaan Marinus van de Weerd", - "Ben Doerr", - "Ben Hale", - "Ben Howes", - "Ben Hutchison", - "Benjamine Coe", - "Benjamin Urban", - "Blake VanLandingham", - "Brian Pin", - "Bryan Donovan", - "Bryce Kahle", - "Christopher Cannell", - "Clément Désiles", - "Colin O'Brien", - "Corbin Uselton", - "Diego Torres", - "Domenic Denicola", - "Domikik Lessel", - "Dominic Barnes", - "Erik Kristensen", - "Falco Nogatz", - "Gergely Nemeth", - "Guillaume Chauvet", - "Ifiok Idiang", - "Isaac Schlueter", - "Jacob Quatier", - "James O'Cull", - "James Womack", - "Jonathan Dahan", - "Josh Clulow", - "Jorge Serrano", - "Jason Ghent", - "Khaja Naquiuddin", - "Lou Sacco", - "Matt Smillie", - "Mattijs Spierings", - "Micah Ransdell", - "Michal Moskal", - "Michael Paulson", - "Mike Williams", - "Nathanael Anderson", - "Patrick Mooney", - "Paul Bouzakis", - "Pedro Palazón", - "Quentin Buathier", - "Richardo Stuven", - "Scott Turnquest", - "Shaun Berryman", - "Steve Mason", - "Tim Kuijsten", - "Trent Mick", - "Tuure Kanuisto", - "Will Prater", - "Yunong Xiao", - "Zachary Snow" - ], - "name": "restify", - "homepage": "http://restify.com", - "description": "REST framework", - "keywords": [ - "REST", - "framework", - "express", - "DTrace" - ], - "version": "11.2.0", - "repository": { - "type": "git", - "url": "git://github.com/restify/node-restify.git" - }, - "bugs": { - "url": "https://github.com/restify/node-restify/issues" - }, - "main": "lib/index.js", - "directories": { - "lib": "./lib" - }, - "bin": { - "report-latency": "./bin/report-latency" - }, - "engines": { - "node": ">=10.0.0" - }, - "dependencies": { - "assert-plus": "^1.0.0", - "csv": "^6.2.2", - "escape-regexp-component": "^1.0.2", - "ewma": "^2.0.1", - "find-my-way": "^7.6.0", - "formidable": "^1.2.1", - "http-signature": "^1.3.6", - "lodash": "^4.17.11", - "lru-cache": "^7.14.1", - "mime": "^3.0.0", - "negotiator": "^0.6.2", - "once": "^1.4.0", - "pidusage": "^3.0.2", - "pino": "^8.7.0", - "qs": "^6.7.0", - "restify-errors": "^8.0.2", - "semver": "^7.3.8", - "send": "^0.18.0", - "spdy": "^4.0.0", - "uuid": "^9.0.0", - "vasync": "^2.2.0" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8" - }, - "devDependencies": { - "autocannon": "^4.0.0", - "autocannon-compare": "^0.4.0", - "chai": "^4.2.0", - "coveralls": "^3.0.3", - "documentation": "^11.0.0", - "eslint": "^5.16.0", - "eslint-config-prettier": "^4.3.0", - "eslint-plugin-jsdoc": "^3.15.1", - "eslint-plugin-prettier": "^3.1.0", - "glob": "^7.1.4", - "inquirer": "^3.3.0", - "mkdirp": "^0.5.1", - "mocha": "^7.1.1", - "nodeunit": "^0.11.3", - "nyc": "^15.0.0", - "ora": "^1.3.0", - "pre-commit": "^1.2.2", - "prettier": "^1.17.1", - "proxyquire": "^1.8.0", - "restify-clients": "^2.6.6", - "rimraf": "^2.6.3", - "sinon": "^7.5.0", - "validator": "^7.2.0", - "watershed": "^0.4.0" - }, - "license": "MIT", - "scripts": { - "test": "make prepush" - } + "author": "Mark Cavage ", + "contributors": [ + "Adam Argo", + "Alex Liu", + "Alexander Olsson", + "Andrew Robinson", + "Andrew Sliwinski", + "Anro Robinson", + "Armin Tamzarian", + "Asa Ayers", + "Bastiaan Marinus van de Weerd", + "Ben Doerr", + "Ben Hale", + "Ben Howes", + "Ben Hutchison", + "Benjamine Coe", + "Benjamin Urban", + "Blake VanLandingham", + "Brian Pin", + "Bryan Donovan", + "Bryce Kahle", + "Christopher Cannell", + "Clément Désiles", + "Colin O'Brien", + "Corbin Uselton", + "Diego Torres", + "Domenic Denicola", + "Domikik Lessel", + "Dominic Barnes", + "Erik Kristensen", + "Falco Nogatz", + "Gergely Nemeth", + "Guillaume Chauvet", + "Ifiok Idiang", + "Isaac Schlueter", + "Jacob Quatier", + "James O'Cull", + "James Womack", + "Jonathan Dahan", + "Josh Clulow", + "Jorge Serrano", + "Jason Ghent", + "Khaja Naquiuddin", + "Lou Sacco", + "Matt Smillie", + "Mattijs Spierings", + "Micah Ransdell", + "Michal Moskal", + "Michael Paulson", + "Mike Williams", + "Nathanael Anderson", + "Patrick Mooney", + "Paul Bouzakis", + "Pedro Palazón", + "Quentin Buathier", + "Richardo Stuven", + "Scott Turnquest", + "Shaun Berryman", + "Steve Mason", + "Tim Kuijsten", + "Trent Mick", + "Tuure Kanuisto", + "Will Prater", + "Yunong Xiao", + "Zachary Snow" + ], + "name": "restify", + "homepage": "http://restify.com", + "description": "REST framework", + "keywords": [ + "REST", + "framework", + "express", + "DTrace" + ], + "version": "11.2.0", + "repository": { + "type": "git", + "url": "git://github.com/restify/node-restify.git" + }, + "bugs": { + "url": "https://github.com/restify/node-restify/issues" + }, + "main": "lib/index.js", + "directories": { + "lib": "./lib" + }, + "bin": { + "report-latency": "./bin/report-latency" + }, + "engines": { + "node": ">=10.0.0" + }, + "dependencies": { + "assert-plus": "^1.0.0", + "csv": "^6.2.2", + "escape-regexp-component": "^1.0.2", + "ewma": "^2.0.1", + "find-my-way": "^7.6.0", + "formidable": "^1.2.1", + "http-signature": "^1.3.6", + "lodash": "^4.17.11", + "lru-cache": "^7.14.1", + "mime": "^3.0.0", + "negotiator": "^0.6.2", + "once": "^1.4.0", + "pidusage": "^3.0.2", + "pino": "^8.7.0", + "qs": "^6.7.0", + "restify-errors": "^8.0.2", + "semver": "^7.3.8", + "send": "^0.18.0", + "uuid": "^9.0.0", + "vasync": "^2.2.0" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8" + }, + "devDependencies": { + "autocannon": "^4.0.0", + "autocannon-compare": "^0.4.0", + "chai": "^4.2.0", + "coveralls": "^3.0.3", + "documentation": "^11.0.0", + "eslint": "^5.16.0", + "eslint-config-prettier": "^4.3.0", + "eslint-plugin-jsdoc": "^3.15.1", + "eslint-plugin-prettier": "^3.1.0", + "glob": "^7.1.4", + "inquirer": "^3.3.0", + "mkdirp": "^0.5.1", + "mocha": "^7.1.1", + "nodeunit": "^0.11.3", + "nyc": "^15.0.0", + "ora": "^1.3.0", + "pre-commit": "^1.2.2", + "prettier": "^1.17.1", + "proxyquire": "^1.8.0", + "restify-clients": "^2.6.6", + "rimraf": "^2.6.3", + "sinon": "^7.5.0", + "validator": "^7.2.0", + "watershed": "^0.4.0" + }, + "license": "MIT", + "scripts": { + "test": "make prepush" + } } diff --git a/test/keys/http2-cert.pem b/test/keys/http2-cert.pem index 2f13995ff..9e4a7da45 100644 --- a/test/keys/http2-cert.pem +++ b/test/keys/http2-cert.pem @@ -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== +MIIDvTCCAqWgAwIBAgIUX/WWo1S7U4MmT8s6nE7Mg82Tx0owDQYJKoZIhvcNAQEL +BQAwbjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh +bmNpc2NvMRQwEgYDVQQKDAtSZXN0aWZ5VGVzdDEQMA4GA1UECwwHVGVzdGluZzES +MBAGA1UEAwwJbG9jYWxob3N0MB4XDTI1MDgyMTEzNDkwNloXDTM1MDgxOTEzNDkw +NlowbjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh +bmNpc2NvMRQwEgYDVQQKDAtSZXN0aWZ5VGVzdDEQMA4GA1UECwwHVGVzdGluZzES +MBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAxTkTgRJoTWmhjA8je1fvPyE1yAbHQYuyyg0czIvEZh2rRzt8gzYBuL225tyw +5vI1whECobsE/6mKFYRlAz9k/7ewGlokeQig/K7KpKPEuihdCY9MbrbftxwPd0xh +NkRm7MP2t3w9mjoPtETywHwlm8VOSsXN6Cc5Fi4w3cQRiOXX1krvFqd0n0MYgCIE +muRrKi5BUutiV2h/i9/2sxDE5FV/kRqISKvspFLirOBk3s2kkaGgNCroHDEHshOW +aiJfFZwEFWU5CJY9IQltrzNprk6QPnfggyu3W3O/UHNryQxfAip1NoKb+aDWvVNk +uqQFNP50OoJP6MLTaDxahjc5/QIDAQABo1MwUTAdBgNVHQ4EFgQUgauOXLj8I9cl +tK6ODJFZpN4DQvgwHwYDVR0jBBgwFoAUgauOXLj8I9cltK6ODJFZpN4DQvgwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAYeyWII2I7gf44LOgszON +5Y5N/6WLZKpQXkGBGqpy5rWwo3AKwy4UhQj9n61mgzOrRj3ED7YmnwZ8n/ZgD1mW +kjVXmpIdaUZUXYV/ykfaQy3okWgr1XEqyG0zPJ3wHCM1w5vv+stSmuapI+NcUNqm +O+vxhW21o6dTfK7/7VxDhaBvgyLzLjRH7kQLFZgWvzXWZ7zjpD1oJsENkdd+hrmH +TQWvOeC+8XhqW4s33DTVmXvdpPIDVpp2PPcrfP8ZWw/dNixlnmQ5JhMN+QvsUgpP +achYyOB1Utzmx1JZyxZBGYYJSuRvs3wcGxsYI/LWaKv81JSaZ+MrSCeQXN+iBewg +Tg== -----END CERTIFICATE----- - diff --git a/test/keys/http2-csr.pem b/test/keys/http2-csr.pem index b4d764fdc..861874a32 100644 --- a/test/keys/http2-csr.pem +++ b/test/keys/http2-csr.pem @@ -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 +AQ8AMIIBCgKCAQEAxTkTgRJoTWmhjA8je1fvPyE1yAbHQYuyyg0czIvEZh2rRzt8 +gzYBuL225tyw5vI1whECobsE/6mKFYRlAz9k/7ewGlokeQig/K7KpKPEuihdCY9M +brbftxwPd0xhNkRm7MP2t3w9mjoPtETywHwlm8VOSsXN6Cc5Fi4w3cQRiOXX1krv +Fqd0n0MYgCIEmuRrKi5BUutiV2h/i9/2sxDE5FV/kRqISKvspFLirOBk3s2kkaGg +NCroHDEHshOWaiJfFZwEFWU5CJY9IQltrzNprk6QPnfggyu3W3O/UHNryQxfAip1 +NoKb+aDWvVNkuqQFNP50OoJP6MLTaDxahjc5/QIDAQABoAAwDQYJKoZIhvcNAQEL +BQADggEBABNrIyaCuSZtSV8TBnG26KK+ZddPRoNYB4JX65OvWy+IwkGdw3lTL1N+ +yaZEWMp/wsui2+btISIMZSjSmEMEVYKSePTahrGBcfrnoOUEeJrayWl89pXrZ5Bp +8l5bOX6j+AFYWJ4eCO++7RCYDcBEKO9PXpYlDXaQFFeo8pN3cf13VOmJqhmbbCpf +QFMz8vIJUbg9IIAIBHcNL51ZDeYJntbA+yJOMDtLgn+/iJJSX8ekL2MD0cU64AfH +rZCh+vc2E/klVi/ev+jtPQ4Ci48kfGIFetR2Ka+k/P8kQRcwNJrBiAyNY40ig47H +Nb5cxP3CcdV++3BeE66jKZEZaVLNXFY= -----END CERTIFICATE REQUEST----- - diff --git a/test/keys/http2-key.pem b/test/keys/http2-key.pem index 957810910..e7ba1da13 100644 --- a/test/keys/http2-key.pem +++ b/test/keys/http2-key.pem @@ -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----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFOROBEmhNaaGM +DyN7V+8/ITXIBsdBi7LKDRzMi8RmHatHO3yDNgG4vbbm3LDm8jXCEQKhuwT/qYoV +hGUDP2T/t7AaWiR5CKD8rsqko8S6KF0Jj0xutt+3HA93TGE2RGbsw/a3fD2aOg+0 +RPLAfCWbxU5Kxc3oJzkWLjDdxBGI5dfWSu8Wp3SfQxiAIgSa5GsqLkFS62JXaH+L +3/azEMTkVX+RGohIq+ykUuKs4GTezaSRoaA0KugcMQeyE5ZqIl8VnAQVZTkIlj0h +CW2vM2muTpA+d+CDK7dbc79Qc2vJDF8CKnU2gpv5oNa9U2S6pAU0/nQ6gk/owtNo +PFqGNzn9AgMBAAECggEAS2C9K5+1baDptXYzwXiiYCZ5P7IXhd22v7KzRxpEPiMo +y1jZBe0mS013ElVW5227TijiMJ4iEvThacfoM42PNI0oKWo6dmft36WOnc5Z6ixz +Iqw6MjaC2qFG5/mxTeRm0iczrH03rjJyvht8DEVmulp2ye0//XLARtHwq1G8we0r +BPg9k1QohrPxwffJON2o8aXo/y0tdH/z3TYgcQ2XJLcvptR/URvGy3PPt12GKRwD +XLtaiXRi9HR/tQVj05HDpSBkvhQ/uZCr51AvrmN6t+ro4gTbAHTK5HOCMkeUA17f +9WwCGj2JXWw+IJek72va30Q2rHpyB8FKoMhE/OXWoQKBgQDipFeYNvnCBIbdjq65 +J0U+hHlLLYkZOfjA1VSJIvfHU4wddTdfmNvCFyAEXXGRxXq7yb6Ucq/fZp0iVzdm +39t6BPfHzAZwCPBQ/jyrCFp/cW7OhdEjq2lqAoWgH9UFm/DtqTAAfRRf+i57hceR +eprJA5ENl2nR4+FwdmDzcCfibwKBgQDexSwjfXahu2UQ8DVJJ9bBN79RgU3hGGTI +9mGW3JDvULOW8rfX7evihrZ5dsoEAdXuAYr+n+MSwe30yue0o/mjAwcRYGrTpnDN +ZKi2kL0vnq/V3ct6zkbORmLkq5J6qygAD9d3W9DNwESyPsOc4yUstT0Zm/iJxTwe +fOgEWGwwUwKBgC7r1zasKwj/5uv3njS27J8EzhfCVZ/jYJyLjfTWSHX71gZDPjOM +cfK81uQQdHK5b69xFQOmusKFfAKgC9hAgC/C14mFs89+CkK6X9UI5bN8yHP5QFMi +KbDI1OFRtchzgG2zmTyAqLc2FGl+SNLVjzYOhvlJX58Ujpe56lh738YBAoGBAIoK +/r4DShcQi6FCaJKrmD1lMS3thXf96L5LRs/4X+ucQ50/TMMGkQxvU/XSsX5oMMvq +stnz8/80oyL09T4P+mqUPrX63FfJJM9yF8YBzOoMWIObjDLOTjwWi8ONuhg/pWrc +ZjV1dN96zFbz4719WBTrPjB3YTzmNsnhttiyfmA3AoGBAK1AIlxw2i3VSyjmHONV +NmqIzZwbMZF6U5Io0o2i6QcZu7jpU8csYy/uL/0YxKZy1zQkGyp6yxMNFVoYLHX5 +SJszsLpGf0ntNsS5Owy656bHHRoazSjWRKvFooKyoXcjiBfgZoAJZvU/UK4cd0vC +S9jZFXmG5bnYyKDdASRP9IaX +-----END PRIVATE KEY-----