[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/andschar/rstudio/master/src/cpp/core/SocketRpc.cpp [Back]  [Original]

/*
 * SocketRpc.cpp
 *
 * Copyright (C) 2017 by RStudio, Inc.
 *
 * Unless you have received this program directly from RStudio pursuant
 * to the terms of a commercial license agreement with RStudio, then
 * this program is licensed to you under the terms of version 3 of the
 * GNU Affero General Public License. This program is distributed WITHOUT
 * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
 * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
 *
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 

namespace rstudio {
namespace core {
namespace socket_rpc {

namespace {

std::string s_sessionSharedSecret;

} // anonymous namespace


Error invokeRpc(const FilePath& socketPath,
                const std::string& endpoint,
                const json::Object& request,
                json::Value *pResult)
{
   // serialize the payload
   std::ostringstream oss;
   core::json::write(request, oss);

   // form the request 
   core::http::Request req;
   req.setMethod("POST");
   req.setUri(endpoint);
   req.setHeader("Connection", "close");
   req.setHeader(kServerRpcSecretHeader, s_sessionSharedSecret);
   req.setBody(oss.str());

   core::http::Response resp;
   core::http::sendRequest(socketPath, req, &resp);

   if (resp.statusCode() != core::http::status::Ok)
   {
      LOG_WARNING_MESSAGE("Server RPC failed: " + endpoint +
                          safe_convert::numberToString(resp.statusCode()) +
                          "\n" + resp.statusMessage());
      return Error(json::errc::ExecutionError, ERROR_LOCATION);
   }
   else if (resp.body().empty())
   {
      // empty value from server doesn't imply failure, just that there's
      // nothing for us to read
      *pResult = json::Value();
      return Success();
   }
   else if (!json::parse(resp.body(), pResult))
   {
      LOG_WARNING_MESSAGE("Received unparseable result from rserver RPC:\n" +
            endpoint + "\n" +
            resp.body());
      return Error(json::errc::ParseError, ERROR_LOCATION);
   }

   return Success();
}

Error initialize()
{
   // extract shared secret
   s_sessionSharedSecret = core::system::getenv(kServerRpcSecretEnvVar);
   core::system::unsetenv(kServerRpcSecretEnvVar);

   return Success();
}

Error initializeSecret(const std::string& rpcSecret)
{
   s_sessionSharedSecret = rpcSecret;

   return Success();
}

} // namespace socket_rpc
} // namespace core
} // namespace rstudio


Web Proxy Viewer  |  New URL  |  Original Page