diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2279e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,70 @@ +# VS Code +.vscode/ + +# bundle.js +public/bundle.js + +# 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 (https://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 + +# next.js build output +.next + +# build directory +dist/ \ No newline at end of file diff --git a/README.md b/README.md index 4c7f4a8..e776539 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,11 @@ -Assignment 1 - Hello World: Basic Deployment w/ Git, GitHub, Glitch -=== +# a1-bwhetherington -*DUE: Thursday, August 29th by 11:59 AM (before the start of class!)* - -This assignment is a "warm-up" exercise. -You will simply deploy the starting Web site that you will use this term to [Glitch](http://www.glitch.com/). - -Treat this assignment as a chance to get up to speed on Git, GitHub, and Glitch. -If you already know these, great. -However, if you're new to them, spend several hours practicing, experimenting, and reading documentation. -In other words, don't just get your website up and done. You will need skills with these tools throughout the rest of the course. - -Assignment details ---- - -Do the following to complete this assignment: - -1. Fork the starting project code in GitHub. This repo contains: - * the server code, `server.js` - * A starting `index.html` file that you will edit as described below - * A package.json file that helps configure Glitch - * This README -2. Edit `index.html` to show the following information about you: - * your name and class at WPI (e.g. class of 2020) Note: Do not put any contact or personal information that you do not potentially want other people outside of this class to see. - * your major(s) and minor(s) - * previous computer science courses that you have taken at WPI - * your experience with the following technologies and methods (none, some, a lot) - * HTML - * CSS - * Java - * JavaScript - * Ruby - * Python - * unit testing -3. Test your project to make sure that when someone goes to your main page, it displays correctly. You can do this locally by simply running `node server.js` from within the assignment directory. - -4. Modify the README file according to the specification below. -5. Commit and push all your changes to GitHub. -6. Deploy your project to Glitch. You can do this by [importing the repo from GitHub](https://medium.com/glitch/import-code-from-anywhere-83fb60ea4875) -7. Ensure that your project has the proper naming scheme (guide follows) so we can find it. -8. Create and submit a Pull Request to the original repo. - -Naming and URL Scheme ---- - -You must use a consistent naming scheme for all projects in this course. -If we can't find it, we can't grade it. - -By default Glitch often assigns your application a random name. To change it, click on the project dropdown menu in the upper left corner of Glitch. You will then see an additional text field displaying the project name in the resulting menu; click here to edit the name. - -The name scheme should be `a1-yourGitHubUsername`. -The `a1` will need to be updated to `a2`, `a3`, and so on in future projects. - -Resources ---- - -If you need a JavaScript/HTML/CSS refresher, see [Technology Fundamentals by Scott Murray](http://chimera.labs.oreilly.com/books/1230000000345/ch03.html#_html) and/or [JavaScript Codeacademy](https://www.codecademy.com/en/tracks/javascript). - -If you need a Git/GitHub refreseher, see [GitHub Bootcamp](https://help.github.com/categories/bootcamp/), the [GitHub Guides](https://guides.github.com/) (especially the ones on Hello World, and Understanding the GitHub Flow, and Forking Projects), and [CodeSchool's Try Git Course](https://www.codeschool.com/courses/try-git). - -Sample Readme (delete the above when you're ready to submit, and modify the below so with your links and descriptions) ---- - -Charlie Roberts -http://charlieroberts-a1.glitch.me - -This project shows ... +[Benjamin Hetherington](http://a1-bwhetherington.glitch.me) ## Technical Achievements -- **Proved P=NP**: Using a combination of... -- **Solved AI**: ... -### Design Achievements -- **Re-vamped Apple's Design Philosophy**: Shown in `style.css`, the code... +- **Custom Server Script:** I solved the problems with the original server script by writing my own from scratch. In addition, it restricts access to only files in the static directory to ensure that people cannot access other files on the server. +## Design Achievements +- **Custom CSS:** I wrote my own CSS for the website. It is admittedly quite simple, but it is something. diff --git a/index.html b/index.html deleted file mode 100755 index 37ac8c3..0000000 --- a/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - CS4241 Assignment 1 - - - -

Information about [Your name here]

-

- [Self introduction] -

-

- [Major and other information] -

-

- [Other things] -

- -

Experience

-

- Working experience -

- - - diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..533d4a3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "cr-4241-simple-glitch", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + } + } +} diff --git a/package.json b/package.json index 1699a50..d4279c7 100755 --- a/package.json +++ b/package.json @@ -2,8 +2,11 @@ "name": "cr-4241-simple-glitch", "version": "0.1.0", "description": "WPI CS 4241 first assignment", - "author": "Charlie Roberts", + "author": "Benjamin Hetherington", "scripts": { - "start": "node server.js" + "start": "node server/server.js" + }, + "dependencies": { + "mime": "^2.4.4" } } diff --git a/server.js b/server.js deleted file mode 100644 index cc39a60..0000000 --- a/server.js +++ /dev/null @@ -1,20 +0,0 @@ -const http = require('http'), - fs = require('fs'), - port = 3000 - -let file -fs.readFile( './index.html', function( err, content ) { - file = content -}) - -const server = http.createServer( function( request,response ) { - switch( request.url ) { - case '/': - response.end( file, 'utf-8') - break - default: - response.end( '404 Error: File Not Found') - } -}) - -server.listen( process.env.PORT || port ) \ No newline at end of file diff --git a/server/server.js b/server/server.js new file mode 100644 index 0000000..4d35d59 --- /dev/null +++ b/server/server.js @@ -0,0 +1,79 @@ +const fs = require("fs"); +const http = require("http"); +const mime = require("mime"); +const path = require("path"); + +class Server { + /** + * Creates a server that serves files from the specified static directory. If + * a user tries to access the root domain, the specified index file is + * served. + * @param indexFile The index file + * @param staticDir The static file directory + */ + constructor(indexFile = "index.html", staticDir = null) { + this.indexFile = indexFile; + this.staticDir = staticDir; + } + + /** + * Starts the server, listening on the specified port. + * @param port The port to listen on + */ + listen(port) { + const server = http.createServer((request, response) => { + console.log(`${request.method}: ${request.url}`); + const url = request.url.slice(1); + if (url === "") { + this.sendFile(this.indexFile, response); + } else { + this.sendFile(url, response); + } + }); + console.log(`Server listening on port: ${port}...`); + server.listen(port); + } + + /** + * Sends a 404 error to the specified response. + * @param fileName The file name that the user tried to access + * @param response The response to send the 404 error to + */ + send404(fileName, response) { + response.writeHeader(404); + response.end(`404 Error: Could not read file "${fileName}"`); + } + + resolveFile(fileName) { + const baseDir = path.normalize(this.staticDir || ""); + const relativePath = path.normalize(fileName); + const filePath = path.join(baseDir, relativePath); + return filePath; + } + + /** + * Sends the file with the specified file name as part of the specified + * response. If there is an error reading the file, a 404 response is sent. + * Files are looked for in the specified static directory if one is specified + * when the server is created. + * @param fileName The file name to send + * @param response The response to send the file to + */ + sendFile(fileName, response) { + const file = this.resolveFile(fileName); + console.log(`Sending ${file}...`); + fs.readFile(file, "utf8", (err, data) => { + // Check if we have successfully read the file + if (err) { + this.send404(fileName, response); + } else { + const mimeType = mime.getType(fileName); + response.writeHeader(200, { "content-type": mimeType }); + response.end(data, "utf8"); + } + }); + } +} + +const server = new Server("index.html", "static"); +server.listen(process.env.PORT || 3000); diff --git a/static/index.html b/static/index.html new file mode 100755 index 0000000..059f258 --- /dev/null +++ b/static/index.html @@ -0,0 +1,108 @@ + + + + CS4241 Assignment 1 + + + + + +
+

Benjamin Hetherington

+

+ Hello, reader! My name is Benjamin Hetherington, and I am a Computer Science major in the class of 2020 at WPI. +

+ +

Courses

+

Below are the CS courses I have taken at WPI, as of writing this page (August 2019):

+ + +

Technological Experience

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TechnologyExperience
HTMLA lot
CssSome
JavaA lot
JavascriptA lot
RubyNone
PythonA lot
Unit TestingA lot
+ +

Work Experience

+ Below is my work history as of writing this page (August 2019): + +
+ + diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..868cc21 --- /dev/null +++ b/static/style.css @@ -0,0 +1,45 @@ +:root { + --text-color: rgba(0, 0, 0, 0.93); + --primary-accent: rgba(0, 0, 0, 0.3); +} + +body { + font-family: "Roboto", sans-serif; + color: var(--text-color); +} + +.page { + max-width: 1000px; + padding: 15px; + margin: auto; +} + +h1, +h2, +h3, +h4 { + border-bottom: 2px solid var(--primary-accent); +} + +table { + border: 2px solid var(--primary-accent); + border-radius: 5px; + border-collapse: collapse; + overflow: hidden; +} + +td { + padding: 2px; + padding-left: 5px; + padding-right: 5px; +} + +thead { + /* background: blue; */ + font-weight: bold; + border-bottom: 2px solid var(--primary-accent); +} + +tbody { + /* background: red; */ +}