| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | require('color'); |
| |
|
| | function startServer( port, grunt ) { |
| |
|
| | "use strict"; |
| |
|
| | var JSON_MIME_TYPE = "application/octet-stream"; |
| | var verboseLog = grunt? grunt.verbose.ok : console.log, |
| | errorLog = grunt? grunt.log.error : console.error; |
| |
|
| | function echoBackBody(req, res) { |
| | req.pipe(res); |
| | } |
| | |
| | function echoBackHeadersAsBodyJson(req, res) { |
| | res.end(JSON.stringify(req.headers)); |
| | } |
| | |
| | function echoBackHeadersAsHeaders(req, res) { |
| | for( var name in req.headers ) { |
| | res.set(name, req.headers[name]); |
| | } |
| | res.end('{"see":"headers", "for":"content"}'); |
| | } |
| | |
| | function replyWithTenSlowNumbers(_req, res) { |
| | sendJsonOkHeaders(res); |
| | |
| | var NUMBER_INTERVAL = 250; |
| | var MAX_NUMBER = 9; |
| |
|
| | verboseLog( |
| | 'slow number server: will write numbers 0 ..' + |
| | String(MAX_NUMBER).blue + |
| | ' out as a json array at a rate of one per', |
| | String(NUMBER_INTERVAL).blue + 'ms' |
| | ); |
| | |
| | res.write('[\n'); |
| | |
| | var curNumber = 0; |
| | |
| | var inervalId = setInterval(function () { |
| | |
| | res.write(String(curNumber)); |
| | |
| | if (curNumber == MAX_NUMBER) { |
| | |
| | res.end(']'); |
| | clearInterval(inervalId); |
| | verboseLog('slow number server: finished writing out'); |
| | } else { |
| | res.write(',\n'); |
| | curNumber++; |
| | } |
| | |
| | }, NUMBER_INTERVAL); |
| | } |
| |
|
| | function replyWithInvalidJson(req, res) { |
| | res.end('{{'); |
| | } |
| | |
| | function serve404Json(req, res) { |
| | |
| | res.status(404).send(JSON.stringify( |
| | { |
| | "found":"false", |
| | "errorMessage":"was not found" |
| | } |
| | )); |
| | } |
| | |
| | function replyWithStaticJson(req, res) { |
| | sendJsonOkHeaders(res); |
| | |
| | if( !req.url ) { |
| | throw new Error('no url given'); |
| | } |
| | |
| | var filename = 'test/json/' + req.params.name + '.json'; |
| | |
| | verboseLog('will respond with contents of file ' + filename); |
| | |
| | require('fs').createReadStream(filename) |
| | .on('error', function(err){ |
| | errorLog('could not read static file ' + filename + |
| | ' ' + err); |
| | }).pipe(res); |
| | |
| | } |
| | |
| | function sendJsonOkHeaders(res) { |
| |
|
| | res.setHeader("Content-Type", JSON_MIME_TYPE); |
| | res.writeHead(200); |
| | } |
| | |
| | function twoHundredItems(_req, res) { |
| | |
| | var TIME_BETWEEN_RECORDS = 40; |
| | |
| | var NUMBER_OF_RECORDS = 200; |
| | |
| | res.write('{"data": ['); |
| | |
| | var i = 0; |
| | |
| | var inervalId = setInterval(function () { |
| | |
| | res.write(JSON.stringify({ |
| | "id": i, |
| | "url": "http://localhost:4444/item/" + i, |
| | |
| | "number1": Math.random(), |
| | "number2": Math.random(), |
| | "number3": Math.random(), |
| | "number4": Math.random() |
| | })); |
| | |
| | if (i == NUMBER_OF_RECORDS) { |
| | |
| | res.end(']}'); |
| | |
| | clearInterval(inervalId); |
| | |
| | console.log('db server: finished writing to stream'); |
| | } else { |
| | res.write(','); |
| | } |
| | |
| | i++; |
| | |
| | }, TIME_BETWEEN_RECORDS); |
| | } |
| | |
| | function replyWithTenSlowNumbersGzipped(req, serverResponse){ |
| | |
| | |
| | require('http').get({ |
| | host: 'localhost', |
| | path: '/twoHundredItems', |
| | port: port }) |
| | .on('response', function(clientResponse){ |
| | |
| | var zlib = require('zlib'); |
| | |
| | |
| | |
| | serverResponse.setHeader("content-type", JSON_MIME_TYPE); |
| | serverResponse.setHeader("content-encoding", 'gzip'); |
| | serverResponse.writeHead(200); |
| | |
| | clientResponse.pipe(zlib.createGzip({ |
| | flush: zlib.Z_SYNC_FLUSH |
| | })).pipe(serverResponse); |
| | |
| | }); |
| | } |
| | |
| | function makeApp() { |
| | var express = require('express'), |
| | app = express(); |
| |
|
| | app.get( '/echoBackBody', function(req, res){ res.end("POST/PUT/PATCH here, don't GET")}); |
| | app.post( '/echoBackBody', echoBackBody); |
| | app.put( '/echoBackBody', echoBackBody); |
| | app.patch( '/echoBackBody', echoBackBody); |
| | app.get( '/echoBackHeadersAsBodyJson', echoBackHeadersAsBodyJson); |
| | app.post( '/echoBackHeadersAsBodyJson', echoBackHeadersAsBodyJson); |
| | app.put( '/echoBackHeadersAsBodyJson', echoBackHeadersAsBodyJson); |
| | app.patch( '/echoBackHeadersAsBodyJson', echoBackHeadersAsBodyJson); |
| | app.get( '/echoBackHeadersAsHeaders', echoBackHeadersAsHeaders); |
| | app.get( '/static/json/:name.json', replyWithStaticJson); |
| | app.get( '/tenSlowNumbers', replyWithTenSlowNumbers); |
| | app.get( '/twoHundredItems', twoHundredItems); |
| | app.get( '/gzippedTwoHundredItems', replyWithTenSlowNumbersGzipped); |
| | app.get( '/invalidJson', replyWithInvalidJson); |
| | app.get( '/404json', serve404Json); |
| |
|
| | return app; |
| | } |
| | |
| | makeApp().listen(port); |
| | |
| | verboseLog('streaming source server started on port'.green, String(port).blue); |
| | } |
| |
|
| |
|
| | function exportApi(){ |
| |
|
| | var server; |
| |
|
| | module.exports.start = function(port, grunt){ |
| | server = startServer(port, grunt); |
| | }; |
| | module.exports.stop = function(){ |
| | server.close(); |
| | }; |
| | } |
| |
|
| | exportApi(); |
| |
|