Skip to content
5 changes: 5 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
**/node_modules/*
**/vendor/*
**/*.min.js
**/coverage/*
**/build/*
21 changes: 21 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"rules": {
"no-console": "off",
"indent": [ "error", 2 ],
"quotes": [ "error", "single" ],
"semi": ["error", "always"],
"linebreak-style": [ "error", "unix" ]
},
"env": {
"es6": true,
"node": true,
"mocha": true,
"jasmine": true
},
"ecmaFeatures": {
"modules": true,
"experimentalObjectRestSpread": true,
"impliedStrict": true
},
"extends": "eslint:recommended"
}
136 changes: 136 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# Created by https://www.gitignore.io/api/osx,vim,node,macos,windows

### macOS ###
*.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Typescript v1 declaration files
typings/

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env


### OSX ###

# Icon must end with two \r

# Thumbnails

# Files that might appear in the root of a volume

# Directories potentially created on remote AFP share

### Vim ###
# swap
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]
# session
Session.vim
# temporary
.netrwhist
*~
# auto-generated tag files
tags

### Windows ###
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

# End of https://www.gitignore.io/api/osx,vim,node,macos,windows
22 changes: 22 additions & 0 deletions lib/parse-body.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
'use strict';

module.exports = function(req, callback) {
let tempBody = '';

req.on('data', function(data) {
tempBody += data.toString();
});

req.on('end', function() {
if(!tempBody){
return callback(new Error('empty body'));
}
try {
let parse = JSON.parse(tempBody);
req.body = parse;
callback(null, req.body);
} catch (err) {
callback(err);
}
});
};
23 changes: 23 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "07-http_servers",
"version": "1.0.0",
"description": "![cf](https://i.imgur.com/7v5ASc8.png) Lab 07: Vanilla HTTP Server ======",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"repository": {
"start": "node server.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/Jamesbillard12/07-http_servers/issues"
},
"homepage": "https://github.com/Jamesbillard12/07-http_servers#readme",
"dependencies": {
"cowsay": "^1.1.9"
}
}
73 changes: 73 additions & 0 deletions server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
'use strict';

const http = require('http');
const url = require('url');
const querystring = require('querystring');
const cowsay = require('cowsay');
const parseBody = require('./lib/parse-body.js');
const PORT = process.env.PORT || 3000;

const server = http.createServer(function(req, res) {
req.url = url.parse(req.url);
req.url.query = querystring.parse(req.url.query);

if (req.method === 'POST' && req.url.pathname ==='/') {
parseBody(req, function(err) {
if (err) return console.error(err);
console.log('POST request body:', req.body);
});
}

if (req.method === 'POST' && req.url.pathname === '/cowsay') {
parseBody(req, function(err) {
console.log('hello');
if(err) {
console.log('bye');
res.writeHead(400, {
'Content-type': 'text-plain'
});
res.write(cowsay.say({
text: 'oops, you mooooootilated that request!', f: 'mutilated'
}));
res.end();
} else {
res.writeHead(200, {
'Content-type': 'text-plain'
});
res.write(cowsay.say({
text: req.body.text
}));
res.end();
}
});
}

if (req.method === 'GET' && req.url.pathname === '/cowsay') {
let params = req.url.query;
if (!params.text) {
res.statusCode = 400;
res.write(cowsay.say({
text: 'oops, you mooooootilated that request!', f: 'mutilated'
}));
res.end();
}else{
res.statusCode = 200;
res.write(cowsay.say({ text: params.text }));
res.end();
}
}

if (req.method === 'GET' && req.url.pathname === '/') {
console.log(res);
res.writeHead(200,{
'content-Type': 'text/plain'
});
console.log(res);
res.end('hello from my server!');
}

});

server.listen(PORT, function() {
console.log('server up:', PORT);
});