Commit d33db635 authored by Yann Garcia's avatar Yann Garcia
Browse files
parents 8f42ae0d b1735978
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ public: //! \publicsection
  static const std::string& uri;          //! HTTP URI value. Default: /
  static const std::string& host;         //! HTTP Host value. Default: 127.0.0.1
  static const std::string& content_type; //! HTTP Content-type value. Default: application/text
  static const std::string& accept;       //! HTTP Accept value. Default: */*
  static const std::string& headers;      //! HTTP headers list to add in the request. ';' will be replaced by '\r\n'. Default: omitted. E.g. "X-M2M-RI:8787;X-M2M-Origin:CAdmin;X-M2M-RVI:5"

  static const std::string& codecs;             //! List of codecs to use for HTTP application layers
+5 −3
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ const std::string& params::method = std::string("method");
const std::string& params::uri                = std::string("uri");
const std::string& params::host               = std::string("host");
const std::string& params::content_type       = std::string("content_type");
const std::string& params::accept             = std::string("accept");
const std::string& params::headers            = std::string("headers");

const std::string& params::codecs             = std::string("codecs");
@@ -84,7 +85,8 @@ void params::convert(params &p_param, const std::string p_parameters) {
}

void params::add(const params &p_params, bool p_overwrite) {
  loggers::get_instance().log(">>> params::add");
  loggers::get_instance().log(">>> params::add: size=%d", size());
  loggers::get_instance().log(">>> params::add: p_params.size=%d", p_params.size());
  p_params.log();
  loggers::get_instance().log("params::add: current params before add:");
  this->log();
@@ -107,7 +109,7 @@ void params::add(const params &p_params, bool p_overwrite) {
}

void params::log() const {
  loggers::get_instance().log("params::log");
  loggers::get_instance().log("params::log: size=%d", size());
  if (size() == 0) {
    loggers::get_instance().log("\tEmpty");
  } else {
@@ -118,7 +120,7 @@ void params::log() const {
}

void params::log() {
  loggers::get_instance().log("params::log");
  loggers::get_instance().log("params::log: size=%d", size());
  if (size() == 0) {
    loggers::get_instance().log("\tEmpty");
  } else {
+67 −36
Original line number Diff line number Diff line
@@ -33,6 +33,10 @@ http_layer::http_layer(const std::string& p_type, const std::string& param)
  if (it == _params.cend()) {
    _params[params::content_type] = "application/text";
  }
  it = _params.find(params::accept);
  if (it == _params.cend()) {
    _params[params::accept] = "*/*";
  }
  it = _params.find(params::headers);
  if (it != _params.cend()) {
    // Change ';' into '\r\n'
@@ -113,14 +117,26 @@ void http_layer::send_data(OCTETSTRING &p_data, params &params) {
      buffer.put_cs(_params[params::content_type].c_str());
    }
    buffer.put_cs("\r\n");
    buffer.put_cs("Accept: ");
    if ((it = params.find(params::accept)) != params.cend()) {
      buffer.put_cs(params[params::accept].c_str());
    } else {
      buffer.put_cs(_params[params::accept].c_str());
    }
    buffer.put_cs("\r\n");
    if ((it = params.find(params::headers)) != _params.cend()) {
      loggers::get_instance().log("http_layer::send_data: params[params::headers]='%s'", params[params::headers].c_str());
      if (params[params::headers].length() != 0) {
        buffer.put_cs(params[params::headers].c_str());
        buffer.put_cs("\r\n");
      }
    } else if ((it = _params.find(params::headers)) != _params.cend()) {
      loggers::get_instance().log("http_layer::send_data: _params[params::headers]='%s'", _params[params::headers].c_str());
      if (_params[params::headers].length() != 0) {
        buffer.put_cs(_params[params::headers].c_str());
    }
        buffer.put_cs("\r\n");
      }
    }
    buffer.put_cs("Connection: keep-alive");
    buffer.put_cs("\r\n");    
    buffer.put_cs("Cache-Control: no-cache"); // FIXME FSCOM Use params parameter.
@@ -137,14 +153,14 @@ void http_layer::send_data(OCTETSTRING &p_data, params &params) {
    buffer.put_cs("\r\n");
    if (p_data.lengthof() != 0) {
      buffer.put_cs("Content-length: ");
      buffer.put_cs(static_cast<const char *>(int2str(p_data.lengthof() + 2 /*Stand for the last CRLF*/)));
      buffer.put_cs(static_cast<const char *>(int2str(p_data.lengthof()/* + 2 Stand for the last CRLF*/)));
      buffer.put_cs("\r\n\r\n");
      buffer.put_os(p_data);
    } else {
      // Omit Content-length header for empty body
      buffer.put_cs("\r\n");
    }
    buffer.put_cs("\r\n");
    //buffer.put_cs("\r\n"); // FSCOM Remove the last CRLF to avoid adding 2 bytes to the Content-length header
    p_data = OCTETSTRING(buffer.get_len(), buffer.get_data());
  }

@@ -172,7 +188,7 @@ void http_layer::receive_data(OCTETSTRING &p_data, params &params) {

  if (_device_mode) {
    loggers::get_instance().log("http_layer::receive_data: Device mode set");
    OCTETSTRING os;
    OCTETSTRING os(0, nullptr);
    if (http_message.ischosen(LibHttp__TypesAndValues::HttpMessage::ALT_response)) {
      if (http_message.response().body().ispresent()) {
        LibHttp__MessageBodyTypes::HttpMessageBody &body =
@@ -181,18 +197,18 @@ void http_layer::receive_data(OCTETSTRING &p_data, params &params) {
          LibHttp__BinaryMessageBodyTypes::BinaryBody &binary = body.binary__body();
          if (binary.ischosen(LibHttp__BinaryMessageBodyTypes::BinaryBody::ALT_raw)) {
            os = binary.raw();
            params.insert(std::pair<std::string, std::string>("serialization", "binary"));
            params.insert(std::pair<std::string, std::string>(params::serialization, "binary"));
          } else {
            loggers::get_instance().warning("http_layer::receive_data: A raw binary payload is expected");
          }
        } else if (body.ischosen(LibHttp__MessageBodyTypes::HttpMessageBody::ALT_html__body)) {
          os = char2oct(body.html__body());
          params.insert(std::pair<std::string, std::string>("serialization", "html"));
          params.insert(std::pair<std::string, std::string>(params::serialization, "html"));
        } else if (body.ischosen(LibHttp__MessageBodyTypes::HttpMessageBody::ALT_json__body)) {
          LibHttp__JsonMessageBodyTypes::JsonBody &json = body.json__body();
          if (json.ischosen(LibHttp__JsonMessageBodyTypes::JsonBody::ALT_raw)) {
            os = unichar2oct(json.raw());
            params.insert(std::pair<std::string, std::string>("serialization", "json"));
            params.insert(std::pair<std::string, std::string>(params::serialization, "json"));
          } else {
            loggers::get_instance().warning("http_layer::receive_data: A raw JSON payload is expected");
          }
@@ -200,13 +216,17 @@ void http_layer::receive_data(OCTETSTRING &p_data, params &params) {
          LibHttp__XmlMessageBodyTypes::XmlBodyMsg &xml = body.xml__body().msg();
          if (xml.ischosen(LibHttp__XmlMessageBodyTypes::XmlBodyMsg::ALT_raw)) {
            os = unichar2oct(xml.raw());
            params.insert(std::pair<std::string, std::string>("serialization", "xml"));
            params.insert(std::pair<std::string, std::string>(params::serialization, "xml"));
          } else {
            loggers::get_instance().warning("http_layer::receive_data: A raw XML payload is expected");
          }
        } else if (body.ischosen(LibHttp__MessageBodyTypes::HttpMessageBody::ALT_text__body)) {
          os = char2oct(body.text__body());
          params.insert(std::pair<std::string, std::string>("serialization", "txt"));
          params.insert(std::pair<std::string, std::string>(params::serialization, "txt"));
        }
      } else {
        loggers::get_instance().warning("http_layer::receive_data: No body present");
        http_message.response().body().set_to_omit();
      }
      // Add additional message information
      params.insert(std::pair<std::string, std::string>(params::type, "response"));
@@ -221,6 +241,20 @@ void http_layer::receive_data(OCTETSTRING &p_data, params &params) {
            params.insert(std::pair<std::string, std::string>(static_cast<const char*>(http_message.response().header()[i].header__name()), ""));
          } else if (v.lengthof() == 1) {
            params.insert(std::pair<std::string, std::string>(static_cast<const char*>(http_message.response().header()[i].header__name()), v[0]));
            std::string h = static_cast<const char*>(http_message.response().header()[i].header__name());
            if ((os.lengthof() == 0) && ((h.compare("Content-Type") == 0) || (h.compare("Content-type") == 0) || (h.compare("content-type") == 0))) { // Force the serialization parameter to be set according to the Content-Type header
              std::string s = std::string(static_cast<const char*>(v[0]));
              if (s.find("json") != std::string::npos) {
                loggers::get_instance().warning("http_layer::receive_data: Force serialization to json");
                params[params::serialization] = "json";
              } else if (s.find("cbor") != std::string::npos) { 
                loggers::get_instance().warning("http_layer::receive_data: Force serialization to cbor");
                params[params::serialization] = "cbor";
              } else if (s.find("xml") != std::string::npos) { 
                loggers::get_instance().warning("http_layer::receive_data: Force serialization to xml");
                params[params::serialization] = "xml";
              }
            }
          } else {
            std::ostringstream oss;
            int j = 0;
@@ -233,9 +267,6 @@ void http_layer::receive_data(OCTETSTRING &p_data, params &params) {
        }
      } // End of 'for' statement
      receive_to_all_layers(os, params);
      } else {
        loggers::get_instance().warning("http_layer::receive_data: No body present");
      }
    } else {
      loggers::get_instance().warning("http_layer::receive_data: An HTTP response is expected");
    }