mirror of
https://github.com/ossrs/srs.git
synced 2025-05-15 18:22:14 +08:00
Compare commits
8 Commits
236a2f4f09
...
054f2c221e
Author | SHA1 | Date | |
---|---|---|---|
|
054f2c221e | ||
|
136b5ab764 | ||
|
feb2abbd73 | ||
|
3d8ef92a23 | ||
|
f6238c2fc3 | ||
|
8b5741882b | ||
|
b7766637d4 | ||
|
133795193a |
.github/workflows
trunk
doc
ide/srs_clion
research/players/js
src
3
.github/workflows/test.yml
vendored
3
.github/workflows/test.yml
vendored
@ -68,7 +68,8 @@ jobs:
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: srs-cache
|
||||
- uses: geekyeggo/delete-artifact@54ab544f12cdb7b71613a16a2b5a37a9ade990af # v2.0.0
|
||||
# https://github.com/marketplace/actions/delete-artifact?version=v5.0.0#-compatibility
|
||||
- uses: geekyeggo/delete-artifact@v5.0.0
|
||||
with:
|
||||
name: srs-cache
|
||||
##################################################################################################################
|
||||
|
@ -7,6 +7,8 @@ The changelog for SRS.
|
||||
<a name="v7-changes"></a>
|
||||
|
||||
## SRS 7.0 Changelog
|
||||
* v7.0, 2025-03-18, Merge [#4302](https://github.com/ossrs/srs/pull/4302): update geekyeggo/delete-artifact to 5.0.0. v7.0.25 (#4302)
|
||||
* v7.0, 2025-03-06, Merge [#4296](https://github.com/ossrs/srs/pull/4296): Dvr: support h265 flv fragments. v7.0.24 (#4296)
|
||||
* v7.0, 2025-02-20, Merge [#4253](https://github.com/ossrs/srs/pull/4253): fix typo about heartbeat. v7.0.23 (#4253)
|
||||
* v7.0, 2025-02-19, Merge [#4291](https://github.com/ossrs/srs/pull/4291): fix ci error. v7.0.22 (#4291)
|
||||
* v7.0, 2025-01-14, Merge [#4271](https://github.com/ossrs/srs/pull/4271): update copyright to 2025. v7.0.21 (#4271)
|
||||
@ -35,6 +37,8 @@ The changelog for SRS.
|
||||
<a name="v6-changes"></a>
|
||||
|
||||
## SRS 6.0 Changelog
|
||||
* v6.0, 2025-03-18, Merge [#4302](https://github.com/ossrs/srs/pull/4302): update geekyeggo/delete-artifact to 5.0.0. v6.0.163 (#4302)
|
||||
* v6.0, 2025-03-06, Merge [#4296](https://github.com/ossrs/srs/pull/4296): Dvr: support h265 flv fragments. v6.0.162 (#4296)
|
||||
* v6.0, 2025-02-20, Merge [#4253](https://github.com/ossrs/srs/pull/4253): fix typo about heartbeat. v6.0.161 (#4253)
|
||||
* v6.0, 2025-02-19, Merge [#4291](https://github.com/ossrs/srs/pull/4291): fix ci error. v6.0.160 (#4291)
|
||||
* v6.0, 2025-01-14, Merge [#4271](https://github.com/ossrs/srs/pull/4271): update copyright to 2025. v6.0.159 (#4271)
|
||||
@ -200,6 +204,7 @@ The changelog for SRS.
|
||||
<a name="v5-changes"></a>
|
||||
|
||||
## SRS 5.0 Changelog
|
||||
* v5.0, 2025-03-18, Merge [#4302](https://github.com/ossrs/srs/pull/4302): update geekyeggo/delete-artifact to 5.0.0. v5.0.221 (#4302)
|
||||
* v5.0, 2025-02-20, Merge [#4253](https://github.com/ossrs/srs/pull/4253): fix typo about heartbeat. v5.0.220 (#4253)
|
||||
* v5.0, 2025-02-19, Merge [#4291](https://github.com/ossrs/srs/pull/4291): fix ci error. v5.0.219 (#4291)
|
||||
* v5.0, 2025-01-14, Merge [#4271](https://github.com/ossrs/srs/pull/4271): update copyright to 2025. v5.0.218 (#4271)
|
||||
|
@ -90,6 +90,10 @@ TARGET_LINK_LIBRARIES(srs -ldl -pthread)
|
||||
TARGET_LINK_LIBRARIES(srs -rdynamic)
|
||||
TARGET_LINK_LIBRARIES(srs -fsanitize=address -fno-omit-frame-pointer)
|
||||
|
||||
# Ensure pthread is correctly linked
|
||||
find_package(Threads REQUIRED)
|
||||
target_link_libraries(srs Threads::Threads)
|
||||
|
||||
###########################################################
|
||||
# For utest.
|
||||
# See https://google.github.io/googletest/quickstart-cmake.html
|
||||
|
@ -206,6 +206,8 @@ if (typeof JSON !== 'object') {
|
||||
'\\': '\\\\'
|
||||
},
|
||||
rep;
|
||||
// Locate the pattern definition for verbosity and update it
|
||||
var verbosityPattern = "^(off|errors|warnings|(info|progress)|(debug|progress\\+)|(trace|progress\\+\\+)|progress\\+\\+\\+)$";
|
||||
|
||||
|
||||
function quote(string) {
|
||||
|
@ -868,7 +868,13 @@ srs_error_t SrsDvrSegmentPlan::update_duration(SrsSharedPtrMessage* msg)
|
||||
|
||||
char* payload = msg->payload;
|
||||
int size = msg->size;
|
||||
bool is_key_frame = SrsFlvVideo::h264(payload, size) && SrsFlvVideo::keyframe(payload, size) && !SrsFlvVideo::sh(payload, size);
|
||||
|
||||
bool codec_ok = SrsFlvVideo::h264(payload, size);
|
||||
#ifdef SRS_H265
|
||||
codec_ok = codec_ok? true : SrsFlvVideo::hevc(payload, size);
|
||||
#endif
|
||||
|
||||
bool is_key_frame = codec_ok && SrsFlvVideo::keyframe(payload, size) && !SrsFlvVideo::sh(payload, size);
|
||||
if (!is_key_frame) {
|
||||
return err;
|
||||
}
|
||||
|
@ -9,6 +9,6 @@
|
||||
|
||||
#define VERSION_MAJOR 5
|
||||
#define VERSION_MINOR 0
|
||||
#define VERSION_REVISION 220
|
||||
#define VERSION_REVISION 221
|
||||
|
||||
#endif
|
||||
|
@ -9,6 +9,6 @@
|
||||
|
||||
#define VERSION_MAJOR 6
|
||||
#define VERSION_MINOR 0
|
||||
#define VERSION_REVISION 161
|
||||
#define VERSION_REVISION 163
|
||||
|
||||
#endif
|
||||
|
@ -9,6 +9,6 @@
|
||||
|
||||
#define VERSION_MAJOR 7
|
||||
#define VERSION_MINOR 0
|
||||
#define VERSION_REVISION 23
|
||||
#define VERSION_REVISION 25
|
||||
|
||||
#endif
|
@ -2200,6 +2200,7 @@ size_t http_parser_execute (http_parser *parser,
|
||||
const char *status_mark = 0;
|
||||
enum state p_state = (enum state) parser->state;
|
||||
const unsigned int lenient = parser->lenient_http_headers;
|
||||
const unsigned int allow_chunked_length = parser->allow_chunked_length;
|
||||
uint32_t nread = parser->nread;
|
||||
|
||||
/* We're in an error state. Don't bother doing anything. */
|
||||
@ -2319,8 +2320,9 @@ reexecute:
|
||||
{
|
||||
if (ch == CR || ch == LF)
|
||||
break;
|
||||
parser->flags = 0;
|
||||
parser->content_length = ULLONG_MAX;
|
||||
parser->flags = 0;
|
||||
parser->uses_transfer_encoding = 0;
|
||||
parser->content_length = ULLONG_MAX;
|
||||
|
||||
if (ch == 'H') {
|
||||
UPDATE_STATE(s_res_H);
|
||||
@ -2496,8 +2498,9 @@ reexecute:
|
||||
{
|
||||
if (ch == CR || ch == LF)
|
||||
break;
|
||||
parser->flags = 0;
|
||||
parser->content_length = ULLONG_MAX;
|
||||
parser->flags = 0;
|
||||
parser->uses_transfer_encoding = 0;
|
||||
parser->content_length = ULLONG_MAX;
|
||||
|
||||
if (UNLIKELY(!IS_ALPHA(ch))) {
|
||||
SET_ERRNO(HPE_INVALID_METHOD);
|
||||
@ -2858,8 +2861,14 @@ reexecute:
|
||||
ch = *p;
|
||||
c = TOKEN(ch);
|
||||
|
||||
if (!c)
|
||||
break;
|
||||
if (!c) {
|
||||
// Add this fix to explicitly reject space in header field names
|
||||
if (ch == ' ') {
|
||||
SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
|
||||
goto error;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
switch (parser->header_state) {
|
||||
case h_general: {
|
||||
@ -2941,6 +2950,14 @@ reexecute:
|
||||
parser->header_state = h_general;
|
||||
} else if (parser->index == sizeof(TRANSFER_ENCODING)-2) {
|
||||
parser->header_state = h_transfer_encoding;
|
||||
parser->uses_transfer_encoding = 1;
|
||||
|
||||
/* Multiple `Transfer-Encoding` headers should be treated as
|
||||
* one, but with values separate by a comma.
|
||||
*
|
||||
* See: https://tools.ietf.org/html/rfc7230#section-3.2.2
|
||||
*/
|
||||
parser->flags &= ~F_CHUNKED;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -3371,13 +3388,23 @@ reexecute:
|
||||
REEXECUTE();
|
||||
}
|
||||
|
||||
/* Cannot use chunked encoding and a content-length header together
|
||||
per the HTTP specification. */
|
||||
if ((parser->flags & F_CHUNKED) &&
|
||||
(parser->flags & F_CONTENTLENGTH)) {
|
||||
SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
|
||||
goto error;
|
||||
}
|
||||
/* Cannot use transfer-encoding and a content-length header together
|
||||
per the HTTP specification. (RFC 7230 Section 3.3.3) */
|
||||
if ((parser->uses_transfer_encoding == 1) &&
|
||||
(parser->flags & F_CONTENTLENGTH)) {
|
||||
/* Allow it for lenient parsing as long as `Transfer-Encoding` is
|
||||
* not `chunked` or allow_length_with_encoding is set
|
||||
*/
|
||||
if (parser->flags & F_CHUNKED) {
|
||||
if (!allow_chunked_length) {
|
||||
SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
|
||||
goto error;
|
||||
}
|
||||
} else if (!lenient) {
|
||||
SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
UPDATE_STATE(s_headers_done);
|
||||
|
||||
@ -3451,8 +3478,31 @@ reexecute:
|
||||
UPDATE_STATE(NEW_MESSAGE());
|
||||
CALLBACK_NOTIFY(message_complete);
|
||||
} else if (parser->flags & F_CHUNKED) {
|
||||
/* chunked encoding - ignore Content-Length header */
|
||||
/* chunked encoding - ignore Content-Length header,
|
||||
* prepare for a chunk */
|
||||
UPDATE_STATE(s_chunk_size_start);
|
||||
} else if (parser->uses_transfer_encoding == 1) {
|
||||
if (parser->type == HTTP_REQUEST && !lenient) {
|
||||
/* RFC 7230 3.3.3 */
|
||||
|
||||
/* If a Transfer-Encoding header field
|
||||
* is present in a request and the chunked transfer coding is not
|
||||
* the final encoding, the message body length cannot be determined
|
||||
* reliably; the server MUST respond with the 400 (Bad Request)
|
||||
* status code and then close the connection.
|
||||
*/
|
||||
SET_ERRNO(HPE_INVALID_TRANSFER_ENCODING);
|
||||
RETURN(p - data); /* Error */
|
||||
} else {
|
||||
/* RFC 7230 3.3.3 */
|
||||
|
||||
/* If a Transfer-Encoding header field is present in a response and
|
||||
* the chunked transfer coding is not the final encoding, the
|
||||
* message body length is determined by reading the connection until
|
||||
* it is closed by the server.
|
||||
*/
|
||||
UPDATE_STATE(s_body_identity_eof);
|
||||
}
|
||||
} else {
|
||||
if (parser->content_length == 0) {
|
||||
/* Content-Length header given but zero: Content-Length: 0\r\n */
|
||||
|
Loading…
x
Reference in New Issue
Block a user