private bool ConnectForPullPush(BaseRTMPProtocol pFrom, string uriPath, Variant streamConfig, bool isPull)
{
var uri = new Uri(streamConfig[uriPath]);
var appName = isPull ? uri.Segments[1] : uri.PathAndQuery;
if (!string.IsNullOrEmpty(appName))
{
appName = appName.Trim('/');
}
if (string.IsNullOrEmpty(appName))
{
Logger.FATAL("invalid uri:{0}", uri.OriginalString);
return false;
}
if (!string.IsNullOrEmpty(uri.UserInfo))
{
var userInfo = uri.UserInfo.Split(':');
if (streamConfig["auth"] != null)
{
var user = userInfo[0];
var password = userInfo[1];
var salt = (string)streamConfig["auth"]["salt"];
var opaque = (string)streamConfig["auth"]["opaque"];
var challenge = (string)streamConfig["auth"]["challenge"];
var md5 = MD5.Create();
var response =
Convert.ToBase64String(
md5.ComputeHash(
Encoding.ASCII.GetBytes(
Convert.ToBase64String(
md5.ComputeHash(Encoding.ASCII.GetBytes(user + salt + password))) + opaque +
challenge)));
appName += "?authmod=abobe"
+ "&user=" + user
+ "&challenge=" + challenge
+ "&opaque=" + opaque
+ "&salt=" + salt
+ "&response=" + response;
streamConfig["emulateUserAgent"] = "FMLE/3.0 (compatible; FMSc/1.0)";
}
else
{
appName = appName + "?authmod=adobe&user=" + userInfo[0];
streamConfig["emulateUserAgent"] = "FMLE/3.0 (compatible; FMSc/1.0)";
}
}
// //3. Compute tcUrl: rtmp://host/appName
// string tcUrl = format("%s://%s%s/%s",
// STR(uri.scheme()),
// STR(uri.host()),
// STR(uri.portSpecified() ? format(":%"PRIu32) : ""),
// STR(appName));
//4. Get the user agent
var userAgent = (string)streamConfig["emulateUserAgent"];
if (string.IsNullOrEmpty(userAgent))
{
userAgent = Defines.HTTP_HEADERS_SERVER_US;
}
var tcUrl = (string)streamConfig["tcUrl"];
var swfUrl = (string)streamConfig["swfUrl"];
var pageUrl = (string)streamConfig["pageUrl"];
//6. Prepare the connect request
var connectRequest = ConnectionMessageFactory.GetInvokeConnect(
appName, //string appName
tcUrl, //string tcUrl
3191, //double audioCodecs
239, //double capabilities
userAgent, //string flashVer
false, //bool fPad
pageUrl, //string pageUrl
swfUrl, //string swfUrl
252, //double videoCodecs
1, //double videoFunction
0 //double objectEncoding
);
//7. Send it
if (!SendRTMPMessage(pFrom, connectRequest, true))
{
Logger.FATAL("Unable to send request:\n{0}", connectRequest.ToString());
return false;
}
return true;
}