dlib C++ Library - server_http_ex.cpp

    /*

        This example illustrates the use of the HTTP extension to the server object
        from the dlib C++ Library.
        It creates a server that always responds with a simple HTML form.

        To view the page this program displays you should go to http://localhost:5000

    */

    #include <iostream>
    #include <sstream>
    #include <string>
    #include "dlib/server.h"

    using namespace dlib;
    using namespace std;

    class web_server : public server::http_1a_c
    {
        void on_request (
            const std::string& path,
            std::string& result,
            const map_type& queries,
            const map_type& cookies,
            queue_type& new_cookies,
            const map_type& incoming_headers,
            map_type& response_headers,
            const std::string& foreign_ip,
            const std::string& local_ip,
            unsigned short foreign_port,
            unsigned short local_port
        )
        {
            try
            {
                ostringstream sout;
                // We are going to send back a page that contains an HTML form with two text input fields.
                // One field called name.  The HTML form uses the post method but could also use the get
                // method (just change method='post' to method='get').
                sout << " <html> <body> "
                    << "<form action='/form_handler' method='post'> "
                    << "User Name: <input name='user' type='text'><br>  "
                    << "User password: <input name='pass' type='text'> <input type='submit'> "
                    << " </form>";

                sout << "<br>  path = "         << path << endl;
                sout << "<br>  foreign_ip = "   << foreign_ip << endl;
                sout << "<br>  foreign_port = " << foreign_port << endl;
                sout << "<br>  local_ip = "     << local_ip << endl;
                sout << "<br>  local_port = "   << local_port << endl;

                // If this request is the result of the user submitting the form then echo back
                // the submission.
                if (path == "/form_handler")
                {
                    sout << "<h2> Stuff from the query string </h2>" << endl;
                    sout << "<br>  user = " << queries["user"] << endl;
                    sout << "<br>  pass = " << queries["pass"] << endl;

                    // save these form submissions as cookies.
                    string cookie;
                    cookie = "user=" + queries["user"];
                    new_cookies.enqueue(cookie);
                    cookie = "pass=" + queries["pass"];
                    new_cookies.enqueue(cookie);
                }

                // Echo any cookies back to the client browser
                sout << "<h2>Cookies we got back from the server</h2>";
                cookies.reset();
                while (cookies.move_next())
                {
                    sout << "<br/>" << cookies.element().key() << " = " << cookies.element().value() << endl;
                }

                sout << "<br/><br/>";

                sout << "<h2>HTTP Headers we sent to the server</h2>";
                // Echo out all the HTTP headers we received from the client web browser
                incoming_headers.reset();
                while (incoming_headers.move_next())
                {
                    sout << "<br/>" << incoming_headers.element().key() << ": " << incoming_headers.element().value() << endl;
                }

                sout << "</body> </html>";

                result = sout.str();
            }
            catch (exception& e)
            {
                cout << e.what() << endl;
            }
        }

    };

    // create an instance of our web server
    web_server our_web_server;

    void thread()
    {
        cout << "Press enter to end this program" << endl;
        cin.get();
        // this will cause the server to shut down which will in turn cause
        // our_web_server.start() to unblock and thus the main() function will terminate.
        our_web_server.clear();
    }

    int main()
    {
        try
        {
            // create a thread that will listen for the user to end this program
            thread_function t(thread);

            // make it listen on port 5000
            our_web_server.set_listening_port(5000);
            our_web_server.start();
        }
        catch (exception& e)
        {
            cout << e.what() << endl;
        }
    }