Code files
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "accepting-json",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"start": "node server.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "David Mark Clements",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fast-json-parse": "^1.0.2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<form method="post">
|
||||
<input type="text" name="userinput1"><br>
|
||||
<input type="text" name="userinput2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
<script>
|
||||
document.forms[0].addEventListener('submit', function (evt) {
|
||||
evt.preventDefault()
|
||||
var form = this
|
||||
var data = Object.keys(form).reduce(function (o, i) {
|
||||
if (form[i].name) o[form[i].name] = form[i].value
|
||||
return o
|
||||
}, {})
|
||||
form.innerHTML = ''
|
||||
var xhr = new XMLHttpRequest()
|
||||
xhr.open('POST', '/')
|
||||
xhr.setRequestHeader('Content-Type', 'application/json')
|
||||
xhr.send(JSON.stringify(data))
|
||||
xhr.addEventListener('load', function () {
|
||||
var res
|
||||
try { res = JSON.parse(this.response) } catch (e) {
|
||||
res = {error: 'Mangled Response'}
|
||||
}
|
||||
form.innerHTML = res.error
|
||||
? res.error
|
||||
: 'You Posted: ' + JSON.stringify(res.data)
|
||||
})
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,73 @@
|
||||
'use strict'
|
||||
|
||||
const http = require('http')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const parse = require('fast-json-parse')
|
||||
const form = fs.readFileSync(path.join(__dirname, 'public', 'form.html'))
|
||||
const maxData = 2 * 1024 * 1024 // 2mb
|
||||
|
||||
http.createServer((req, res) => {
|
||||
if (req.method === 'GET') {
|
||||
get(res)
|
||||
return
|
||||
}
|
||||
if (req.method === 'POST') {
|
||||
post(req, res)
|
||||
return
|
||||
}
|
||||
reject(405, 'Method Not Allowed', res)
|
||||
}).listen(8080)
|
||||
|
||||
function get (res) {
|
||||
res.writeHead(200, {'Content-Type': 'text/html'})
|
||||
res.end(form)
|
||||
}
|
||||
|
||||
function post (req, res) {
|
||||
if (req.headers['content-type'] !== 'application/json') {
|
||||
reject(415, 'Unsupported Media Type', res)
|
||||
return
|
||||
}
|
||||
const size = parseInt(req.headers['content-length'], 10)
|
||||
if (isNaN(size)) {
|
||||
reject(400, 'Bad Request', res)
|
||||
return
|
||||
}
|
||||
if (size > maxData) {
|
||||
reject(413, 'Too Large', res)
|
||||
return
|
||||
}
|
||||
const buffer = Buffer.allocUnsafe(size)
|
||||
var pos = 0
|
||||
|
||||
req
|
||||
.on('data', (chunk) => {
|
||||
const offset = pos + chunk.length
|
||||
if (offset > size) {
|
||||
reject(413, 'Too Large', res)
|
||||
return
|
||||
}
|
||||
chunk.copy(buffer, pos)
|
||||
pos = offset
|
||||
})
|
||||
.on('end', () => {
|
||||
if (pos !== size) {
|
||||
reject(400, 'Bad Request', res)
|
||||
return
|
||||
}
|
||||
const data = buffer.toString()
|
||||
const parsed = parse(data)
|
||||
if (parsed.err) {
|
||||
reject(400, 'Bad Request', res)
|
||||
return
|
||||
}
|
||||
console.log('User Posted: ', parsed.value)
|
||||
res.end('{"data": ' + data + "}")
|
||||
})
|
||||
}
|
||||
|
||||
function reject (code, msg, res) {
|
||||
res.statusCode = code
|
||||
res.end(msg)
|
||||
}
|
||||
Reference in New Issue
Block a user