99 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2018 MariaDB Corporation Ab
 | 
						|
 *
 | 
						|
 * Use of this software is governed by the Business Source License included
 | 
						|
 * in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | 
						|
 *
 | 
						|
 * Change Date: 2024-04-23
 | 
						|
 *
 | 
						|
 * On the date above, in accordance with the Business Source License, use
 | 
						|
 * of this software will be governed by version 2 or later of the General
 | 
						|
 * Public License.
 | 
						|
 */
 | 
						|
#pragma once
 | 
						|
 | 
						|
/** @file REST API resources */
 | 
						|
 | 
						|
#include <maxscale/ccdefs.hh>
 | 
						|
 | 
						|
#include <string>
 | 
						|
#include <deque>
 | 
						|
 | 
						|
#include <maxscale/server.hh>
 | 
						|
#include <maxscale/http.hh>
 | 
						|
 | 
						|
#include "httprequest.hh"
 | 
						|
#include "httpresponse.hh"
 | 
						|
#include "monitor.hh"
 | 
						|
#include "service.hh"
 | 
						|
#include "filter.hh"
 | 
						|
#include "session.hh"
 | 
						|
 | 
						|
typedef HttpResponse (* ResourceCallback)(const HttpRequest& request);
 | 
						|
 | 
						|
class Resource
 | 
						|
{
 | 
						|
    Resource(const Resource&);
 | 
						|
    Resource& operator=(const Resource&);
 | 
						|
public:
 | 
						|
 | 
						|
    enum resource_constraint
 | 
						|
    {
 | 
						|
        NONE         = 0,
 | 
						|
        REQUIRE_BODY = (1 << 0)
 | 
						|
    };
 | 
						|
 | 
						|
    Resource(ResourceCallback cb, int components, ...);
 | 
						|
    ~Resource();
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief Check if a request matches this resource
 | 
						|
     *
 | 
						|
     * @param request Request to match
 | 
						|
     *
 | 
						|
     * @return True if this request matches this resource
 | 
						|
     */
 | 
						|
    bool match(const HttpRequest& request) const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief Handle a HTTP request
 | 
						|
     *
 | 
						|
     * @param request Request to handle
 | 
						|
     *
 | 
						|
     * @return Response to the request
 | 
						|
     */
 | 
						|
    HttpResponse call(const HttpRequest& request) const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Add a resource constraint
 | 
						|
     *
 | 
						|
     * @param type Constraint to add
 | 
						|
     */
 | 
						|
    void add_constraint(resource_constraint type);
 | 
						|
 | 
						|
    /**
 | 
						|
     * Whether resource requires a request body
 | 
						|
     *
 | 
						|
     * @return True if resource requires a request body
 | 
						|
     */
 | 
						|
    bool requires_body() const;
 | 
						|
 | 
						|
private:
 | 
						|
 | 
						|
    bool matching_variable_path(const std::string& path, const std::string& target) const;
 | 
						|
 | 
						|
    ResourceCallback        m_cb;           /**< Resource handler callback */
 | 
						|
    std::deque<std::string> m_path;         /**< Path components */
 | 
						|
    bool                    m_is_glob;      /**< Does this path glob? */
 | 
						|
    uint32_t                m_constraints;  /**< Resource constraints */
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Handle a HTTP request
 | 
						|
 *
 | 
						|
 * @param request Request to handle
 | 
						|
 *
 | 
						|
 * @return Response to request
 | 
						|
 */
 | 
						|
HttpResponse resource_handle_request(const HttpRequest& request);
 |