Sends signed provisioning request as query string instead of payload.

Bug: 8790775

Merge of https://widevine-internal-review.googlesource.com/#/c/5381/
from the Widevine CDM repository.

Change-Id: I749303eee8162f37982f6dd5d83b6cf254b96847
This commit is contained in:
Jeff Tinker
2013-05-06 16:28:32 -07:00
parent 779b887bb3
commit d0f1784615
5 changed files with 26 additions and 27 deletions

View File

@@ -106,8 +106,8 @@ class CdmEngine : public TimerHandler {
// Cancel all sessions // Cancel all sessions
bool CancelSessions(); bool CancelSessions();
void CleanupProvisioningSession(const CdmSessionId& cdm_session_id); void CleanupProvisioningSession(const CdmSessionId& cdm_session_id);
void ComposeJsonRequest(const std::string& message, void ComposeJsonRequestAsQueryString(const std::string& message,
CdmProvisioningRequest* request); CdmProvisioningRequest* request);
bool ParseJsonResponse(const CdmProvisioningResponse& json_str, bool ParseJsonResponse(const CdmProvisioningResponse& json_str,
const std::string& start_substr, const std::string& start_substr,

View File

@@ -333,17 +333,20 @@ void CdmEngine::CleanupProvisioningSession(const CdmSessionId& cdm_session_id) {
} }
/* /*
* This function converts SignedProvisioningRequest into base64 format. * This function converts SignedProvisioningRequest into base64 string.
* It then wraps it in JSON format expected by the Apiary frontend. * It then wraps it in JSON format expected by the Apiary frontend.
* Apiary requires the base64 encoding to replace '+' with minus '-', * Apiary requires the base64 encoding to replace '+' with minus '-',
* and '/' with underscore '_'; opposite to stubby's. * and '/' with underscore '_'; opposite to stubby's.
* *
* Returns the JSON formated string in *request. * Returns the JSON formated string in *request. The JSON string will be
* appended as a query parameter, i.e. signedRequest=<base 64 encoded
* SignedProvisioningRequest>. All base64 '=' padding chars must be removed.
*
* The JSON formated request takes the following format: * The JSON formated request takes the following format:
* *
* {'signedRequest':'base64 encoded message'} * base64 encoded message
*/ */
void CdmEngine::ComposeJsonRequest( void CdmEngine::ComposeJsonRequestAsQueryString(
const std::string& message, const std::string& message,
CdmProvisioningRequest* request) { CdmProvisioningRequest* request) {
@@ -351,11 +354,14 @@ void CdmEngine::ComposeJsonRequest(
std::vector<uint8_t> message_vector(message.begin(), message.end()); std::vector<uint8_t> message_vector(message.begin(), message.end());
std::string message_b64 = Base64SafeEncode(message_vector); std::string message_b64 = Base64SafeEncode(message_vector);
request->assign("{'signedRequest':'"); // removes trailing '=' padding characters;
request->append(message_b64); // the encoded string can have at most 2 '=' padding chars, so start
request->append("'}"); // searching at the end minus four characters
size_t found_pos = message_b64.find("=", message_b64.size() - 4);
LOGD("json request:\r\n%s", request->c_str()); if (std::string::npos != found_pos) {
message_b64.resize(found_pos);
}
request->assign(message_b64);
} }
/* /*
@@ -467,7 +473,7 @@ CdmResponseType CdmEngine::GetProvisioningRequest(
signed_provisioning_msg.SerializeToString(&serialized_request); signed_provisioning_msg.SerializeToString(&serialized_request);
// converts request into JSON string // converts request into JSON string
ComposeJsonRequest(serialized_request, request); ComposeJsonRequestAsQueryString(serialized_request, request);
return NO_ERROR; return NO_ERROR;
} }

View File

@@ -103,27 +103,21 @@ bool UrlRequest::PostRequest(const std::string& data) {
return true; return true;
} }
void UrlRequest::AppendData(const std::string& data) { bool UrlRequest::PostCertRequestInQueryString(const std::string& data) {
request_.append(data);
request_.append("\r\n"); // marks end of data
}
bool UrlRequest::PostCertRequest(const std::string& data) {
request_.assign("POST /"); request_.assign("POST /");
request_.append(socket_.resource_path()); request_.append(socket_.resource_path());
request_.append("&signedRequest=");
request_.append(data);
request_.append(" HTTP/1.1\r\n"); request_.append(" HTTP/1.1\r\n");
request_.append("User-Agent: Widevine CDM v1.0\r\n"); request_.append("User-Agent: Widevine CDM v1.0\r\n");
request_.append("Host: "); request_.append("Host: ");
request_.append(socket_.domain_name()); request_.append(socket_.domain_name());
request_.append("\r\nAccept: */*"); request_.append("\r\nAccept: */*");
request_.append("\r\nContent-Type: application/json"); request_.append("\r\nContent-Type: application/json");
request_.append("\r\nContent-Length: "); request_.append("\r\nContent-Length: 0");
request_.append(UintToString(data.size()));
request_.append("\r\n"); // empty line to terminate header request_.append("\r\n"); // empty line to terminate header
request_.append("\r\n"); // terminates the request request_.append("\r\n"); // terminates the request
AppendData(data);
socket_.Write(request_.c_str(), request_.size()); socket_.Write(request_.c_str(), request_.size());
return true; return true;
} }

View File

@@ -17,12 +17,11 @@ class UrlRequest {
~UrlRequest(); ~UrlRequest();
void AppendChunkToUpload(const std::string& data); void AppendChunkToUpload(const std::string& data);
void AppendData(const std::string& data);
int GetResponse(std::string& response); int GetResponse(std::string& response);
int GetStatusCode(const std::string& response); int GetStatusCode(const std::string& response);
bool is_connected() const { return is_connected_; } bool is_connected() const { return is_connected_; }
bool PostRequest(const std::string& data); bool PostRequest(const std::string& data);
bool PostCertRequest(const std::string& data); bool PostCertRequestInQueryString(const std::string& data);
private: private:
static const unsigned int kHttpBufferSize = 4096; static const unsigned int kHttpBufferSize = 4096;

View File

@@ -115,14 +115,14 @@ class WvCdmRequestLicenseTest : public testing::Test {
// posts a request and extracts the drm message from the response // posts a request and extracts the drm message from the response
std::string GetCertRequestResponse(const std::string& server_url, std::string GetCertRequestResponse(const std::string& server_url,
int expected_response) { int expected_response) {
UrlRequest url_request(server_url, g_port); UrlRequest url_request(server_url, g_port);
if (!url_request.is_connected()) { if (!url_request.is_connected()) {
return ""; return "";
} }
url_request.PostCertRequest(key_msg_); url_request.PostCertRequestInQueryString(key_msg_);
std::string response; std::string response;
int resp_bytes = url_request.GetResponse(response); int resp_bytes = url_request.GetResponse(response);
if (resp_bytes) { if (resp_bytes) {