srs/trunk/src/app/srs_app_http_conn.hpp
2025-10-19 19:10:52 -04:00

278 lines
8.3 KiB
C++

//
// Copyright (c) 2013-2025 The SRS Authors
//
// SPDX-License-Identifier: MIT
//
#ifndef SRS_APP_HTTP_CONN_HPP
#define SRS_APP_HTTP_CONN_HPP
#include <srs_core.hpp>
#include <map>
#include <string>
#include <vector>
#include <srs_app_reload.hpp>
#include <srs_app_rtmp_source.hpp>
#include <srs_app_st.hpp>
#include <srs_kernel_file.hpp>
#include <srs_protocol_conn.hpp>
#include <srs_protocol_http_conn.hpp>
class SrsServer;
class SrsLiveSource;
class ISrsRequest;
class SrsLiveConsumer;
class SrsStSocket;
class SrsHttpParser;
class ISrsHttpParser;
class ISrsHttpMessage;
class SrsHttpHandler;
class SrsMessageQueue;
class SrsMediaPacket;
class SrsFastStream;
class SrsHttpUri;
class SrsHttpMessage;
class SrsHttpStreamServer;
class ISrsHttpStreamServer;
class SrsHttpStaticServer;
class ISrsHttpStaticServer;
class SrsNetworkDelta;
class ISrsNetworkDelta;
class SrsHttpCorsMux;
class ISrsHttpCorsMux;
class SrsHttpAuthMux;
class ISrsHttpAuthMux;
class SrsSslConnection;
class ISrsSslConnection;
class ISrsHttpConn;
class ISrsAppConfig;
class ISrsStatistic;
class ISrsAppFactory;
// The owner of HTTP connection.
class ISrsHttpConnOwner
{
public:
ISrsHttpConnOwner();
virtual ~ISrsHttpConnOwner();
public:
// When start the coroutine to process connection.
virtual srs_error_t on_start() = 0;
// Handle the HTTP message r, which may be parsed partially.
// For the static service or api, discard any body.
// For the stream caster, for instance, http flv streaming, may discard the flv header or not.
virtual srs_error_t on_http_message(ISrsHttpMessage *r, ISrsHttpResponseWriter *w) = 0;
// When message is processed, we may need to do more things.
virtual srs_error_t on_message_done(ISrsHttpMessage *r, ISrsHttpResponseWriter *w) = 0;
// When connection is destroy, should use manager to dispose it.
// The r0 is the original error, we will use the returned new error.
virtual srs_error_t on_conn_done(srs_error_t r0) = 0;
};
// The HTTP connection, for HTTP stream or static file.
class ISrsHttpConn : public ISrsConnection, public ISrsStartable, public ISrsCoroutineHandler, public ISrsExpire
{
public:
ISrsHttpConn();
virtual ~ISrsHttpConn();
public:
// Get the delta object for statistics.
virtual ISrsKbpsDelta *delta() = 0;
// Whether the connection coroutine is error or terminated.
virtual srs_error_t pull() = 0;
// Whether enable the CORS(cross-domain).
virtual srs_error_t set_crossdomain_enabled(bool v) = 0;
// Whether enable the Auth.
virtual srs_error_t set_auth_enabled(bool auth_enabled) = 0;
// Whether enable the JSONP.
virtual srs_error_t set_jsonp(bool v) = 0;
};
// TODO: FIXME: Should rename to roundtrip or responder, not connection.
// The http connection which request the static or stream content.
class SrsHttpConn : public ISrsHttpConn
{
// clang-format off
SRS_DECLARE_PRIVATE: // clang-format on
ISrsAppConfig *config_;
ISrsAppFactory *app_factory_;
// clang-format off
SRS_DECLARE_PROTECTED: // clang-format on
ISrsHttpParser *parser_;
ISrsCommonHttpHandler *http_mux_;
ISrsHttpCorsMux *cors_;
ISrsHttpAuthMux *auth_;
ISrsHttpConnOwner *handler_;
// clang-format off
SRS_DECLARE_PROTECTED: // clang-format on
ISrsProtocolReadWriter *skt_;
// Each connection start a green thread,
// when thread stop, the connection will be delete by server.
ISrsCoroutine *trd_;
// The ip and port of client.
std::string ip_;
int port_;
// clang-format off
SRS_DECLARE_PRIVATE: // clang-format on
// The delta for statistic.
ISrsNetworkDelta *delta_;
// The create time in microseconds.
// for current connection to log self create time and calculate the living time.
srs_utime_t create_time_;
public:
SrsHttpConn(ISrsHttpConnOwner *handler, ISrsProtocolReadWriter *fd, ISrsCommonHttpHandler *m, std::string cip, int port);
virtual ~SrsHttpConn();
// Interface ISrsResource.
public:
virtual std::string desc();
public:
ISrsKbpsDelta *delta();
// Interface ISrsStartable
public:
virtual srs_error_t start();
// Interface ISrsCoroutineHandler
public:
virtual srs_error_t cycle();
// clang-format off
SRS_DECLARE_PRIVATE: // clang-format on
virtual srs_error_t do_cycle();
virtual srs_error_t process_requests(ISrsRequest **preq);
virtual srs_error_t process_request(ISrsHttpResponseWriter *w, ISrsHttpMessage *r, int rid);
// When the connection disconnect, call this method.
// e.g. log msg of connection and report to other system.
// @param request: request which is converted by the last http message.
virtual srs_error_t on_disconnect(ISrsRequest *req);
public:
// Get the HTTP message handler.
virtual ISrsHttpConnOwner *handler();
// Whether the connection coroutine is error or terminated.
virtual srs_error_t pull();
// Whether enable the CORS(cross-domain).
virtual srs_error_t set_crossdomain_enabled(bool v);
// Whether enable the Auth.
virtual srs_error_t set_auth_enabled(bool auth_enabled);
// Whether enable the JSONP.
virtual srs_error_t set_jsonp(bool v);
// Interface ISrsConnection.
public:
virtual std::string remote_ip();
virtual const SrsContextId &get_id();
// Interface ISrsExpire.
public:
virtual void expire();
};
// The HTTP connection manager.
class ISrsHttpxConn : public ISrsConnection, public ISrsStartable, public ISrsHttpConnOwner
{
public:
ISrsHttpxConn();
virtual ~ISrsHttpxConn();
public:
};
// Drop body of request, only process the response.
class SrsHttpxConn : public ISrsHttpxConn
{
// clang-format off
SRS_DECLARE_PRIVATE: // clang-format on
ISrsAppConfig *config_;
ISrsStatistic *stat_;
// clang-format off
SRS_DECLARE_PRIVATE: // clang-format on
// The manager object to manage the connection.
ISrsResourceManager *manager_;
ISrsProtocolReadWriter *io_;
ISrsSslConnection *ssl_;
ISrsHttpConn *conn_;
// We should never enable the stat, unless HTTP stream connection requires.
bool enable_stat_;
// ssl key & cert file
const std::string ssl_key_file_;
const std::string ssl_cert_file_;
public:
SrsHttpxConn(ISrsResourceManager *cm, ISrsProtocolReadWriter *io, ISrsCommonHttpHandler *m, std::string cip, int port, std::string key, std::string cert);
virtual ~SrsHttpxConn();
public:
// Require statistic about HTTP connection, for HTTP streaming clients only.
void set_enable_stat(bool v);
// Directly read a HTTP request message.
// It's exported for HTTP stream, such as HTTP FLV, only need to write to client when
// serving it, but we need to start a thread to read message to detect whether FD is closed.
// @see https://github.com/ossrs/srs/issues/636#issuecomment-298208427
// @remark Should only used in HTTP-FLV streaming connection.
virtual srs_error_t pop_message(ISrsHttpMessage **preq);
// Interface ISrsHttpConnOwner.
public:
virtual srs_error_t on_start();
virtual srs_error_t on_http_message(ISrsHttpMessage *r, ISrsHttpResponseWriter *w);
virtual srs_error_t on_message_done(ISrsHttpMessage *r, ISrsHttpResponseWriter *w);
virtual srs_error_t on_conn_done(srs_error_t r0);
// Interface ISrsResource.
public:
virtual std::string desc();
// Interface ISrsConnection.
public:
virtual std::string remote_ip();
virtual const SrsContextId &get_id();
// Interface ISrsStartable
public:
virtual srs_error_t start();
public:
ISrsKbpsDelta *delta();
};
// The http server, use http stream or static server to serve requests.
class ISrsHttpServer : public ISrsCommonHttpHandler
{
public:
ISrsHttpServer();
virtual ~ISrsHttpServer();
public:
};
// The http server, use http stream or static server to serve requests.
class SrsHttpServer : public ISrsHttpServer
{
// clang-format off
SRS_DECLARE_PRIVATE: // clang-format on
ISrsHttpStaticServer *http_static_;
ISrsHttpStreamServer *http_stream_;
public:
SrsHttpServer();
virtual ~SrsHttpServer();
public:
virtual srs_error_t initialize();
// Interface ISrsCommonHttpHandler
public:
virtual srs_error_t handle(std::string pattern, ISrsHttpHandler *handler);
// Interface ISrsHttpHandler
public:
virtual srs_error_t serve_http(ISrsHttpResponseWriter *w, ISrsHttpMessage *r);
public:
virtual srs_error_t http_mount(ISrsRequest *r);
virtual void http_unmount(ISrsRequest *r);
};
#endif