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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
53 changes: 2 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,51 +1,2 @@
![cf](https://i.imgur.com/7v5ASc8.png) Lab 07: Vanilla HTTP Server
======

## 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

## 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

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

#### 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)_
# simple http server
This lab uses the node http module. A response is created if the response is what our server is looking for is looking for
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{
console.log('heres a req body', req.body);
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/andyfiveeleven/07-http_servers.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/andyfiveeleven/07-http_servers/issues"
},
"homepage": "https://github.com/andyfiveeleven/07-http_servers#readme",
"dependencies": {
"cowsay": "^1.1.9"
}
}
56 changes: 56 additions & 0 deletions server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
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'){
// parseBody(req, function(err){
// if (err) return console.log(err);
// });
// }

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

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, T: 'U', the_cow: 'bong'}));
} else {
res.writeHead(400, {'Content-Type': 'text/plain'});
res.write(cowsay.say({text: 'bad request'}));
}
}

res.end();
});

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