srs/trunk/src/protocol/srs_protocol_http_stack_llhttpadapter.cpp
Winlin 6720e96745
Upgrade HTTP parser from http-parser to llhttp. v7.0.77 (#4469)
This PR modernizes SRS's HTTP handling by upgrading from the legacy
http-parser library to the more performant and actively maintained
llhttp library.

* Replace http-parser with llhttp: Migrated from the deprecated
http-parser to llhttp for better performance and maintenance
* API compatibility: Updated all HTTP parsing logic to use llhttp APIs
while maintaining backward compatibility
* Simplified URL parsing: Replaced complex http-parser URL parsing with
custom simple parser implementation
Enhanced error handling: Improved error reporting with llhttp's better
error context and positioning


---------

Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-09-03 20:12:59 -04:00

202 lines
7.7 KiB
C++

//
// Copyright (c) 2013-2025 The SRS Authors
//
// SPDX-License-Identifier: MIT
//
#include <srs_protocol_http_stack_llhttpadapter.hpp>
// To avoid type mismatch, these functions are used to bridge the APIs.
// Bridge functions for internal callbacks that call the public API implementations
// These bridge the internal callback signature to the public API signature
extern int llhttp__on_message_begin(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_message_begin(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_message_begin((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_protocol(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_protocol(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_protocol((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_url(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_url(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_url((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_status(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_status(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_status((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_method(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_method(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_method((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_version(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_version(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_version((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_header_field(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_header_field(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_header_field((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_header_value(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_header_value(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_header_value((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_chunk_extension_name(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_chunk_extension_name(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_chunk_extension_name((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_chunk_extension_value(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_chunk_extension_value(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_chunk_extension_value((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_headers_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_headers_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_headers_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_body(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_body(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_body((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_message_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_message_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_message_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_url_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_url_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_url_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_status_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_status_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_status_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_method_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_method_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_method_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_version_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_version_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_version_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_header_field_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_header_field_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_header_field_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_header_value_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_header_value_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_header_value_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_chunk_header(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_chunk_header(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_chunk_header((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_chunk_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_chunk_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_chunk_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_chunk_extension_name_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_chunk_extension_name_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_chunk_extension_name_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_chunk_extension_value_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_chunk_extension_value_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_chunk_extension_value_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_reset(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_reset(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_reset((llhttp_t *)s, (const char *)p, (const char *)endp);
}
extern int llhttp__on_protocol_complete(llhttp_t *s, const char *p, const char *endp);
int llhttp__on_protocol_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return llhttp__on_protocol_complete((llhttp_t *)s, (const char *)p, (const char *)endp);
}
int llhttp__before_headers_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return 0;
}
int llhttp__after_headers_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return 0;
}
int llhttp__after_message_complete(llhttp__internal_t *s, const unsigned char *p, const unsigned char *endp)
{
return 0;
}