From a7398701907901dab1af3b415741a526971af4b1 Mon Sep 17 00:00:00 2001 From: Angelo Mantellini Date: Tue, 12 Mar 2019 16:16:38 +0100 Subject: [HICN-109] Adding higet application Change-Id: If558eb5da804fde2ab331a463bf9c9c11cc471e9 Signed-off-by: Angelo Mantellini --- apps/CMakeLists.txt | 58 ++++++++++++++ apps/cmake/Modules/Packaging.cmake | 28 +++++++ apps/src/higet.cc | 156 +++++++++++++++++++++++++++++++++++++ 3 files changed, 242 insertions(+) create mode 100644 apps/CMakeLists.txt create mode 100644 apps/cmake/Modules/Packaging.cmake create mode 100755 apps/src/higet.cc (limited to 'apps') diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt new file mode 100644 index 000000000..0f7a5c289 --- /dev/null +++ b/apps/CMakeLists.txt @@ -0,0 +1,58 @@ +# Copyright (c) 2017-2019 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required(VERSION 3.5 FATAL_ERROR) +set(CMAKE_CXX_STANDARD 14) + +project(apps) + +set(CMAKE_MODULE_PATH + ${CMAKE_MODULE_PATH} + "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" +) + +include(BuildMacros) +include(WindowsMacros) + +if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + find_package(Libtransport REQUIRED) + set(HICN_APPS hicn-apps) +else() + set(LIBTRANSPORT_LIBRARIES ${LIBTRANSPORT_SHARED}) +endif() + +include(Packaging) + +set (COMPILER_DEFINITIONS "") + +list(APPEND APPS_SRC + src/higet.cc +) + +if (WIN32) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4200 /wd4996") +endif () + +foreach(app ${APPS_SRC}) + get_filename_component(_app_name ${app} NAME) + string(REGEX REPLACE ".cc" "" app_name ${_app_name}) + + build_executable(${app_name} + SOURCES ${app} + LINK_LIBRARIES ${LIBTRANSPORT_LIBRARIES} ${WSOCK32_LIBRARY} ${WS2_32_LIBRARY} + DEPENDS ${LIBTRANSPORT} + COMPONENT ${HICN_APPS} + DEFINITIONS ${COMPILER_DEFINITIONS} + ) +endforeach() diff --git a/apps/cmake/Modules/Packaging.cmake b/apps/cmake/Modules/Packaging.cmake new file mode 100644 index 000000000..6a6e34777 --- /dev/null +++ b/apps/cmake/Modules/Packaging.cmake @@ -0,0 +1,28 @@ +# Copyright (c) 2017-2019 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(${HICN_APPS}_DESCRIPTION +"Hicn apps provide the higet application, \ +useful for testing and debugging within a hicn network." + CACHE STRING "Description for deb/rpm package." +) + +set(${HICN_APPS}_DEB_DEPENDENCIES + "lib${LIBTRANSPORT} (>= stable_version)" + CACHE STRING "Dependencies for deb/rpm package." +) + +set(${HICN_APPS}_RPM_DEPENDENCIES + "lib${LIBTRANSPORT} >= stable_version" + CACHE STRING "Dependencies for deb/rpm package." +) \ No newline at end of file diff --git a/apps/src/higet.cc b/apps/src/higet.cc new file mode 100755 index 000000000..78891de98 --- /dev/null +++ b/apps/src/higet.cc @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +typedef std::chrono::time_point Time; +typedef std::chrono::milliseconds TimeDuration; + +Time t1; + +#define DEFAULT_BETA 0.99 +#define DEFAULT_GAMMA 0.07 + +namespace hicnet { + +namespace http { + +typedef struct { + std::string file_name; + bool print_headers; + std::string producer_certificate; +} Configuration; + +void processResponse(Configuration &conf, transport::http::HTTPResponse &&response) { + + auto &payload = response.getPayload(); + + if (conf.file_name != "-") { + std::cerr << "Saving to: " << conf.file_name << " " << payload.size() << "kB" << std::endl; + } + + Time t3 = std::chrono::system_clock::now(); + + std::streambuf *buf; + std::ofstream of; + + if (conf.file_name != "-") { + of.open(conf.file_name, std::ofstream::binary); + buf = of.rdbuf(); + } else { + buf = std::cout.rdbuf(); + } + + std::ostream out(buf); + + if (conf.print_headers) { + auto &headers = response.getHeaders(); + + out << "HTTP/" << response.getHttpVersion() << " " << response.getStatusCode() << " " << response.getStatusString() + << "\n"; + for (auto &h : headers) { + out << h.first << ": " << h.second << "\n"; + } + out << "\n"; + } + + out.write((char *) payload.data(), payload.size()); + of.close(); + + Time t2 = std::chrono::system_clock::now();; + TimeDuration dt = std::chrono::duration_cast(t2 - t1); + TimeDuration dt3 = std::chrono::duration_cast(t3 - t1); + long msec = dt.count(); + long msec3 = dt3.count(); + std::cerr << "Elapsed Time: " << msec / 1000.0 << " seconds -- " << payload.size() * 8 / msec / 1000.0 + << "[Mbps] -- " << payload.size() * 8 / msec3 / 1000.0 << "[Mbps]" << std::endl; + +} + +void usage(char *program_name) { + std::cerr << "USAGE:" << std::endl; + std::cerr << "\t" << program_name << " [OPTION]... [URL]..." << std::endl; + std::cerr << "OPTIONS:" << std::endl; + std::cerr << "\t" << "-O filename write documents to FILE" << std::endl; + std::cerr << "\t" << "-S print server response" << std::endl; + std::cerr << "EXAMPLE:" << std::endl; + std::cerr << "\t" << program_name << " -O - http://origin/index.html" << std::endl; + exit(EXIT_FAILURE); +} + +int main(int argc, char **argv) { + + Configuration conf { + .file_name = "", .print_headers = false, .producer_certificate = "" + }; + + std::string name("http://webserver/sintel/mpd"); + + int opt; + while ((opt = getopt(argc, argv, "O:Sc:")) != -1) { + switch (opt) { + case 'O': + conf.file_name = optarg; + break; + case 'S': + conf.print_headers = true; + break; + case 'c': + conf.producer_certificate = optarg; + break; + case 'h': + default: + usage(argv[0]); + break; + } + } + + if (argv[optind] == 0) { + std::cerr << "Using default name " << name << std::endl; + } else { + name = argv[optind]; + } + + if (conf.file_name.empty()) { + conf.file_name = name.substr(1 + name.find_last_of("/")); + } + + std::map headers = { + {"Host", "localhost"}, + {"User-Agent", "higet/1.0"} + }; + + transport::http::HTTPClientConnection connection; + if (!conf.producer_certificate.empty()) { + connection.setCertificate(conf.producer_certificate); + } + + t1 = std::chrono::system_clock::now(); + + connection.get(name, headers); + processResponse(conf, connection.response()); + + return EXIT_SUCCESS; +} + +} // end namespace http + +} // end namespace hicnet + +int main(int argc, char **argv) { + return hicnet::http::main(argc, argv); +} -- cgit 1.2.3-korg