diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/README.md b/README.md index d3d8a98..6d36bfc 100644 --- a/README.md +++ b/README.md @@ -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-` + `` **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 - -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=` - * 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: })` - * 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: })` - * 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 diff --git a/lib/parse-body.js b/lib/parse-body.js new file mode 100644 index 0000000..28161da --- /dev/null +++ b/lib/parse-body.js @@ -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); + } + }); +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..22f8e94 --- /dev/null +++ b/package.json @@ -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" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..2d28aa2 --- /dev/null +++ b/server.js @@ -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); +});