Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 31 additions & 2 deletions parseurl.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
#include "rtmp_sys.h"
#include "log.h"

int PILI_RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port,
AVal *playpath, AVal *app)
int PILI_RTMP_ParseURL2(const char *url, int *protocol, AVal *host, unsigned int *port,
AVal *playpath, AVal *app, AVal *domainName)
{
char *p, *end, *col, *ques, *slash;

Expand Down Expand Up @@ -130,6 +130,30 @@ int PILI_RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int
}
p = slash+1;

/** parse domain
* rtmp://host:[port]/app/...?domain=a.com
* use domain to replace host
*/

if (domainName != NULL && ques != NULL) {
char* domain = strstr(ques, "domain=");
if (domain) {
domain += 7; //skip "domain="
char* end = strchr(domain, '&');
int host_len = 0;
if (end) {
host_len = end - domain;
}else {
host_len = strlen(domain);
}
if(host_len < 256) {
domainName->av_val = domain;
domainName->av_len = host_len;
RTMP_Log(RTMP_LOGDEBUG, "Parsed host and domain : %.*s", host_len, host->av_val);
}
}
}

{
/* parse application
*
Expand Down Expand Up @@ -283,3 +307,8 @@ void PILI_RTMP_ParsePlaypath(AVal *in, AVal *out) {
out->av_val = streamname;
out->av_len = destptr - streamname;
}

int PILI_RTMP_ParseURL(const char *url, int *protocol, AVal *host,
unsigned int *port, AVal *playpath, AVal *app){
return PILI_RTMP_ParseURL2(url, protocol, host, port, playpath, app, NULL);
}
38 changes: 22 additions & 16 deletions rtmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -686,8 +686,8 @@ int PILI_RTMP_SetupURL(PILI_RTMP *r, const char *url, RTMPError *error)
*ptr = '\0';

len = (int)strlen(url);
ret = PILI_RTMP_ParseURL(url, &r->Link.protocol, &r->Link.hostname,
&port, &r->Link.playpath0, &r->Link.app);
ret = PILI_RTMP_ParseURL2(url, &r->Link.protocol, &r->Link.hostname,
&port, &r->Link.playpath0, &r->Link.app, &r->Link.domain);
if (!ret)
return ret;
r->Link.port = port;
Expand Down Expand Up @@ -742,29 +742,35 @@ int PILI_RTMP_SetupURL(PILI_RTMP *r, const char *url, RTMPError *error)
r->Link.tcUrl.av_val = url;
if (r->Link.app.av_len)
{
if (r->Link.app.av_val < url + len)
AVal* domain = &r->Link.domain;
if (domain->av_len == 0 && r->Link.app.av_val < url + len)
{
/* if app is part of original url, just use it */
r->Link.tcUrl.av_len = r->Link.app.av_len + (r->Link.app.av_val - url);
}
else
{
len = r->Link.hostname.av_len + r->Link.app.av_len +
sizeof("rtmpte://:65535/");
r->Link.tcUrl.av_val = malloc(len);
r->Link.tcUrl.av_len = snprintf(r->Link.tcUrl.av_val, len,
"%s://%.*s:%d/%.*s",
PILI_RTMPProtocolStringsLower[r->Link.protocol],
r->Link.hostname.av_len, r->Link.hostname.av_val,
r->Link.port,
r->Link.app.av_len, r->Link.app.av_val);
r->Link.lFlags |= RTMP_LF_FTCU;
}
if (domain->av_len == 0) {
domain = &r->Link.hostname;
}
if (r->Link.port = 0) {
r->Link.port = 1935;
}
len = domain->av_len + r->Link.app.av_len + sizeof("rtmpte://:65535/");
r->Link.tcUrl.av_val = malloc(len);
r->Link.tcUrl.av_len = snprintf(r->Link.tcUrl.av_val, len,
"%s://%.*s:%d/%.*s",
PILI_RTMPProtocolStringsLower[r->Link.protocol],
domain->av_len, domain->av_val,
r->Link.port,
r->Link.app.av_len, r->Link.app.av_val);
r->Link.lFlags |= RTMP_LF_FTCU;
}
}
else
{
r->Link.tcUrl.av_len = strlen(url);
}
r->Link.tcUrl.av_len = strlen(url);
}
}

#ifdef CRYPTO
Expand Down
4 changes: 4 additions & 0 deletions rtmp.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ extern "C"
typedef struct PILI_RTMP_LNK
{
AVal hostname;
AVal domain;
AVal sockshost;

AVal playpath0; /* parsed from URL */
Expand Down Expand Up @@ -278,6 +279,9 @@ extern "C"

int PILI_RTMP_ParseURL(const char *url, int *protocol, AVal *host,
unsigned int *port, AVal *playpath, AVal *app);

int PILI_RTMP_ParseURL2(const char *url, int *protocol, AVal *host,
unsigned int *port, AVal *playpath, AVal *app, AVal *domain);

void PILI_RTMP_ParsePlaypath(AVal *in, AVal *out);
void PILI_RTMP_SetBufferMS(PILI_RTMP *r, int size);
Expand Down