#include #include #include // #include #include "json.hpp" using nlohmann::json; using namespace std; class OHQueue { public: void run(); void read_request(); // void read_list(); // void write_list(); void write_request(); json create_output(); void update_positions(); void error_400(); private: struct Student { string location; int position; string uniqname; }; std::list queue; //json output; string method; string endpoint; string trash; Student student; }; int main() { OHQueue OH; OH.run(); } void OHQueue::run() { while (cin >> method >> endpoint >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash) { read_request(); // write_list(); write_request(); } } void OHQueue::read_request() { // if (method == "GET" || method == "DELETE") { // cin >> trash >> trash >> trash >> trash >> trash >> trash >> trash >> trash; // } if (method == "POST" && endpoint == "/api/queue/tail/") { json j; cin >> j; student.uniqname = j["uniqname"]; student.location = j["location"]; student.position = queue.size() + 1; } } // void OHQueue::read_list() { // } // void OHQueue::write_list() { // if (method == "POST" && endpoint == "/api/queue/tail/") { // queue.push_back(student); // } // if (method == "DELETE" && endpoint == "/api/queue/head/") { // } // } void OHQueue::write_request() { if (method == "GET") { if (endpoint == "/api/") { json j = { {"queue_head_url", "http://localhost/queue/head/"}, {"queue_list_url", "http://localhost/queue/"}, {"queue_tail_url", "http://localhost/queue/tail/"} }; string j_str = j.dump(4) + "\n"; cout << "HTTP/1.1 200 OK" << endl << "Content-Type: application/json; charset=utf-8" << endl << "Content-Length: " << j_str.length() << endl << endl; cout << j_str; } else if (endpoint == "/api/queue/") { json j = { {"count", queue.size()}, {"results", create_output()} }; string j_str = j.dump(4) + "\n"; cout << "HTTP/1.1 200 OK" << endl << "Content-Type: application/json; charset=utf-8" << endl << "Content-Length: " << j_str.length() << endl << endl; cout << j_str; } else if (endpoint == "/api/queue/head/") { json j = { {"location", queue.front().location}, {"position", queue.front().position}, {"uniqname", queue.front().uniqname} }; string j_str = j.dump(4) + "\n"; cout << "HTTP/1.1 200 OK" << endl << "Content-Type: application/json; charset=utf-8" << endl << "Content-Length: " << j_str.length() << endl << endl; cout << j_str; } else {error_400();} } else if (method == "POST" && endpoint == "/api/queue/tail/") { queue.push_back(student); json j = { {"location", student.location}, {"position", student.position}, {"uniqname", student.uniqname} }; //output.push_back(j); string j_str = j.dump(4) + "\n"; cout << "HTTP/1.1 201 Created" << endl << "Content-Type: application/json; charset=utf-8" << endl << "Content-Length: " << j_str.length() << endl << endl; cout << j_str; } else if (method == "DELETE" && endpoint == "/api/queue/head/") { if (queue.size() == 0) {error_400();} else { //output.pop_front(); queue.pop_front(); update_positions(); cout << "HTTP/1.1 204 No Content" << endl << "Content-Type: application/json; charset=utf-8" << endl << "Content-Length: 0" << endl << endl; } } else {error_400();} } json OHQueue::create_output() { json output; list::iterator it; for (it = queue.begin(); it != queue.end(); it++) { json j_it = { {"location", (*it).location}, {"position", (*it).position}, {"uniqname", (*it).uniqname} }; output.push_back(j_it); } return output; } void OHQueue::update_positions() { list::iterator it; for (it = queue.begin(); it != queue.end(); it++) { (*it).position--; } } void OHQueue::error_400() { cout << "HTTP/1.1 400 Bad Request" << endl << "Content-Type: application/json; charset=utf-8" << endl << "Content-Length: 0" << endl << endl; }