diff --git a/libwvdrmengine/cdm/core/include/cdm_engine.h b/libwvdrmengine/cdm/core/include/cdm_engine.h
index 86ab9892..f6c3afec 100644
--- a/libwvdrmengine/cdm/core/include/cdm_engine.h
+++ b/libwvdrmengine/cdm/core/include/cdm_engine.h
@@ -106,8 +106,8 @@ class CdmEngine : public TimerHandler {
// Cancel all sessions
bool CancelSessions();
void CleanupProvisioningSession(const CdmSessionId& cdm_session_id);
- void ComposeJsonRequest(const std::string& message,
- CdmProvisioningRequest* request);
+ void ComposeJsonRequestAsQueryString(const std::string& message,
+ CdmProvisioningRequest* request);
bool ParseJsonResponse(const CdmProvisioningResponse& json_str,
const std::string& start_substr,
diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp
index c90f4372..fe517a13 100644
--- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp
+++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp
@@ -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.
* Apiary requires the base64 encoding to replace '+' with minus '-',
* 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=. All base64 '=' padding chars must be removed.
+ *
* 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,
CdmProvisioningRequest* request) {
@@ -351,11 +354,14 @@ void CdmEngine::ComposeJsonRequest(
std::vector message_vector(message.begin(), message.end());
std::string message_b64 = Base64SafeEncode(message_vector);
- request->assign("{'signedRequest':'");
- request->append(message_b64);
- request->append("'}");
-
- LOGD("json request:\r\n%s", request->c_str());
+ // removes trailing '=' padding characters;
+ // the encoded string can have at most 2 '=' padding chars, so start
+ // searching at the end minus four characters
+ size_t found_pos = message_b64.find("=", message_b64.size() - 4);
+ 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);
// converts request into JSON string
- ComposeJsonRequest(serialized_request, request);
+ ComposeJsonRequestAsQueryString(serialized_request, request);
return NO_ERROR;
}
diff --git a/libwvdrmengine/cdm/core/test/url_request.cpp b/libwvdrmengine/cdm/core/test/url_request.cpp
index 6d57f860..3512dbd3 100644
--- a/libwvdrmengine/cdm/core/test/url_request.cpp
+++ b/libwvdrmengine/cdm/core/test/url_request.cpp
@@ -103,27 +103,21 @@ bool UrlRequest::PostRequest(const std::string& data) {
return true;
}
-void UrlRequest::AppendData(const std::string& data) {
- request_.append(data);
- request_.append("\r\n"); // marks end of data
-}
-
-bool UrlRequest::PostCertRequest(const std::string& data) {
+bool UrlRequest::PostCertRequestInQueryString(const std::string& data) {
request_.assign("POST /");
request_.append(socket_.resource_path());
+ request_.append("&signedRequest=");
+ request_.append(data);
request_.append(" HTTP/1.1\r\n");
request_.append("User-Agent: Widevine CDM v1.0\r\n");
request_.append("Host: ");
request_.append(socket_.domain_name());
request_.append("\r\nAccept: */*");
request_.append("\r\nContent-Type: application/json");
- request_.append("\r\nContent-Length: ");
- request_.append(UintToString(data.size()));
+ request_.append("\r\nContent-Length: 0");
request_.append("\r\n"); // empty line to terminate header
request_.append("\r\n"); // terminates the request
- AppendData(data);
-
socket_.Write(request_.c_str(), request_.size());
return true;
}
diff --git a/libwvdrmengine/cdm/core/test/url_request.h b/libwvdrmengine/cdm/core/test/url_request.h
index 119264ca..0d9d4a1e 100644
--- a/libwvdrmengine/cdm/core/test/url_request.h
+++ b/libwvdrmengine/cdm/core/test/url_request.h
@@ -17,12 +17,11 @@ class UrlRequest {
~UrlRequest();
void AppendChunkToUpload(const std::string& data);
- void AppendData(const std::string& data);
int GetResponse(std::string& response);
int GetStatusCode(const std::string& response);
bool is_connected() const { return is_connected_; }
bool PostRequest(const std::string& data);
- bool PostCertRequest(const std::string& data);
+ bool PostCertRequestInQueryString(const std::string& data);
private:
static const unsigned int kHttpBufferSize = 4096;
diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp
index d28a7fda..73bc805d 100644
--- a/libwvdrmengine/cdm/test/request_license_test.cpp
+++ b/libwvdrmengine/cdm/test/request_license_test.cpp
@@ -115,14 +115,14 @@ class WvCdmRequestLicenseTest : public testing::Test {
// posts a request and extracts the drm message from the response
std::string GetCertRequestResponse(const std::string& server_url,
- int expected_response) {
+ int expected_response) {
UrlRequest url_request(server_url, g_port);
if (!url_request.is_connected()) {
return "";
}
- url_request.PostCertRequest(key_msg_);
+ url_request.PostCertRequestInQueryString(key_msg_);
std::string response;
int resp_bytes = url_request.GetResponse(response);
if (resp_bytes) {