From 9212bed0ed442ce7ce430ee3f5d23eefe53834f3 Mon Sep 17 00:00:00 2001 From: Dan Kortschak Date: Fri, 7 Sep 2018 07:01:59 +0930 Subject: [PATCH] rtmp: simplify url parsing --- rtmp/parseurl.go | 24 ++++++++++++------------ rtmp/rtmp.go | 27 +++++++++------------------ 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/rtmp/parseurl.go b/rtmp/parseurl.go index 7af55ebb..4c541fdc 100644 --- a/rtmp/parseurl.go +++ b/rtmp/parseurl.go @@ -39,17 +39,14 @@ import ( "unsafe" ) -// int RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port, -// AVal *playpath, AVal *app); +// int RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port, AVal *playpath, AVal *app); // parseurl.c +33 -func C_RTMP_ParseURL(url *byte, protocol *int32, host *C_AVal, port *uint32, - playpath *C_AVal, app *C_AVal) int { - +func C_RTMP_ParseURL(url *byte, host *C_AVal, port *uint16, playpath, app *C_AVal) (protocol int32, ok bool) { var p, end, col, ques, slash *byte // TODO: use our logger here // RTMP_Log(RTMP_LOGDEBUG, "Parsing..."); - *protocol = RTMP_PROTOCOL_RTMP + protocol = RTMP_PROTOCOL_RTMP *port = 0 playpath.av_len = 0 playpath.av_val = nil @@ -61,7 +58,7 @@ func C_RTMP_ParseURL(url *byte, protocol *int32, host *C_AVal, port *uint32, if p == nil { // TODO: use our logger here log.Println("RTMP URL: No :// in url!") - return 0 + return protocol, false } /* NOTE: the following code nees to be ported if we're using anything other than @@ -99,7 +96,7 @@ func C_RTMP_ParseURL(url *byte, protocol *int32, host *C_AVal, port *uint32, if *p == 0 { // TODO: use new logger here // RTMP_Log(RTMP_LOGWARNING, "No hostname in URL!"); - return 0 + return protocol, false } end = (*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + uintptr(strlen(p)))) @@ -135,20 +132,23 @@ func C_RTMP_ParseURL(url *byte, protocol *int32, host *C_AVal, port *uint32, if *p == ':' { var p2 uint32 p = (*byte)(incBytePtr(unsafe.Pointer(p), 1)) - tmp, _ := strconv.Atoi(cStrToGoStr(p)) + tmp, err := strconv.Atoi(cStrToGoStr(p)) + if err != nil { + return protocol, false + } p2 = uint32(tmp) if p2 > 65535 { // TODO: use new logger with this // RTMP_Log(RTMP_LOGWARNING, "Invalid port number!"); } else { - *port = p2 + *port = uint16(p2) } } if slash == nil { // TODO: use new logger // RTMP_Log(RTMP_LOGWARNING, "No application or playpath in URL!"); - return 1 + return protocol, true } p = (*byte)(incBytePtr(unsafe.Pointer(slash), 1)) @@ -225,7 +225,7 @@ func C_RTMP_ParseURL(url *byte, protocol *int32, host *C_AVal, port *uint32, C_RTMP_ParsePlaypath(&av, playpath) } - return 1 + return protocol, true } // void RTMP_ParsePlaypath(AVal *in, AVal *out); diff --git a/rtmp/rtmp.go b/rtmp/rtmp.go index 66f31fcd..3c574d04 100644 --- a/rtmp/rtmp.go +++ b/rtmp/rtmp.go @@ -295,34 +295,25 @@ func C_SocksSetup(r *C_RTMP, sockshost *C_AVal) { // int RTMP_SetupURL(RTMP *r, char* url); // rtmp.c +757 // NOTE: code dealing with rtmp over http has been disregarded -func C_RTMP_SetupURL(r *C_RTMP, u string) (ok bool) { - url := goStrToCStr(u) +func C_RTMP_SetupURL(r *C_RTMP, addr string) (ok bool) { + u := goStrToCStr(addr) + length := strlen(u) - var length int32 - var port uint32 - port = 0 - - length = strlen(url) - // TODO: port this - ret := int32(C_RTMP_ParseURL((*byte)(unsafe.Pointer(url)), (*int32)( - unsafe.Pointer(&r.Link.protocol)), &r.Link.hostname, (*uint32)( - unsafe.Pointer(&port)), &r.Link.playpath0, &r.Link.app)) - if ret == 0 { + r.Link.protocol, ok = C_RTMP_ParseURL(u, &r.Link.hostname, &r.Link.port, &r.Link.playpath0, &r.Link.app) + if !ok { return false } - - r.Link.port = uint16(port) r.Link.playpath = r.Link.playpath0 if r.Link.tcUrl.av_len == 0 { - r.Link.tcUrl.av_val = (*byte)(unsafe.Pointer(url)) + r.Link.tcUrl.av_val = (*byte)(unsafe.Pointer(u)) if r.Link.app.av_len != 0 { if int(uintptr(unsafe.Pointer(r.Link.app.av_val))) < - int(uintptr(incBytePtr(unsafe.Pointer(url), int(length)))) { + int(uintptr(incBytePtr(unsafe.Pointer(u), int(length)))) { r.Link.tcUrl.av_len = int32(int(r.Link.app.av_len) + int(uintptr(decBytePtr(unsafe.Pointer(r.Link.app.av_val), - int(uintptr(unsafe.Pointer(url))))))) + int(uintptr(unsafe.Pointer(u))))))) } else { length = int32(r.Link.hostname.av_len) + int32(r.Link.app.av_len) + int32(len("rtmpte://:65535/\x00")) @@ -343,7 +334,7 @@ func C_RTMP_SetupURL(r *C_RTMP, u string) (ok bool) { r.Link.lFlags |= RTMP_LF_FTCU } } else { - r.Link.tcUrl.av_len = int32(strlen(url)) + r.Link.tcUrl.av_len = int32(strlen(u)) } }