From d3f5313362da9f096ff6b02f4d0a527acea2282c Mon Sep 17 00:00:00 2001 From: Tomas Varga Date: Mon, 5 Feb 2018 23:37:06 +0100 Subject: [PATCH] Initial commit - upload-serve-files, download-file-request, echo-request --- .gitignore | 2 + README.md | 3 + node/download-file-request/index.js | 36 +++++++ node/download-file-request/package.json | 15 +++ node/echo-request/echo-request.js | 33 +++++++ node/echo-request/send-request-curl.sh | 8 ++ node/upload-serve-files-koa_v1/.gitignore | 2 + node/upload-serve-files-koa_v1/index.js | 98 +++++++++++++++++++ node/upload-serve-files-koa_v1/package.json | 20 ++++ .../upload-serve-files-koa_v1/public/404.html | 15 +++ .../public/index.html | 20 ++++ 11 files changed, 252 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 node/download-file-request/index.js create mode 100644 node/download-file-request/package.json create mode 100644 node/echo-request/echo-request.js create mode 100755 node/echo-request/send-request-curl.sh create mode 100644 node/upload-serve-files-koa_v1/.gitignore create mode 100644 node/upload-serve-files-koa_v1/index.js create mode 100644 node/upload-serve-files-koa_v1/package.json create mode 100644 node/upload-serve-files-koa_v1/public/404.html create mode 100644 node/upload-serve-files-koa_v1/public/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..504afef --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +package-lock.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..4bd8463 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Testground Web Devel + +Various web development related tests and examples. diff --git a/node/download-file-request/index.js b/node/download-file-request/index.js new file mode 100644 index 0000000..f450189 --- /dev/null +++ b/node/download-file-request/index.js @@ -0,0 +1,36 @@ +var http = require('http'); +var qs = require('querystring'); + +var body; +var mime = 'application/zip'; +var port = 3000; + +var server = http.createServer(function (req, res) { + if (req.method !== 'POST') { + res.writeHead(200); + res.end('Only POST method supported so far!'); + }; + req.on('data', function (data) { + body += data; + + if (body.length > 1e6) + req.connection.destroy(); + }); + req.on('end', function () { + var post = qs.parse(body); + + if (!post.file) { + res.writeHead(200); + res.end('No file provided!'); + } + + var content = 'data:' + mime + ';base64,' + post.file; + + res.writeHead(200, { 'Content-Type': mime }); + res.end(content, 'utf-8'); + }); +}); + +server.listen(port, function () { + console.log('File resender listening on port ' + port); +}); diff --git a/node/download-file-request/package.json b/node/download-file-request/package.json new file mode 100644 index 0000000..b33d2c1 --- /dev/null +++ b/node/download-file-request/package.json @@ -0,0 +1,15 @@ +{ + "name": "download-file-request", + "version": "1.0.0", + "description": "Offers download response for 'file' field post request", + "main": "index.js", + "scripts": { + "serve": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": " ", + "license": "ISC", + "dependencies": { + }, + "devDependencies": {} +} diff --git a/node/echo-request/echo-request.js b/node/echo-request/echo-request.js new file mode 100644 index 0000000..26f4992 --- /dev/null +++ b/node/echo-request/echo-request.js @@ -0,0 +1,33 @@ +/** + * A simple service just echoes received data + * + * usage: node echorequest.js [port=3001] + */ + +const http = require('http'); + +const hostname = '0.0.0.0'; +const port = process.argv[2] || 3001; + +const server = http.createServer(function (req, res) { + console.log(`\n${req.method} ${req.url}`); + console.log('HEADERS:', req.headers); + + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + + var data = ''; + + req.on('data', function(chunk) { + data += chunk + }); + + req.on('end', function() { + console.log('BODY: ' + data); + res.end(data + "\n"); + }); +}); + +server.listen(port, hostname, function () { + console.log(`Server running at http://localhost:${port}/`); +}); diff --git a/node/echo-request/send-request-curl.sh b/node/echo-request/send-request-curl.sh new file mode 100755 index 0000000..8977cc4 --- /dev/null +++ b/node/echo-request/send-request-curl.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +port=${1:-3001} + +curl -d 'par1=value1' \ + -d 'par2=value2' \ + -d 'par3=value3&par4=value4' \ + -XPOST "localhost:$port" diff --git a/node/upload-serve-files-koa_v1/.gitignore b/node/upload-serve-files-koa_v1/.gitignore new file mode 100644 index 0000000..8349d7f --- /dev/null +++ b/node/upload-serve-files-koa_v1/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +files/* diff --git a/node/upload-serve-files-koa_v1/index.js b/node/upload-serve-files-koa_v1/index.js new file mode 100644 index 0000000..e264e51 --- /dev/null +++ b/node/upload-serve-files-koa_v1/index.js @@ -0,0 +1,98 @@ +var app = require('koa')(); +var mount = require('koa-mount'); +var serve = require('koa-static'); +var sendfile = require('koa-sendfile'); +var parse = require('co-busboy'); +var fs = require('fs'); + +var ROOT_DIR = __dirname + '/'; +var FILES_DIR = ROOT_DIR + 'files/'; + +app.use(function *showRequest(next) { + console.log('path:', this.path, 'method:', this.method, '-----------------------'); + console.log('querystring:', this.request.querystring, 'query:', this.request.query); + console.log('urlencoded:', this.request.is('urlencoded'), 'multipart:', this.request.is('multipart')); + console.log('request:', this.request); + yield next; +}); + +app.use(serve(__dirname + '/public')); + +app.use(function *getMultipartRequest(next) { + if (!this.request.is('multipart')) + return yield next; + + var files = []; + var parts = parse(this); + var part; + + while (part = yield parts) { + if (!part.pipe) { + console.log('fields:', part); + continue; + } + + /* + yield saveFile(part, FILES_DIR).then(function (resp) { + files.push(resp); + }, function (error) { + files.push(error); + }); + */ + files.push(yield saveFile(part, FILES_DIR)); + } + + this.body = files; +}); + +app.use(mount('/download', function *sendFileHandler(next) { + yield next; + + var fname = this.request.query.file || 'archive.zip'; + + if (!(yield fileExists(FILES_DIR + fname))) + return this.body = { message: 'File not found.', file: fname }; + + var stats = yield sendfile(this, FILES_DIR + fname); + //console.log('sendfile response:', this.response); + + if (!this.status) + this.throw(404); +})); + +function saveFile(stream, destDir) { + //return new Promise(function(resolve, reject) { + return function(done) { + var writer = fs.createWriteStream(destDir + stream.filename); + var resp = { file: stream.filename }; + + stream.on('error', finish); + writer.on('error', finish); + + writer.on('close', function () { + finish(null, { bytesWritten: writer.bytesWritten }); + }); + + stream.pipe(writer); + + function finish(error, args) { + resp.message = error ? 'saving ' + resp.file + ' failed:' + error + : 'saved ' + resp.file + ' (' + args.bytesWritten + ' bytes)'; + //error ? reject(resp) : resolve(resp); + done(null, resp); + } + //}); + } +} + +function fileExists(path) { + return function(done) { + fs.stat(path, function (err, res) { + done(null, !err); + }); + } +} + +app.listen(3000); + +console.log('listening on port 3000'); diff --git a/node/upload-serve-files-koa_v1/package.json b/node/upload-serve-files-koa_v1/package.json new file mode 100644 index 0000000..a00ae88 --- /dev/null +++ b/node/upload-serve-files-koa_v1/package.json @@ -0,0 +1,20 @@ +{ + "name": "upload-serve-files-koa_v1", + "version": "1.0.0", + "description": "Testing point for downloads & uploads", + "main": "index.js", + "scripts": { + "serve": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": " ", + "license": "ISC", + "dependencies": { + "co-busboy": "^1.3.1", + "koa": "^1.2.0", + "koa-mount": "^1.3.0", + "koa-sendfile": "^2.0.0", + "koa-static": "^2.0.0" + }, + "devDependencies": {} +} diff --git a/node/upload-serve-files-koa_v1/public/404.html b/node/upload-serve-files-koa_v1/public/404.html new file mode 100644 index 0000000..ddfe790 --- /dev/null +++ b/node/upload-serve-files-koa_v1/public/404.html @@ -0,0 +1,15 @@ + + + Not Found + + + +

Sorry! Can't find that.

+

The page you requested cannot be found.

+ + diff --git a/node/upload-serve-files-koa_v1/public/index.html b/node/upload-serve-files-koa_v1/public/index.html new file mode 100644 index 0000000..dcd9e5f --- /dev/null +++ b/node/upload-serve-files-koa_v1/public/index.html @@ -0,0 +1,20 @@ + + + + Upload + + + +

File Upload

+

Try uploading multiple files at a time.

+
+ + +
+ +