[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/cagev/libhttpserver/master/src/httpserver/http_resource.hpp [Back]  [Original]

/*
     This file is part of libhttpserver
     Copyright (C) 2011-2019 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

*/

#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
#error "Only  or  can be included directly."
#endif

#ifndef _http_resource_hpp_
#define _http_resource_hpp_
#include 
#include 
#include 

#ifdef DEBUG
#include 
#endif

#include "httpserver/http_response.hpp"

namespace httpserver
{

class webserver;
class http_request;

namespace details
{

std::shared_ptr empty_render(const http_request& r);

};

/**
 * Class representing a callable http resource.
**/

void resource_init(std::map& res);

class http_resource
{
    public:
        /**
         * Class destructor
        **/
        virtual ~http_resource()
        {
            allowed_methods.clear();
        }

        /**
         * Method used to answer to a generic request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render(const http_request& req)
        {
            return details::empty_render(req);
        }
        /**
         * Method used to answer to a GET request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_GET(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to answer to a POST request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_POST(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to answer to a PUT request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_PUT(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to answer to a HEAD request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_HEAD(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to answer to a DELETE request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_DELETE(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to answer to a TRACE request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_TRACE(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to answer to a OPTIONS request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_OPTIONS(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to answer to a PATCH request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_PATCH(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to answer to a CONNECT request
         * @param req Request passed through http
         * @return A http_response object
        **/
        virtual const std::shared_ptr render_CONNECT(const http_request& req)
        {
            return render(req);
        }
        /**
         * Method used to set if a specific method is allowed or not on this request
         * @param method method to set permission on
         * @param allowed boolean indicating if the method is allowed or not
        **/
        void set_allowing(const std::string& method, bool allowed)
        {
            if(this->allowed_methods.count(method))
            {
                this->allowed_methods[method] = allowed;
            }
        }
        /**
         * Method used to implicitly allow all methods
        **/
        void allow_all()
        {
            std::map::iterator it;
            for ( it=this->allowed_methods.begin() ; it != this->allowed_methods.end(); ++it )
                this->allowed_methods[(*it).first] = true;
        }
        /**
         * Method used to implicitly disallow all methods
        **/
        void disallow_all()
        {
            std::map::iterator it;
            for ( it=this->allowed_methods.begin() ; it != this->allowed_methods.end(); ++it )
                this->allowed_methods[(*it).first] = false;
        }
        /**
         * Method used to discover if an http method is allowed or not for this resource
         * @param method Method to discover allowings
         * @return true if the method is allowed
        **/
        bool is_allowed(const std::string& method)
        {
            if(this->allowed_methods.count(method))
            {
                return this->allowed_methods[method];
            }
            else
            {
#ifdef DEBUG
                std::map::iterator it;
                for(it = allowed_methods.begin(); it != allowed_methods.end(); ++it)
                {
                    std::cout 

Web Proxy Viewer  |  New URL  |  Original Page