From f247ac9dafa86b5a51791aa5c1bcdd8affe65a9c Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 11 Mar 2015 14:48:51 +0800 Subject: [PATCH] fix the http parse bug. --- .../srs_xcode.xcodeproj/project.pbxproj | 63 +++++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 27008 -> 27407 bytes trunk/research/librtmp/srs_ingest_flv.c | 12 +++- trunk/research/librtmp/srs_ingest_rtmp.c | 12 +++- trunk/src/app/srs_app_http.cpp | 24 ++++--- 5 files changed, 98 insertions(+), 13 deletions(-) diff --git a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj index 3e4285df1..867df88b9 100644 --- a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj +++ b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj @@ -73,6 +73,19 @@ 3C1232E91AAEA5D000CE8F6C /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1232E71AAEA5D000CE8F6C /* libcrypto.a */; }; 3C1232EA1AAEA5D000CE8F6C /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1232E81AAEA5D000CE8F6C /* libssl.a */; }; 3C1232ED1AAEA70F00CE8F6C /* libhttp_parser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1232EC1AAEA70F00CE8F6C /* libhttp_parser.a */; }; + 3C663F0E1AB0155100286D8B /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F011AB0155100286D8B /* Makefile */; }; + 3C663F0F1AB0155100286D8B /* srs_aac_raw_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F021AB0155100286D8B /* srs_aac_raw_publish.c */; }; + 3C663F101AB0155100286D8B /* srs_audio_raw_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F031AB0155100286D8B /* srs_audio_raw_publish.c */; }; + 3C663F111AB0155100286D8B /* srs_bandwidth_check.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F041AB0155100286D8B /* srs_bandwidth_check.c */; }; + 3C663F121AB0155100286D8B /* srs_detect_rtmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F051AB0155100286D8B /* srs_detect_rtmp.c */; }; + 3C663F131AB0155100286D8B /* srs_flv_injecter.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F061AB0155100286D8B /* srs_flv_injecter.c */; }; + 3C663F141AB0155100286D8B /* srs_flv_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F071AB0155100286D8B /* srs_flv_parser.c */; }; + 3C663F151AB0155100286D8B /* srs_h264_raw_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F081AB0155100286D8B /* srs_h264_raw_publish.c */; }; + 3C663F161AB0155100286D8B /* srs_ingest_flv.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F091AB0155100286D8B /* srs_ingest_flv.c */; }; + 3C663F171AB0155100286D8B /* srs_ingest_rtmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F0A1AB0155100286D8B /* srs_ingest_rtmp.c */; }; + 3C663F181AB0155100286D8B /* srs_play.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F0B1AB0155100286D8B /* srs_play.c */; }; + 3C663F191AB0155100286D8B /* srs_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F0C1AB0155100286D8B /* srs_publish.c */; }; + 3C663F1A1AB0155100286D8B /* srs_rtmp_dump.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F0D1AB0155100286D8B /* srs_rtmp_dump.c */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -245,6 +258,19 @@ 3C1232F21AAEAC7000CE8F6C /* srs-api */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "srs-api"; path = "../../../etc/init.d/srs-api"; sourceTree = ""; }; 3C1232F31AAEAC7000CE8F6C /* srs-demo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "srs-demo"; path = "../../../etc/init.d/srs-demo"; sourceTree = ""; }; 3C1232F41AAEAC7000CE8F6C /* srs-demo-19350 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "srs-demo-19350"; path = "../../../etc/init.d/srs-demo-19350"; sourceTree = ""; }; + 3C663F011AB0155100286D8B /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = ../../../research/librtmp/Makefile; sourceTree = ""; }; + 3C663F021AB0155100286D8B /* srs_aac_raw_publish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_aac_raw_publish.c; path = ../../../research/librtmp/srs_aac_raw_publish.c; sourceTree = ""; }; + 3C663F031AB0155100286D8B /* srs_audio_raw_publish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_audio_raw_publish.c; path = ../../../research/librtmp/srs_audio_raw_publish.c; sourceTree = ""; }; + 3C663F041AB0155100286D8B /* srs_bandwidth_check.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_bandwidth_check.c; path = ../../../research/librtmp/srs_bandwidth_check.c; sourceTree = ""; }; + 3C663F051AB0155100286D8B /* srs_detect_rtmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_detect_rtmp.c; path = ../../../research/librtmp/srs_detect_rtmp.c; sourceTree = ""; }; + 3C663F061AB0155100286D8B /* srs_flv_injecter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_flv_injecter.c; path = ../../../research/librtmp/srs_flv_injecter.c; sourceTree = ""; }; + 3C663F071AB0155100286D8B /* srs_flv_parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_flv_parser.c; path = ../../../research/librtmp/srs_flv_parser.c; sourceTree = ""; }; + 3C663F081AB0155100286D8B /* srs_h264_raw_publish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_h264_raw_publish.c; path = ../../../research/librtmp/srs_h264_raw_publish.c; sourceTree = ""; }; + 3C663F091AB0155100286D8B /* srs_ingest_flv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_ingest_flv.c; path = ../../../research/librtmp/srs_ingest_flv.c; sourceTree = ""; }; + 3C663F0A1AB0155100286D8B /* srs_ingest_rtmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_ingest_rtmp.c; path = ../../../research/librtmp/srs_ingest_rtmp.c; sourceTree = ""; }; + 3C663F0B1AB0155100286D8B /* srs_play.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_play.c; path = ../../../research/librtmp/srs_play.c; sourceTree = ""; }; + 3C663F0C1AB0155100286D8B /* srs_publish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_publish.c; path = ../../../research/librtmp/srs_publish.c; sourceTree = ""; }; + 3C663F0D1AB0155100286D8B /* srs_rtmp_dump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_rtmp_dump.c; path = ../../../research/librtmp/srs_rtmp_dump.c; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -265,9 +291,10 @@ 3C1231DC1AAE64A400CE8F6C = { isa = PBXGroup; children = ( + 3C1231E61AAE64A400CE8F6C /* Products */, 3C1232EE1AAEA71C00CE8F6C /* links */, 3C1231E71AAE64A400CE8F6C /* srs_xcode */, - 3C1231E61AAE64A400CE8F6C /* Products */, + 3C663F001AB014B500286D8B /* research */, ); sourceTree = ""; }; @@ -529,6 +556,27 @@ name = init.d; sourceTree = ""; }; + 3C663F001AB014B500286D8B /* research */ = { + isa = PBXGroup; + children = ( + 3C663F011AB0155100286D8B /* Makefile */, + 3C663F021AB0155100286D8B /* srs_aac_raw_publish.c */, + 3C663F031AB0155100286D8B /* srs_audio_raw_publish.c */, + 3C663F041AB0155100286D8B /* srs_bandwidth_check.c */, + 3C663F051AB0155100286D8B /* srs_detect_rtmp.c */, + 3C663F061AB0155100286D8B /* srs_flv_injecter.c */, + 3C663F071AB0155100286D8B /* srs_flv_parser.c */, + 3C663F081AB0155100286D8B /* srs_h264_raw_publish.c */, + 3C663F091AB0155100286D8B /* srs_ingest_flv.c */, + 3C663F0A1AB0155100286D8B /* srs_ingest_rtmp.c */, + 3C663F0B1AB0155100286D8B /* srs_play.c */, + 3C663F0C1AB0155100286D8B /* srs_publish.c */, + 3C663F0D1AB0155100286D8B /* srs_rtmp_dump.c */, + ); + name = research; + path = srs_xcode; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -586,9 +634,12 @@ buildActionMask = 2147483647; files = ( 3C1232951AAE81D900CE8F6C /* srs_app_config.cpp in Sources */, + 3C663F0F1AB0155100286D8B /* srs_aac_raw_publish.c in Sources */, 3C1232961AAE81D900CE8F6C /* srs_app_conn.cpp in Sources */, 3C12322A1AAE814D00CE8F6C /* srs_kernel_ts.cpp in Sources */, 3C12329E1AAE81D900CE8F6C /* srs_app_hls.cpp in Sources */, + 3C663F171AB0155100286D8B /* srs_ingest_rtmp.c in Sources */, + 3C663F131AB0155100286D8B /* srs_flv_injecter.c in Sources */, 3C1232971AAE81D900CE8F6C /* srs_app_dvr.cpp in Sources */, 3C1232271AAE814D00CE8F6C /* srs_kernel_log.cpp in Sources */, 3C1232A81AAE81D900CE8F6C /* srs_app_log.cpp in Sources */, @@ -600,6 +651,8 @@ 3C12324A1AAE81A400CE8F6C /* srs_rtsp_stack.cpp in Sources */, 3C1232A51AAE81D900CE8F6C /* srs_app_json.cpp in Sources */, 3C12329F1AAE81D900CE8F6C /* srs_app_http_api.cpp in Sources */, + 3C663F101AB0155100286D8B /* srs_audio_raw_publish.c in Sources */, + 3C663F111AB0155100286D8B /* srs_bandwidth_check.c in Sources */, 3C1232A11AAE81D900CE8F6C /* srs_app_http_conn.cpp in Sources */, 3C1232AC1AAE81D900CE8F6C /* srs_app_refer.cpp in Sources */, 3C1232991AAE81D900CE8F6C /* srs_app_empty.cpp in Sources */, @@ -608,9 +661,11 @@ 3C1232221AAE814D00CE8F6C /* srs_kernel_codec.cpp in Sources */, 3C1232B71AAE81D900CE8F6C /* srs_app_utility.cpp in Sources */, 3C1232AB1AAE81D900CE8F6C /* srs_app_recv_thread.cpp in Sources */, + 3C663F151AB0155100286D8B /* srs_h264_raw_publish.c in Sources */, 3C1231F61AAE652D00CE8F6C /* srs_core_autofree.cpp in Sources */, 3C1232411AAE81A400CE8F6C /* srs_raw_avc.cpp in Sources */, 3C1232491AAE81A400CE8F6C /* srs_rtmp_utility.cpp in Sources */, + 3C663F191AB0155100286D8B /* srs_publish.c in Sources */, 3C1232A01AAE81D900CE8F6C /* srs_app_http_client.cpp in Sources */, 3C12329B1AAE81D900CE8F6C /* srs_app_ffmpeg.cpp in Sources */, 3C1232421AAE81A400CE8F6C /* srs_rtmp_amf0.cpp in Sources */, @@ -620,6 +675,7 @@ 3C1232AD1AAE81D900CE8F6C /* srs_app_reload.cpp in Sources */, 3C1231F81AAE652D00CE8F6C /* srs_core.cpp in Sources */, 3C1232A21AAE81D900CE8F6C /* srs_app_http_hooks.cpp in Sources */, + 3C663F121AB0155100286D8B /* srs_detect_rtmp.c in Sources */, 3C1232B11AAE81D900CE8F6C /* srs_app_server.cpp in Sources */, 3C1232B31AAE81D900CE8F6C /* srs_app_st_socket.cpp in Sources */, 3C1232061AAE812C00CE8F6C /* srs_main_server.cpp in Sources */, @@ -630,15 +686,20 @@ 3C1232461AAE81A400CE8F6C /* srs_rtmp_msg_array.cpp in Sources */, 3C1232A71AAE81D900CE8F6C /* srs_app_listener.cpp in Sources */, 3C1232261AAE814D00CE8F6C /* srs_kernel_flv.cpp in Sources */, + 3C663F1A1AB0155100286D8B /* srs_rtmp_dump.c in Sources */, 3C1232241AAE814D00CE8F6C /* srs_kernel_error.cpp in Sources */, 3C1232441AAE81A400CE8F6C /* srs_rtmp_handshake.cpp in Sources */, 3C1232291AAE814D00CE8F6C /* srs_kernel_stream.cpp in Sources */, + 3C663F181AB0155100286D8B /* srs_play.c in Sources */, 3C1232B61AAE81D900CE8F6C /* srs_app_thread.cpp in Sources */, 3C1232A91AAE81D900CE8F6C /* srs_app_mpegts_udp.cpp in Sources */, 3C1232AE1AAE81D900CE8F6C /* srs_app_rtmp_conn.cpp in Sources */, 3C1232B51AAE81D900CE8F6C /* srs_app_statistic.cpp in Sources */, + 3C663F161AB0155100286D8B /* srs_ingest_flv.c in Sources */, + 3C663F141AB0155100286D8B /* srs_flv_parser.c in Sources */, 3C1232451AAE81A400CE8F6C /* srs_rtmp_io.cpp in Sources */, 3C1232431AAE81A400CE8F6C /* srs_rtmp_buffer.cpp in Sources */, + 3C663F0E1AB0155100286D8B /* Makefile in Sources */, 3C1232211AAE814D00CE8F6C /* srs_kernel_buffer.cpp in Sources */, 3C1232471AAE81A400CE8F6C /* srs_rtmp_sdk.cpp in Sources */, 3C1232A61AAE81D900CE8F6C /* srs_app_kbps.cpp in Sources */, diff --git a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.xcworkspace/xcuserdata/winlin.xcuserdatad/UserInterfaceState.xcuserstate b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.xcworkspace/xcuserdata/winlin.xcuserdatad/UserInterfaceState.xcuserstate index 6c42ef045e00101b68efea101b9d7984929343ac..2df424da4fc917ae4ed5e85a72e919200b482ac5 100644 GIT binary patch literal 27407 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

!vi=xkS8$6LEwH#%N%vxgxR^-iY$;o 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 O{AKnFf1SS@R{cNqh5xAl literal 27008 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 Npf}mv`)Aa+{|^NXR*L`t diff --git a/trunk/research/librtmp/srs_ingest_flv.c b/trunk/research/librtmp/srs_ingest_flv.c index 04de28629..4136b1eb1 100644 --- a/trunk/research/librtmp/srs_ingest_flv.c +++ b/trunk/research/librtmp/srs_ingest_flv.c @@ -53,7 +53,8 @@ int main(int argc, char** argv) // user option parse index. int opt = 0; // user options. - char* in_flv_file; char* out_rtmp_url; + char* in_flv_file = NULL; + char* out_rtmp_url = NULL; // rtmp handler srs_rtmp_t ortmp; // flv handler @@ -89,6 +90,15 @@ int main(int argc, char** argv) } } + if (!in_flv_file) { + srs_human_trace("input invalid, use -i "); + return -1; + } + if (!out_rtmp_url) { + srs_human_trace("output invalid, use -y "); + return -1; + } + srs_human_trace("input: %s", in_flv_file); srs_human_trace("output: %s", out_rtmp_url); diff --git a/trunk/research/librtmp/srs_ingest_rtmp.c b/trunk/research/librtmp/srs_ingest_rtmp.c index d5ce75aac..b9607cb40 100644 --- a/trunk/research/librtmp/srs_ingest_rtmp.c +++ b/trunk/research/librtmp/srs_ingest_rtmp.c @@ -41,7 +41,8 @@ int main(int argc, char** argv) // user option parse index. int opt = 0; // user options. - char* in_rtmp_url; char* out_rtmp_url; + char* in_rtmp_url = NULL; + char* out_rtmp_url = NULL; // rtmp handler srs_rtmp_t irtmp, ortmp; @@ -74,6 +75,15 @@ int main(int argc, char** argv) } } + if (!in_rtmp_url) { + srs_human_trace("input invalid, use -i "); + return -1; + } + if (!out_rtmp_url) { + srs_human_trace("output invalid, use -y "); + return -1; + } + srs_human_trace("input: %s", in_rtmp_url); srs_human_trace("output: %s", out_rtmp_url); diff --git a/trunk/src/app/srs_app_http.cpp b/trunk/src/app/srs_app_http.cpp index aef7738d5..a16f33efb 100644 --- a/trunk/src/app/srs_app_http.cpp +++ b/trunk/src/app/srs_app_http.cpp @@ -43,9 +43,6 @@ using namespace std; #define SRS_DEFAULT_HTTP_PORT 80 -#define SRS_HTTP_HEADER_BUFFER 1024 -#define SRS_HTTP_BODY_BUFFER 1024 - // for http parser macros #define SRS_CONSTS_HTTP_OPTIONS HTTP_OPTIONS #define SRS_CONSTS_HTTP_GET HTTP_GET @@ -1310,9 +1307,18 @@ int SrsHttpParser::parse_message_imp(SrsStSocket* skt) int ret = ERROR_SUCCESS; while (true) { - if (buffer->size() <= 0) { - // when empty, only grow 1bytes, but the buffer will cache more. - if ((ret = buffer->grow(skt, 1)) != ERROR_SUCCESS) { + ssize_t nparsed = 0; + + // when buffer not empty, parse it. + if (buffer->size() > 0) { + nparsed = http_parser_execute(&parser, &settings, buffer->bytes(), buffer->size()); + srs_info("buffer=%d, nparsed=%d, body=%d", buffer->size(), (int)nparsed, body_parsed); + } + + // when nothing parsed, read more to parse. + if (nparsed == 0) { + // when requires more, only grow 1bytes, but the buffer will cache more. + if ((ret = buffer->grow(skt, buffer->size() + 1)) != ERROR_SUCCESS) { if (!srs_is_client_gracefully_close(ret)) { srs_error("read body from server failed. ret=%d", ret); } @@ -1320,10 +1326,8 @@ int SrsHttpParser::parse_message_imp(SrsStSocket* skt) } } - int nb_header = srs_min(SRS_HTTP_HEADER_BUFFER, buffer->size()); - ssize_t nparsed = http_parser_execute(&parser, &settings, buffer->bytes(), nb_header); - srs_info("buffer=%d, nparsed=%d, body=%d", buffer->size(), (int)nparsed, body_parsed); - if (nparsed - body_parsed > 0) { + // consume the parsed bytes. + if (nparsed && nparsed - body_parsed > 0) { buffer->read_slice(nparsed - body_parsed); }