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

Unify changes from ITS

parent 611ff673
Loading
Loading
Loading
Loading
+36 −31
Original line number Diff line number Diff line
@@ -8,8 +8,6 @@

#include "loggers.hh"

#include "converter.hh"

#include "LibItsHttp_TypesAndValues.hh"
#include "LibItsHttp_MessageBodyTypes.hh"
#include "LibItsHttp_XmlMessageBodyTypes.hh"
@@ -80,7 +78,7 @@ int http_codec::decode (const OCTETSTRING& data, LibItsHttp__TypesAndValues::Htt
      response.version__minor() = std::stoi(m[2].str().c_str());
      response.statuscode() = std::stoi(m[3].str().c_str());
      response.statustext() = CHARSTRING(m[4].str().c_str());
      LibItsHttp__TypesAndValues::HeaderLines headers;
      LibItsHttp__TypesAndValues::Headers headers;
      std::string content_type;
      decode_headers(decoding_buffer, headers, content_type);
      response.header() = headers;
@@ -105,7 +103,7 @@ int http_codec::decode (const OCTETSTRING& data, LibItsHttp__TypesAndValues::Htt
      request.uri() = CHARSTRING(m[2].str().c_str());
      request.version__major() = std::stoi(m[3].str().c_str());
      request.version__minor() = std::stoi(m[4].str().c_str());
      LibItsHttp__TypesAndValues::HeaderLines headers;
      LibItsHttp__TypesAndValues::Headers headers;
      std::string content_type;
      decode_headers(decoding_buffer, headers, content_type);
      request.header() = headers;
@@ -142,10 +140,10 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
  p_encoding_buffer.put_cs("\r\n");
  
  // Encode headers excepeted the Content-Length
  const LibItsHttp__TypesAndValues::HeaderLines& headers = p_request.header();
  const LibItsHttp__TypesAndValues::Headers& headers = p_request.header();
  std::string content_type;
  for (int i = 0; i < headers.size_of(); i++) {
    const LibItsHttp__TypesAndValues::HeaderLine& header = headers[i];
    const LibItsHttp__TypesAndValues::Header& header = headers[i];
    loggers::get_instance().log_msg("http_codec::encode_request: Processing header ", header.header__name());
    if (std::string(static_cast<const char*>(header.header__name())).compare("Content-Length") == 0) { // Skip it, processed later
      loggers::get_instance().log("http_codec::encode_request: Skip it");
@@ -203,12 +201,13 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
  p_encoding_buffer.put_cs("Content-Length: ");
  if (_ec.length != 0) {
    loggers::get_instance().log("http_codec::encode_request: Content-Length: %s", static_cast<const char*>(int2str(_ec.length + 2/*Stand for the last CRLF*/)));
    p_encoding_buffer.put_cs(static_cast<const char*>(int2str(_ec.length + 2/*Stand for the last CRLF*/)));
    p_encoding_buffer.put_cs(static_cast<const char*>(int2str(_ec.length)));
    _ec.is_content_length_present = 0x01;
  } else {
    p_encoding_buffer.put_cs("0");
    _ec.is_content_length_present = 0x00;
  }
  loggers::get_instance().log("http_codec::encode_request: Content-Length: %d - %x", _ec.length, _ec.is_content_length_present);
  p_encoding_buffer.put_cs("\r\n");

  // Add message body
@@ -216,7 +215,7 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
  if (_ec.is_content_length_present == 0x01) {
    loggers::get_instance().log_msg("http_codec::encode_request: Add body ", os);
    p_encoding_buffer.put_os(os);
    p_encoding_buffer.put_cs("\r\n");
    //p_encoding_buffer.put_cs("\r\n");
  }

  loggers::get_instance().log_to_hexa("<<< http_codec::encode_request: ", p_encoding_buffer);
@@ -239,11 +238,11 @@ int http_codec::encode_response (const LibItsHttp__TypesAndValues::Response& p_r
  }
  p_encoding_buffer.put_cs("\r\n");
  
  // Encode headers excepted the Content-Length
  const LibItsHttp__TypesAndValues::HeaderLines& headers = p_response.header();
  // Encode headers excepeted the Content-Length
  const LibItsHttp__TypesAndValues::Headers& headers = p_response.header();
  std::string content_type;
  for (int i = 0; i < headers.size_of(); i++) {
    const LibItsHttp__TypesAndValues::HeaderLine& header = headers[i];
    const LibItsHttp__TypesAndValues::Header& header = headers[i];
    loggers::get_instance().log_msg("http_codec::encode_response: Processing header ", header.header__name());
    p_encoding_buffer.put_cs(header.header__name());
    p_encoding_buffer.put_cs(": ");
@@ -256,7 +255,8 @@ int http_codec::encode_response (const LibItsHttp__TypesAndValues::Response& p_r
        if (v.size_of() > 0) {
          loggers::get_instance().log_msg("http_codec::encode_response: Processing value ", v[0]);
          if (std::string(static_cast<const char*>(header.header__name())).compare("Content-Type") == 0) { // Store it for HTTP body payload encoding
            int j = 1;
            loggers::get_instance().log("http_codec::encode_response: Storing Content-Type");
            int j = 0;
            while (j < v.size_of()) {
              content_type += v[j++];
            } // End of 'while' statement
@@ -266,7 +266,7 @@ int http_codec::encode_response (const LibItsHttp__TypesAndValues::Response& p_r
          while (j < v.size_of()) {
                p_encoding_buffer.put_cs(", ");
                loggers::get_instance().log_msg("http_codec::encode_response: Processing value ", v[j]);
                p_encoding_buffer.put_cs(v[j]);
                p_encoding_buffer.put_cs(v[j++]);
                j += 1;
          } // End of 'while' statement
        }
@@ -288,34 +288,39 @@ int http_codec::encode_response (const LibItsHttp__TypesAndValues::Response& p_r
      _ec.length = os.lengthof();
      _ec.is_content_length_present = 0x01;
    }
    loggers::get_instance().log("http_codec::encode_request: length=%d", _ec.length);
    loggers::get_instance().log("http_codec::encode_response: length=%d", _ec.length);
  } else {
    loggers::get_instance().log("http_codec::encode_request: HTTP body field not present");
    loggers::get_instance().log("http_codec::encode_response: HTTP body field not present");
    _ec.length = 0;
    _ec.is_content_length_present = 0x00;
  }

  // Encode Content-Length header
  p_encoding_buffer.put_cs("Content-Length: ");
  if (_ec.length != 0) {
    p_encoding_buffer.put_cs(int2str(_ec.length + 2/*Stand for the last CRLF*/));
    loggers::get_instance().log("http_codec::encode_request: Content-Length: %s", static_cast<const char*>(int2str(_ec.length + 2/*Stand for the last CRLF*/)));
    p_encoding_buffer.put_cs(static_cast<const char*>(int2str(_ec.length)));
    _ec.is_content_length_present = 0x01;
  } else {
    p_encoding_buffer.put_cs("0");
    _ec.is_content_length_present = 0x00;
  }
  loggers::get_instance().log("http_codec::encode_response: Content-Length: %d - %x", _ec.length, _ec.is_content_length_present);
  loggers::get_instance().log("http_codec::encode_request: Content-Length: %d - %x", _ec.length, _ec.is_content_length_present);
  p_encoding_buffer.put_cs("\r\n");

  // Add message body
  p_encoding_buffer.put_cs("\r\n");
  if (_ec.length != 0) {
  if (_ec.is_content_length_present == 0x01) {
    loggers::get_instance().log_msg("http_codec::encode_request: Add body ", os);
    p_encoding_buffer.put_os(os);
    p_encoding_buffer.put_cs("\r\n");
    //    p_encoding_buffer.put_cs("\r\n");
  }
  
  loggers::get_instance().log_to_hexa("<<< http_codec::encode_response: ", p_encoding_buffer);
  return 0;
}

int http_codec::decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAndValues::HeaderLines& headers, std::string& p_content_type) {
int http_codec::decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAndValues::Headers& headers, std::string& p_content_type) {
  loggers::get_instance().log(">>> http_codec::decode_headers");
  loggers::get_instance().log_to_hexa("http_codec::decode_headers", decoding_buffer);

@@ -325,7 +330,7 @@ int http_codec::decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAn
    switch(get_line(decoding_buffer, cstr, true)) {
      case 0: {
          loggers::get_instance().log_msg("http_codec::decode_headers: ", cstr);
          LibItsHttp__TypesAndValues::HeaderLine header;
          LibItsHttp__TypesAndValues::Header header;
          if (decode_header(cstr, header) == -1) {
            loggers::get_instance().warning("http_codec::decode_headers: Failed to decode header %s", static_cast<const char*>(cstr));
            return -1;
@@ -351,7 +356,7 @@ int http_codec::decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAn
  } // End of 'while' statement
}

int http_codec::decode_header(CHARSTRING& header_line, LibItsHttp__TypesAndValues::HeaderLine& header) {
int http_codec::decode_header(CHARSTRING& header_line, LibItsHttp__TypesAndValues::Header& header) {
  loggers::get_instance().log_msg(">>> http_codec::decode_header", header_line);

  try {
@@ -504,7 +509,7 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
  OCTETSTRING s(decoding_buffer.get_len() - decoding_buffer.get_pos(), decoding_buffer.get_data() + decoding_buffer.get_pos());
  loggers::get_instance().log_msg("http_codec::decode_body: raw body=", s);

  // Align the payload length with the specified Content-Length value
  // Align the payload length with the specified Content-Lenght value
  loggers::get_instance().log("http_codec::decode_body: _dc.length=%d - body length=%d", _dc.length, s.lengthof());
  OCTETSTRING body;
  if (_dc.length != 0) {
@@ -515,10 +520,11 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
      body = OCTETSTRING(_dc.length, p);
    }
  } else {
    loggers::get_instance().warning("http_codec::decode_body: No Content-Length header, process all remaining bytes");
    loggers::get_instance().warning("http_codec::decode_body: No Conten-Length header, process all remaining bytes");
    body = s;
  }
  loggers::get_instance().log_msg("http_codec::decode_body: Aligned body=", body);
  loggers::get_instance().log("http_codec::decode_body: body length=%d", body.lengthof());
  // Remove CRLF if any
  int counter = 0;
  if ((body[body.lengthof() - 1].get_octet() == 0x0d) || (body[body.lengthof() - 1].get_octet() == 0x0a)) {
@@ -528,10 +534,9 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
    }
  }
  loggers::get_instance().log("http_codec::decode_body: counter=%d", counter);
  loggers::get_instance().log("http_codec::decode_body: body length=%d", body.lengthof());
  body = OCTETSTRING(body.lengthof() - counter, static_cast<const unsigned char*>(body));
  if (_dc.chunked){
    counter = 0;
    int counter = 0;
    int prev = 0;
    OCTETSTRING os(0, nullptr);
    do {
@@ -569,8 +574,8 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
      }
    } while (counter < body.lengthof()); // Process next chunk if any
    body = os;
  }
    loggers::get_instance().log_msg("http_codec::decode_body: Finalised body=", body);
  }
  // Check if HTTP message body contains binary characters
  for (int i = 0; i < body.lengthof(); i++) {
    unsigned char c = body[i].get_octet();
@@ -688,7 +693,7 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
      LibItsHttp__MessageBodyTypes::HtmlBody html_body;
      message_body.html__body() = CHARSTRING(body.lengthof(), (char*)static_cast<const unsigned char*>(body));
    } else {
      loggers::get_instance().log("http_codec::decode_body: Use textBody as default");
      loggers::get_instance().log("http_codec::decode_body: Use textBdy as default");
      LibItsHttp__MessageBodyTypes::TextBody text_body;
      message_body.text__body() = CHARSTRING(body.lengthof(), (char*)static_cast<const unsigned char*>(body));
    }
+67 −67
Original line number Diff line number Diff line
@@ -14,8 +14,8 @@ namespace LibItsHttp__TypesAndValues {
  class HttpMessage;
  class Request;
  class Response;
  class HeaderLines;
  class HeaderLine;
  class Headers;
  class Header;
}
namespace LibItsHttp__MessageBodyTypes {
  class HttpMessageBody;
@@ -59,8 +59,8 @@ private:
  int encode_response (const LibItsHttp__TypesAndValues::Response& p_response, TTCN_Buffer& p_encoding_buffer);
  int encode_body(const LibItsHttp__MessageBodyTypes::HttpMessageBody& p_message_body, OCTETSTRING& p_encoding_buffer, const std::string& p_content_type);

  int decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAndValues::HeaderLines& headers, std::string& p_content_type);
  int decode_header(CHARSTRING& header_line, LibItsHttp__TypesAndValues::HeaderLine& header);
  int decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAndValues::Headers& headers, std::string& p_content_type);
  int decode_header(CHARSTRING& header_line, LibItsHttp__TypesAndValues::Header& header);
  int decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBodyTypes::HttpMessageBody& message_body, const std::string& p_content_type);
  int get_line(TTCN_Buffer& buffer, CHARSTRING& to, const bool concatenate_header_lines = false);

+75 −0
Original line number Diff line number Diff line
#!/bin/bash

# Turn on debug mode
#set -vx
#set -e

# Colors and Prompt
#export PS1="\w\$ "
#export PS1="\D{%Y-%m-%d %H:%M:%S} \w\n\$ "

export EDITOR=emacs
set -o emacs

# Home working directories
export HOME_FRAMEWORKS=${HOME}/frameworks
export HOME_LIB=${HOME}/lib
export HOME_BIN=${HOME}/bin
export HOME_ETC=${HOME}/etc
export HOME_TMP=${HOME}/tmp
export HOME_DOCS=${HOME}/docs

# Home common include directory
export HOME_INC=${HOME}/include

# Update PATH environment variable
export PATH=${HOME_BIN}:${PATH}

# Update LD_LIBRARY_PATH environment variable
if [ -z "${LD_LIBRARY_PATH}" ]
then
    export LD_LIBRARY_PATH=${HOME_LIB}:/usr/local/lib:${HOME}/dev/etsi_its/lib
else 
    export LD_LIBRARY_PATH=${HOME_LIB}:/usr/local/lib:${HOME}/dev/etsi_its/lib:${LD_LIBRARY_PATH}
fi


# Add JAVA support
#export JAVA_VERSION=1.8.0_92
#export JAVA_JDK=jdk${JAVA_VERSION}
#if [ -d "${HOME_FRAMEWORKS}/${JAVA_JDK}" ]
#then
#    export JAVA_HOME=${HOME_FRAMEWORKS}/${JAVA_JDK}/bin
#else
#    unset JAVA_VERSION
#    unset JAVA_JDK
#fi

# Add TITAN support
export TOP=${HOME_FRAMEWORKS}/titan/titan.core
export TTCN3_DIR=${TOP}/Install
if [ -d ${TTCN3_DIR} ]
then
    export TTCN3_BROWSER=mozilla
    export PATH=${TTCN3_DIR}/bin:${PATH}
    export LD_LIBRARY_PATH=${TTCN3_DIR}/lib:${LD_LIBRARY_PATH}
    export MANPATH=${TTCN3_DIR}/man:${MANPATH}
    export TTCN3_LICENSE_FILE=${TTCN3_DIR}/etc/license/license.dat
    export PATH_DEV_TTCN=${HOME}/dev/ttcn3
    # ITS support
    export PATH_DEV_ITS=${HOME}/dev/etsi_its
    # Emergency Communication support
    export PATH_DEV_EMCOM=${HOME}/dev/etsi_emcom
    # Mobile-Edge Computing support
    export PATH_DEV_MEC=${HOME}/dev/etsi_mec
    # Validation folder
    export VALIDATION_DIR=${HOME}
fi

export BROWSER=netsurf

export OPENSSL_DIR=/usr/local

export LSAN_OPTIONS=verbosity=1:log_threads=1

+2 −2
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ find .. -type f -name "*.bak" -exec rm {} \;
find .. -type f -name "*.log" -exec rm {} \;

# Build JSON files if any and put them in objs directory
REFERENCES="LibCommon LibHttp LibMec LibMec/LocationAPI LibMec/RnisAPI LibMec/UEidentityAPI LibMec/BwManagementAPI"
REFERENCES="LibCommon LibHttp LibMec LibMec/LocationAPI LibMec/UEidentityAPI LibMec/RnisAPI LibMec/BwManagementAPI LibMec/Ams LibMec/AppEna LibMec/AppLCM LibMec/Grant LibMec/FixedAccessInformationAPI LibMec/MeoPkgm LibMec/MepmPkgm LibMec/UEAppInterfaceAPI LibMec/UEidentityAPI"
for i in ${REFERENCES}
do
    # TTCN code
+2 −2
Original line number Diff line number Diff line
@@ -158,7 +158,7 @@ done
echo 'Update TTCN-3 files'
TTCN_3_ORG_PATH=${SRC_MEC_PATH}/ttcn
TTCN_3_DST_PATH=${PATH_DEV_MEC}/src
TTCN_3_ATS_LIST='AtsNg112 LibMec LibMec/LocationAPI LibMec/UEidentityAPI LibMec/RnisAPI LibMec/BwManagementAPI LibHttp LibCommon'
TTCN_3_ATS_LIST='AtsMec LibMec LibMec/LocationAPI LibMec/UEidentityAPI LibMec/RnisAPI LibMec/BwManagementAPI LibHttp LibCommon'
for i in ${TTCN_3_ATS_LIST}
do
    # TTCN-3 files
@@ -208,7 +208,7 @@ do
    fi
done

TTCN_3_LIB_LIST='TestCodec'
TTCN_3_LIB_LIST='AtsMec'
for i in ${TTCN_3_LIB_LIST}
do
    LIST_TTCN_FILES=`find ${TTCN_3_ORG_PATH}/$i -name "*.ttcn" -type f`
Loading