Commit a0ca267b authored by Yann Garcia's avatar Yann Garcia
Browse files

Add Accept header; Enhance Content-Type header

parent 4622dc75
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 {
+26 −10
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());
  }

@@ -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,13 @@ 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"));
        }
        // Add additional message information
        params.insert(std::pair<std::string, std::string>(params::type, "response"));