initial commit

This commit is contained in:
schrom01 2022-11-04 07:58:11 +01:00
commit a8257389ad
5 changed files with 228 additions and 0 deletions

91
code/expresso/index.js Normal file
View File

@ -0,0 +1,91 @@
/**
* Webservice mit Express
* WBE-Praktikum
*/
var express = require('express')
var app = express()
// Fehlerobjekt anlegen
//
function error(status, msg) {
var err = new Error(msg)
err.status = status
return err
}
// Zufällige ID erzeugen, Quelle:
// https://stackoverflow.com/questions/6860853/generate-random-string-for-div-id#6860916
//
function guidGenerator() {
var S4 = function() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1)
}
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4())
}
// API-Key überprüfen
//
app.use('/api', function(req, res, next){
var key = req.query['api-key']
// Key fehlt
if (!key) {
return next(error(400, 'api key required'))
}
// Key falsch
if (!~apiKeys.indexOf(key)) {
return next(error(401, 'invalid api key'))
}
// korrekter Key
req.key = key
next()
})
// JSON-Daten akzeptieren
app.use(express.json())
// gültige API-Keys
var apiKeys = ['wbeweb']
// unsere tolle in-memory Datenbank :)
var data = {1234567890: {demodata: "wbe is an inspiring challenge"}}
// GET-Request bearbeiten
//
app.get('/api/data/:id', function(req, res, next){
var id = req.params.id
var result = data[id]
if (result) res.send(result)
else next()
})
// POST-Request bearbeiten
//
app.post('/api/data', function (req, res, next) {
let id = guidGenerator()
data[id] = req.body
res.send({id})
})
// Middleware mit vier Argumenten wird zur Fehlerbehandlung verwendet
//
app.use(function(err, req, res, next){
res.status(err.status || 500)
res.send({ error: err.message })
})
// Catch-all: wenn keine vorangehende Middleware geantwortet hat, wird
// hier ein 404 (not found) erzeugt
//
app.use(function(req, res){
res.status(404)
res.send({ error: "not found" })
})
app.listen(3000)
console.log('Express started on port 3000')

View File

@ -0,0 +1,14 @@
{
"name": "expresso",
"version": "1.0.0",
"description": "Express Demo Project",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "bkrt",
"license": "ISC",
"dependencies": {
"express": "^4.17.1"
}
}

View File

@ -0,0 +1,109 @@
const {createServer} = require("http");
const methods = Object.create(null);
createServer((request, response) => {
let handler = methods[request.method] || notAllowed;
handler(request)
.catch(error => {
if (error.status != null) return error;
return {body: String(error), status: 500};
})
.then(({body, status = 200, type = "text/plain"}) => {
response.writeHead(status, {"Content-Type": type});
if (body && body.pipe) body.pipe(response);
else response.end(body);
});
}).listen(8000);
async function notAllowed(request) {
return {
status: 405,
body: `Method ${request.method} not allowed.`
};
}
var {parse} = require("url");
var {resolve, sep} = require("path");
var baseDirectory = process.cwd();
function urlPath(url) {
let {pathname} = parse(url);
let path = resolve(decodeURIComponent(pathname).slice(1));
if (path != baseDirectory &&
!path.startsWith(baseDirectory + sep)) {
throw {status: 403, body: "Forbidden"};
}
return path;
}
const {createReadStream} = require("fs");
const {stat, readdir} = require("fs").promises;
const mime = require("mime");
methods.GET = async function(request) {
let path = urlPath(request.url);
let stats;
try {
stats = await stat(path);
} catch (error) {
if (error.code != "ENOENT") throw error;
else return {status: 404, body: "File not found"};
}
if (stats.isDirectory()) {
return {body: (await readdir(path)).join("\n")};
} else {
return {body: createReadStream(path),
type: mime.getType(path)};
}
};
const {rmdir, unlink} = require("fs").promises;
methods.DELETE = async function(request) {
let path = urlPath(request.url);
let stats;
try {
stats = await stat(path);
} catch (error) {
if (error.code != "ENOENT") throw error;
else return {status: 204};
}
if (stats.isDirectory()) await rmdir(path);
else await unlink(path);
return {status: 204};
};
const {createWriteStream} = require("fs");
function pipeStream(from, to) {
return new Promise((resolve, reject) => {
from.on("error", reject);
to.on("error", reject);
to.on("finish", resolve);
from.pipe(to);
});
}
methods.PUT = async function(request) {
let path = urlPath(request.url);
await pipeStream(request, createWriteStream(path));
return {status: 204};
};
const {mkdir} = require("fs").promises;
methods.MKCOL = async function(request) {
let path = urlPath(request.url);
let stats;
try {
stats = await stat(path);
} catch (error) {
if (error.code != "ENOENT") throw error;
await mkdir(path);
return {status: 204};
}
if (stats.isDirectory()) return {status: 204};
else return {status: 400, body: "Not a directory"};
};

View File

@ -0,0 +1,14 @@
{
"name": "fileserver",
"version": "1.0.0",
"description": "Demo Fileserver",
"main": "fileserver.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Eloquent JavaScript",
"license": "ISC",
"dependencies": {
"mime": "^2.2.0"
}
}

BIN
praktikum.pdf Normal file

Binary file not shown.