Restbed, разные методы одинаковые пути не допускаются - PullRequest
0 голосов
/ 02 марта 2020

Я использую переставленный c ++, и я столкнулся с проблемой при регистрации того же URI, но с разными методами (POST, GET, DELETE) на одном ресурсе.

При запуске сервера и запросе GET запрос работает нормально, но для запроса POST я получаю '405 Method Not Allowed'

PS, обратите внимание, я должен был обмануть часть регулярного выражения, даже чтобы иметь возможность сопротивляться методу.

  • GET: язык: [a-z _]
  • POST: язык: [ab-z _]
This if I register it with the same expression **set_path("/hello/{language:[a-z_]+}");**
#./so-rest 
Service accepting HTTP connections at 'http://[::]:1984'.
Resource published on route '/hello/{language:[a-z_]+}'.
So I kinda use these paths to be able to register them bought.
#./so-rest
Service accepting HTTP connections at 'http://[::]:1984'.
Resource published on route '/hello/{language:[a-z_]+}'.
Resource published on route '/hello/{language:[ab-z_]+}'.

Есть идеи, что происходит не так? Спасибо.

Это пример кода.

#include <memory>
#include <cstdlib>
#include <restbed>


using namespace std;
using namespace restbed;


class CustomLogger : public Logger
{
    public:
        void stop( void )
        {
            return;
        }

        void start( const shared_ptr< const Settings >& )
        {
            return;
        }

        void log( const Level, const char* format, ... )
        {
            va_list arguments;
            va_start( arguments, format );
            vfprintf( stderr, format, arguments );
            fprintf( stderr, "\n" );
            va_end( arguments );
        }

        void log_if( bool expression, const Level level, const char* format, ... )
        {
            if ( expression )
            {
                va_list arguments;
                va_start( arguments, format );
                log( level, format, arguments );
                va_end( arguments );
            }
        }
};


int main( const int argc , const char** argv)
{
    Service service;
    auto print_get =  []( const shared_ptr< Session > session ){
            std::string body = "Hello GET";
            session->close( OK, body, { { "Content-Length", ::to_string( body.length( ) ) } } );

        };
    auto print_post =  []( const shared_ptr< Session > session ){
            std::string body = "Hello POST";
            session->close( OK, body, { { "Content-Length", ::to_string( body.length( ) ) } } );

        };

    {
        auto resource = make_shared< Resource >( );
        resource->set_path("/hello/{language:[a-z_]+}");
        resource->set_method_handler( "GET" , print_get);
        service.publish(resource);
    }

    {
        auto resource = make_shared< Resource >( );
        resource->set_path("/hello/{language:[ab-z_]+}");
        resource->set_method_handler( "POST" , print_post);
        service.publish(resource);
    }

    auto settings = make_shared< Settings >( );

    settings->set_port( 1984 );
    service.set_logger( make_shared< CustomLogger >( ) );

    settings->set_default_header( "Connection", "close" );
    service.start( settings );

    return EXIT_SUCCESS;
}
...