Bug 1026923 - [RTSP] Change the User-Agent string of RTSP client. r=sworkman

This commit is contained in:
Ethan Tseng 2014-07-19 10:49:02 +08:00
parent c152f140c3
commit 4fb0600a31
7 changed files with 36 additions and 37 deletions

View File

@ -17,6 +17,7 @@
#include "nsIProtocolProxyService.h"
#include "nsIProxyInfo.h"
#include "nsIProxiedChannel.h"
#include "nsIHttpProtocolHandler.h"
#include "nsAutoPtr.h"
#include "nsStandardURL.h"
@ -200,7 +201,8 @@ RtspController::AsyncOpen(nsIStreamingProtocolListener *aListener)
LOG(("RtspController AsyncOpen uri=%s", uriSpec.get()));
if (!mRtspSource.get()) {
mRtspSource = new android::RTSPSource(this, uriSpec.get(), false, 0);
mRtspSource = new android::RTSPSource(this, uriSpec.get(),
mUserAgent.get(), false, 0);
}
// Connect to Rtsp Server.
mRtspSource->start();
@ -366,6 +368,14 @@ RtspController::Init(nsIURI *aURI)
mURI = aURI;
// Get User-Agent.
nsCOMPtr<nsIHttpProtocolHandler>
service(do_GetService(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "http", &rv));
rv = service->GetUserAgent(mUserAgent);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
return NS_OK;
}

View File

@ -40,6 +40,8 @@ private:
nsCOMPtr<nsIStreamingProtocolListener> mListener;
// ASCII encoded URL spec.
nsCString mSpec;
// UserAgent string.
nsCString mUserAgent;
// Indicate the connection state between the
// media streaming server and the Rtsp client.
State mState;

View File

@ -61,7 +61,6 @@ ARTSPConnection::ARTSPConnection(bool uidValid, uid_t uid)
mReceiveResponseEventPending(false),
mSocket(nullptr),
mNumSocketPollTimeoutRetries(0) {
MakeUserAgent(&mUserAgent);
}
ARTSPConnection::~ARTSPConnection() {
@ -200,6 +199,13 @@ bool ARTSPConnection::ParseURL(
return true;
}
void ARTSPConnection::MakeUserAgent(const char *userAgent) {
mUserAgent.clear();
mUserAgent.setTo("User-Agent: ");
mUserAgent.append(userAgent);
mUserAgent.append("\r\n");
}
static status_t MakeSocketBlocking(PRFileDesc *fd, bool blocking) {
// Check if socket is closed.
if (!fd) {
@ -1062,21 +1068,6 @@ void ARTSPConnection::addAuthentication(AString *request) {
request->insert(fragment, i + 2);
}
// static
void ARTSPConnection::MakeUserAgent(AString *userAgent) {
userAgent->clear();
userAgent->setTo("User-Agent: stagefright/1.1 (Linux;Android ");
#if (PROPERTY_VALUE_MAX < 8)
#error "PROPERTY_VALUE_MAX must be at least 8"
#endif
char value[PROPERTY_VALUE_MAX];
property_get("ro.build.version.release", value, "Unknown");
userAgent->append(value);
userAgent->append(")\r\n");
}
void ARTSPConnection::addUserAgent(AString *request) const {
// Find the boundary between headers and the body.
ssize_t i = request->find("\r\n\r\n");

View File

@ -48,6 +48,7 @@ struct ARTSPConnection : public AHandler {
static bool ParseURL(
const char *url, AString *host, uint16_t *port, AString *path,
AString *user, AString *pass);
void MakeUserAgent(const char *userAgent);
protected:
virtual ~ARTSPConnection();
@ -128,8 +129,6 @@ private:
static bool ParseSingleUnsignedLong(
const char *from, unsigned long *x);
static void MakeUserAgent(AString *userAgent);
void closeSocket();
DISALLOW_EVIL_CONSTRUCTORS(ARTSPConnection);

View File

@ -54,19 +54,6 @@ static int64_t kDefaultKeepAliveTimeoutUs = 60000000ll;
namespace android {
static void MakeUserAgentString(AString *s) {
s->setTo("stagefright/1.1 (Linux;Android ");
#if (PROPERTY_VALUE_MAX < 8)
#error "PROPERTY_VALUE_MAX must be at least 8"
#endif
char value[PROPERTY_VALUE_MAX];
property_get("ro.build.version.release", value, "Unknown");
s->append(value);
s->append(")");
}
static bool GetAttribute(const char *s, const char *key, AString *value) {
value->clear();
@ -110,9 +97,11 @@ struct RtspConnectionHandler : public AHandler {
RtspConnectionHandler(
const char *url,
const char *userAgent,
const sp<AMessage> &notify,
bool uidValid = false, uid_t uid = 0)
: mNotify(notify),
: mUserAgent(userAgent),
mNotify(notify),
mUIDValid(uidValid),
mUID(uid),
mNetLooper(new ALooper),
@ -161,6 +150,7 @@ struct RtspConnectionHandler : public AHandler {
}
mSessionHost = host;
mConn->MakeUserAgent(mUserAgent.c_str());
}
void connect() {
@ -272,7 +262,8 @@ struct RtspConnectionHandler : public AHandler {
buf->setRange(0, buf->size() + 8);
}
static void addSDES(PRFileDesc *s, const sp<ABuffer> &buffer) {
static void addSDES(PRFileDesc *s, const sp<ABuffer> &buffer,
const char *userAgent) {
PRNetAddr addr;
CHECK_EQ(PR_GetSockName(s, &addr), PR_SUCCESS);
@ -300,7 +291,7 @@ struct RtspConnectionHandler : public AHandler {
data[offset++] = 6; // TOOL
AString tool;
MakeUserAgentString(&tool);
tool.setTo(userAgent);
data[offset++] = tool.size();
@ -400,7 +391,7 @@ struct RtspConnectionHandler : public AHandler {
sp<ABuffer> buf = new ABuffer(65536);
buf->setRange(0, 0);
addRR(buf);
addSDES(rtpSocket, buf);
addSDES(rtpSocket, buf, mUserAgent.c_str());
addr.inet.port = PR_htons(rtpPort);
@ -1381,6 +1372,7 @@ private:
bool mCheckPendings;
};
AString mUserAgent;
sp<AMessage> mNotify;
bool mUIDValid;
uid_t mUID;

View File

@ -38,9 +38,11 @@ namespace android {
RTSPSource::RTSPSource(
nsIStreamingProtocolListener *aListener,
const char *url,
const char *userAgent,
bool uidValid,
uid_t uid)
: mURL(url),
mUserAgent(userAgent),
mUIDValid(uidValid),
mUID(uid),
mState(DISCONNECTED),
@ -80,7 +82,8 @@ void RTSPSource::start()
sp<AMessage> notify = new AMessage(kWhatNotify, mReflector->id());
mHandler = new RtspConnectionHandler(mURL.c_str(), notify, mUIDValid, mUID);
mHandler = new RtspConnectionHandler(mURL.c_str(), mUserAgent.c_str(),
notify, mUIDValid, mUID);
mLooper->registerHandler(mHandler);
CHECK_EQ(mState, (int)DISCONNECTED);

View File

@ -43,6 +43,7 @@ public:
RTSPSource(
nsIStreamingProtocolListener *aListener,
const char *url,
const char *userAgent,
bool uidValid = false,
uid_t uid = 0);
@ -109,6 +110,7 @@ private:
};
AString mURL;
AString mUserAgent;
bool mUIDValid;
uid_t mUID;
State mState;