243 lines
6.0 KiB
C++
243 lines
6.0 KiB
C++
/*
|
|
This file is part of libhttpserver
|
|
Copyright (C) 2014 Sebastiano Merlino
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
|
USA
|
|
*/
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <cstdio>
|
|
#include <iostream>
|
|
|
|
#include <httpserver.hpp>
|
|
|
|
using namespace httpserver;
|
|
|
|
bool verbose=false;
|
|
|
|
class service_resource: public http_resource {
|
|
public:
|
|
service_resource();
|
|
|
|
~service_resource();
|
|
|
|
const std::shared_ptr<http_response> render_GET(const http_request &req);
|
|
const std::shared_ptr<http_response> render_PUT(const http_request &req);
|
|
const std::shared_ptr<http_response> render_POST(const http_request &req);
|
|
const std::shared_ptr<http_response> render(const http_request &req);
|
|
const std::shared_ptr<http_response> render_HEAD(const http_request &req);
|
|
const std::shared_ptr<http_response> render_OPTIONS(const http_request &req);
|
|
const std::shared_ptr<http_response> render_CONNECT(const http_request &req);
|
|
const std::shared_ptr<http_response> render_DELETE(const http_request &req);
|
|
|
|
private:
|
|
|
|
|
|
};
|
|
|
|
service_resource::service_resource()
|
|
{}
|
|
|
|
service_resource::~service_resource()
|
|
{}
|
|
|
|
const std::shared_ptr<http_response>
|
|
service_resource::render_GET(const http_request &req)
|
|
{
|
|
std::cout << "service_resource::render_GET()" << std::endl;
|
|
|
|
if (verbose) std::cout << req;
|
|
string_response* res = new string_response("GET response", 200);
|
|
|
|
if (verbose) std::cout << *res;
|
|
|
|
return std::shared_ptr<http_response>(res);
|
|
}
|
|
|
|
|
|
const std::shared_ptr<http_response>
|
|
service_resource::render_PUT(const http_request &req)
|
|
{
|
|
std::cout << "service_resource::render_PUT()" << std::endl;
|
|
|
|
if (verbose) std::cout << req;
|
|
|
|
string_response* res = new string_response("PUT response", 200);
|
|
|
|
if (verbose) std::cout << *res;
|
|
|
|
return std::shared_ptr<http_response>(res);
|
|
}
|
|
|
|
|
|
const std::shared_ptr<http_response>
|
|
service_resource::render_POST(const http_request &req)
|
|
{
|
|
std::cout << "service_resource::render_POST()" << std::endl;
|
|
|
|
if (verbose) std::cout << req;
|
|
|
|
string_response* res = new string_response("POST response", 200);
|
|
|
|
if (verbose) std::cout << *res;
|
|
|
|
return std::shared_ptr<http_response>(res);
|
|
}
|
|
|
|
const std::shared_ptr<http_response>
|
|
service_resource::render(const http_request &req)
|
|
{
|
|
std::cout << "service_resource::render()" << std::endl;
|
|
|
|
if (verbose) std::cout << req;
|
|
|
|
string_response* res = new string_response("generic response", 200);
|
|
|
|
if (verbose) std::cout << *res;
|
|
|
|
return std::shared_ptr<http_response>(res);
|
|
}
|
|
|
|
|
|
const std::shared_ptr<http_response>
|
|
service_resource::render_HEAD(const http_request &req)
|
|
{
|
|
std::cout << "service_resource::render_HEAD()" << std::endl;
|
|
|
|
if (verbose) std::cout << req;
|
|
|
|
string_response* res = new string_response("HEAD response", 200);
|
|
|
|
if (verbose) std::cout << *res;
|
|
|
|
return std::shared_ptr<http_response>(res);
|
|
}
|
|
|
|
const std::shared_ptr<http_response>
|
|
service_resource::render_OPTIONS(const http_request &req)
|
|
{
|
|
std::cout << "service_resource::render_OPTIONS()" << std::endl;
|
|
|
|
if (verbose) std::cout << req;
|
|
|
|
string_response* res = new string_response("OPTIONS response", 200);
|
|
|
|
if (verbose) std::cout << *res;
|
|
|
|
return std::shared_ptr<http_response>(res);
|
|
}
|
|
|
|
const std::shared_ptr<http_response>
|
|
service_resource::render_CONNECT(const http_request &req)
|
|
{
|
|
std::cout << "service_resource::render_CONNECT()" << std::endl;
|
|
|
|
if (verbose) std::cout << req;
|
|
|
|
string_response* res = new string_response("CONNECT response", 200);
|
|
|
|
if (verbose) std::cout << *res;
|
|
|
|
return std::shared_ptr<http_response>(res);
|
|
}
|
|
|
|
const std::shared_ptr<http_response>
|
|
service_resource::render_DELETE(const http_request &req)
|
|
{
|
|
std::cout << "service_resource::render_DELETE()" << std::endl;
|
|
|
|
if (verbose) std::cout << req;
|
|
|
|
string_response* res = new string_response("DELETE response", 200);
|
|
|
|
if (verbose) std::cout << *res;
|
|
|
|
return std::shared_ptr<http_response>(res);
|
|
}
|
|
|
|
void usage()
|
|
{
|
|
std::cout << "Usage:" << std::endl
|
|
<< "service [-p <port>][-s [-k <keyFileName>][-c <certFileName>]][-v]" << std::endl;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
uint16_t port=8080;
|
|
int c;
|
|
const char *key="key.pem";
|
|
const char *cert="cert.pem";
|
|
bool secure=false;
|
|
|
|
while ((c = getopt(argc,argv,"p:k:c:sv?")) != EOF) {
|
|
switch (c) {
|
|
case 'p':
|
|
port=strtoul(optarg,NULL,10);
|
|
break;
|
|
case 'k':
|
|
key = optarg;
|
|
break;
|
|
case 'c':
|
|
cert=optarg;
|
|
break;
|
|
case 's':
|
|
secure=true;
|
|
break;
|
|
case 'v':
|
|
verbose=true;
|
|
break;
|
|
default:
|
|
usage();
|
|
exit(1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
std::cout << "Using port " << port << std::endl;
|
|
if (secure) {
|
|
std::cout << "Key: " << key << " Certificate: " << cert
|
|
<< std::endl;
|
|
}
|
|
|
|
//
|
|
// Use builder to define webserver configuration options
|
|
//
|
|
create_webserver cw = create_webserver(port).max_threads(5);
|
|
|
|
if (secure) {
|
|
cw.use_ssl().https_mem_key(key).https_mem_cert(cert);
|
|
}
|
|
|
|
//
|
|
// Create webserver using the configured options
|
|
//
|
|
webserver ws = cw;
|
|
|
|
//
|
|
// Create and register service resource available at /service
|
|
//
|
|
service_resource res;
|
|
ws.register_resource("/service",&res,true);
|
|
|
|
//
|
|
// Start and block the webserver
|
|
//
|
|
ws.start(true);
|
|
|
|
return 0;
|
|
}
|