Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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"
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
52 changes: 5 additions & 47 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,51 +1,9 @@
![cf](https://i.imgur.com/7v5ASc8.png) Lab 07: Vanilla HTTP Server
======
# HTTP Servers - Lab 07

## Submission Instructions
* fork this repository & create a new branch for your work
* write all of your code in a directory named `lab-` + `<your name>` **e.g.** `lab-susan`
* push to your repository
* submit a pull request to this repository
* submit a link to your PR in canvas
* write a question and observation on canvas
### Description:

## Learning Objectives
* students will be able to identify key qualities of the HTTP protocol
* students will be able to implement an HTTP server using the node.js `http` module
This app allows the user to enter text and have that text displayed in the console with an image of a cow.

## Requirements
#### Configuration
<!-- list of files, configurations, tools, etc that are required -->
Your lab directory must include
* `.gitignore`
* `.eslintrc`
* `package.json`
* `README.md`
### Launch:

#### Feature Tasks
* create an HTTP Server using the NodeJS `http` module
* create a *custom* body parsing module that is used for parsing the body of all **POST** requests
* for all requests made to `/`, the server should respond with the following:
* a header containing `Content-Type: text/plain`
* a status code of **200**
* a response with the string "hello from my server!"
* for all **GET** requests made to `/cowsay`, the server should respond with the following:
* the query string should have the key value `text=<message>`
* the response header should include `Content-Type: text/plain`
* if the query `text=messsage` is set, respond with:
* a status code of 200
* a response body that includes the value returned from `cowsay.say({ text: <querystring text> })`
* if the query `text=message` is **not** set, respond with:
* status code = 400
* a body including the value returned from `cowsay.say({ text: 'bad request' })`
* for all **POST** requests made to `/cowsay`, the server should respond with the following:
* the response header should include `Content-Type: text/plain`
* if the JSON `{text: messsage}` is set in the body, respond with:
* a status code of 200
* a response body including the value returned from `cowsay.say({ text: <querystring text> })`
* if the JSON `{text: messsage}` is **not** set in the body, respond with:
* a status code of 400
* a body including the value returned from `cowsay.say({ text: 'bad request' })`

## Bonus
* **2pts:** add the ability to change the cowfile - **ex: dragon, sheep, etc** _(note: this should be done through the querystring)_
Run the command `npm run start` in one terminal window to get the server running. Next open a second terminal window to run the app. Enter the command `http :[port number] text==` followed by the string you wish to print. To make a post to enter the same command about with only one `=`.
18 changes: 18 additions & 0 deletions lib/parse-body.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict';

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

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

req.on('end', function() {
try {
req.body = JSON.parse(req.body);
callback(null, req.body);
} catch (err) {
callback(err);
}
});
};
24 changes: 24 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"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": {
"type": "git",
"url": "git+https://github.com/codefellows-javascript-401d17/07-http_servers.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/codefellows-javascript-401d17/07-http_servers/issues"
},
"homepage": "https://github.com/codefellows-javascript-401d17/07-http_servers#readme",
"dependencies": {
"cowsay": "^1.1.9"
}
}
55 changes: 55 additions & 0 deletions server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
'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.url.pathname === '/') {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.write('hello from my server');
}

if(req.method === 'GET' && req.url.pathname === '/cowsay') {
let params = req.url.query;
if(params.text) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.write(cowsay.say({ text: params.text }));
} else {
res.writeHead(400);
res.write(cowsay.say({ text: 'bad request' }));
}
}

if(req.method === 'POST' && req.url.pathname === '/cowsay') {
parseBody(req, function(err) {
if(req.body.text) {
if(err) return console.error(err);
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.write(cowsay.say({ text: req.body.text }));
} else {
res.writeHead(400);
res.write(cowsay.say({ text: 'bad request' }));
}
res.end();
});
} else {
res.end();
}
});

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