159.352 Assignment 1:
In this assignment you will extend the minimalistic HTTP server (server3.py - we
developed in the tutorials) to serve a password protected website which enables the user
to manage their investment portfolio.
The conceptual framework of this web application is shown in Fig. 1. Your HTTP server
will run in docker container hosted on Heroku (PaaS cloud). To service client requests,
your server will use REST API to access data from the Investor Exchange (IEX) cloud.
You will need to sign up for free developer accounts on IEX
(https://iextrading.com/developers/) and Heroku (https://www.heroku.com).
Fig. 1 Conceptual framework
The objective of this assignment is to gain hands on experience with HTTP
fundamentals, so strictly do not use any high-level frameworks (e.g. Servlets, flask,
node.js, Django etc.,) since they abstract the low level HTTP functionality.
1) Authentication (6 marks) Implement basic access authentication scheme in your python HTTP server such that
without the correct login credentials none of the resources on the server should be
accessible.
When the browser sends the initial GET request, the server should check for
authentication credentials in the headers and respond with a suitable HTTP status code
requesting for authentication credentials using the basic access authentication.
At this stage the browser would prompt the user to enter username and password
When the browser sends the authentication credentials, the server checks the headers
and serves the requested content if the authentication credentials match. Set the
authentication credentials for your website to be your student ID number:
username:
password:
Assume your website is dedicated for only one user, that is you.
2) Portfolio (10 marks)
When the user visits the url /portfolio your HTTP server should respond with a html
page showing the user’s investment portfolio, along with input boxes and command
buttons to update the portfolio.
Stock Quantity Price Gain/Loss
TSLA 100 $250 1000%
AAPL 50 $150 -5%
Stock symbol
Quantity
Price
The portfolio will be stored on your HTTP server as either XML or JSON file. For our
assignment, the portfolio is made up of stocks only. For each stock the server needs to
store the ticker symbol, the quantity of shares purchased (i.e. owned by the user), and
the purchase price of a share. Work out a suitable data representation to store the
portfolio information. You can choose either to work with XML or JSON. Name the file
as portfolio.xml or portfolio.json.
In updating the portfolio file, the user can add a new stock, or reduce/remove an
existing stock using negative quantity. You must validate the user inputs on the server
side when updating portfolio file. Use HTTP POST method for updating the portfolio
file.
To help the user input the correct symbol, use the following API endpoint to get the list
of symbols. Note the JSON response from this API call contain all types of securities,
so you will need to filter symbols for common stock (cs) type.
https://cloud.iexapis.com/stable/ref-data/symbols?token=YourAPIToken
make sure to substitute your API token in the above URL
Refer to API documentation for details; https://iexcloud.io/docs/api/#symbols
Compute the gain/loss percentage for each stock in the portfolio on the server side using
the following API endpoint which fetches the latest quote for the given stock symbol.
Gain or loss = (latest quote – price) / price * 100
https://cloud.iexapis.com/stable/stock/symbol/quote?token=YourAPIToken
make sure to put the actual symbol (e.g TSLA) in the above URL
3) Stock chart (7 marks)
When the user visits the url /stock your HTTP server should respond with a html
page containing an input boxes to enter the stock symbol. After entering the stock
symbol, the page should display a graph of the daily closing price for one year period
(ytd)
Stock symbol
Use the same API endpoint discussed in the portfolio section to help the user enter the
correct stock symbol.
Use the following API endpoint to extract the chart data for the given stock symbol.
https://cloud.iexapis.com/stable/stock/symbol/chart/ytd?chartCloseOnly=true&token=yourAPIToken
You may plot the data either on the client side (using any javascript library of your
choice e.g. canvasJS) or on the server side (using python plot library e.g. matplotlib, and
saving the plot as image).
4) Deployment (7 marks)
After you have finished developing and testing, deploy your web application in a docker
container and host it on Heroku cloud.
Useful documentation
https://iexcloud.io/docs/api/#api-reference
https://docs.docker.com
https://devcenter.heroku.com
Submission
Complete and well-documented source files necessary to run your web application in
docker. A README file containing instructions needed to run your web application. In
your README file make sure to put down the URL of your web application hosted on
Heroku. Submit it a in zipped file on Stream.