dlib/examples/server_http_ex.cpp
Davis King 991e8946b1 Made these examples more robust. Now if the server's start() function throws an
exception it will be printed right away rather than after the user hits
the enter key.  I also removed the global server objects since that was
pretty sketchy too.

--HG--
extra : convert_revision : svn%3Afdd8eb12-d10e-0410-9acb-85c331704f74/trunk%403713
2010-07-02 00:26:59 +00:00

139 lines
4.6 KiB
C++
Executable File

// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
/*
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"
#include "dlib/ref.h" // for ref()
using namespace dlib;
using namespace std;
class web_server : public server::http_1a_c
{
const std::string on_request (
const incoming_things& incoming,
outgoing_things& outgoing
)
{
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>";
// Write out some of the inputs to this request so that they show up on the
// resulting web page.
sout << "<br> path = " << incoming.path << endl;
sout << "<br> request_type = " << incoming.request_type << endl;
sout << "<br> content_type = " << incoming.content_type << endl;
sout << "<br> foreign_ip = " << incoming.foreign_ip << endl;
sout << "<br> foreign_port = " << incoming.foreign_port << endl;
sout << "<br> local_ip = " << incoming.local_ip << endl;
sout << "<br> local_port = " << incoming.local_port << endl;
sout << "<br> body = \"" << incoming.body << "\"" << endl;
// If this request is the result of the user submitting the form then echo back
// the submission.
if (incoming.path == "/form_handler")
{
sout << "<h2> Stuff from the query string </h2>" << endl;
sout << "<br> user = " << incoming.queries["user"] << endl;
sout << "<br> pass = " << incoming.queries["pass"] << endl;
// save these form submissions as cookies.
outgoing.cookies["user"] = incoming.queries["user"];
outgoing.cookies["pass"] = incoming.queries["pass"];
}
// Echo any cookies back to the client browser
sout << "<h2>Cookies we sent to the server</h2>";
for ( key_value_map::const_iterator ci = incoming.cookies.begin(); ci != incoming.cookies.end(); ++ci )
{
sout << "<br/>" << ci->first << " = " << ci->second << 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
for ( key_value_map::const_iterator ci = incoming.headers.begin(); ci != incoming.headers.end(); ++ci )
{
sout << "<br/>" << ci->first << ": " << ci->second << endl;
}
sout << "</body> </html>";
return sout.str();
}
catch (exception& e)
{
return e.what();
}
}
};
void thread(web_server& the_server)
{
try
{
// Start the server. start() blocks until the server is shutdown
// by a call to clear()
the_server.start();
}
catch (socket_error& e)
{
cout << "Socket error while starting server: " << e.what() << endl;
}
catch (exception& e)
{
cout << "Error while starting server: " << e.what() << endl;
}
}
int main()
{
try
{
// create an instance of our web server
web_server our_web_server;
// make it listen on port 5000
our_web_server.set_listening_port(5000);
// create a thread that will start the server. The ref() here allows us to pass
// our_web_server into the threaded function by reference.
thread_function t(thread, ref(our_web_server));
cout << "Press enter to end this program" << endl;
cin.get();
// this will cause the server to shut down
our_web_server.clear();
}
catch (exception& e)
{
cout << e.what() << endl;
}
}