speedtestpp: drop libxml2 dependency

Co-authored-by: Tianling Shen <cnsztl@gmail.com>
Signed-off-by: Oskari Rauta <oskari.rauta@gmail.com>
(cherry picked from commit 281d624203)
This commit is contained in:
Oskari Rauta 2023-01-07 22:42:44 +02:00 committed by Tianling Shen
parent df3799fe04
commit 2feedb1e2a
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
2 changed files with 241 additions and 2 deletions

View File

@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=speedtestpp
PKG_VERSION:=1.14
PKG_RELEASE:=$(AUTORELEASE)
PKG_RELEASE:=2
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/taganaka/SpeedTest.git
@ -25,7 +25,7 @@ define Package/speedtestpp
SECTION:=net
CATEGORY:=Network
TITLE:=speedtest++
DEPENDS:=+libcurl +libxml2 +libopenssl +libstdcpp $(ICONV_DEPENDS)
DEPENDS:=+libcurl +libopenssl +libstdcpp $(ICONV_DEPENDS)
CONFLICTS:=python3-speedtest-cli
URL:=https://github.com/taganaka/SpeedTest
endef

View File

@ -0,0 +1,239 @@
From b7db370449cfe2b453c22b74a660701f78bd7ce3 Mon Sep 17 00:00:00 2001
From: Anatolii Lapytskyi <ala@allunite.com>
Date: Tue, 6 Sep 2022 15:59:27 +0200
Subject: [PATCH] Remove dependency on libxml2
---
CMakeLists.txt | 5 +-
README.md | 5 +-
SpeedTest.cpp | 136 ++++++++++++++-----------------------------------
SpeedTest.h | 2 -
4 files changed, 41 insertions(+), 107 deletions(-)
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,7 +44,6 @@ add_executable(SpeedTest ${SOURCE_FILES}
INCLUDE (CheckIncludeFiles)
find_package(CURL REQUIRED)
-find_package(LibXml2 REQUIRED)
if (NOT (APPLE))
find_package(OpenSSL REQUIRED)
@@ -52,7 +51,7 @@ else()
CHECK_INCLUDE_FILES("CommonCrypto/CommonDigest.h" HAVE_COMMON_DIGEST_H)
endif()
-include_directories(${CURL_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIR})
-target_link_libraries(SpeedTest ${CURL_LIBRARIES} ${LIBXML2_LIBRARIES} -lpthread ${OPENSSL_LIBRARIES})
+include_directories(${CURL_INCLUDE_DIRS})
+target_link_libraries(SpeedTest ${CURL_LIBRARIES} -lpthread ${OPENSSL_LIBRARIES})
install(TARGETS SpeedTest RUNTIME DESTINATION bin)
--- a/README.md
+++ b/README.md
@@ -26,7 +26,6 @@ It supports the new (undocumented) raw T
2. cmake
3. libcurl
4. libssl
-5. libxml2
### On Mac OS X
@@ -40,7 +39,7 @@ $ make install
### On Ubuntu/Debian
```
-$ sudo apt-get install build-essential libcurl4-openssl-dev libxml2-dev libssl-dev cmake
+$ sudo apt-get install build-essential libcurl4-openssl-dev libssl-dev cmake
$ git clone https://github.com/taganaka/SpeedTest
$ cd SpeedTest
$ cmake -DCMAKE_BUILD_TYPE=Release .
@@ -50,7 +49,7 @@ $ sudo make install
### On OpenSuse
```
-$ sudo zypper install cmake gcc-c++ libcurl-devel libxml2-devel libopenssl-devel git
+$ sudo zypper install cmake gcc-c++ libcurl-devel libopenssl-devel git
$ git clone https://github.com/taganaka/SpeedTest
$ cd SpeedTest
$ cmake -DCMAKE_BUILD_TYPE=Release .
--- a/SpeedTest.cpp
+++ b/SpeedTest.cpp
@@ -353,67 +353,16 @@ std::vector<std::string> SpeedTest::spli
}
-ServerInfo SpeedTest::processServerXMLNode(xmlTextReaderPtr reader) {
-
- auto name = xmlTextReaderConstName(reader);
- auto nodeName = std::string((char*)name);
-
- if (!name || nodeName != "server"){
- return ServerInfo();
- }
-
- if (xmlTextReaderAttributeCount(reader) > 0){
- auto info = ServerInfo();
- auto server_url = xmlTextReaderGetAttribute(reader, BAD_CAST "url");
- auto server_lat = xmlTextReaderGetAttribute(reader, BAD_CAST "lat");
- auto server_lon = xmlTextReaderGetAttribute(reader, BAD_CAST "lon");
- auto server_name = xmlTextReaderGetAttribute(reader, BAD_CAST "name");
- auto server_county = xmlTextReaderGetAttribute(reader, BAD_CAST "country");
- auto server_cc = xmlTextReaderGetAttribute(reader, BAD_CAST "cc");
- auto server_host = xmlTextReaderGetAttribute(reader, BAD_CAST "host");
- auto server_id = xmlTextReaderGetAttribute(reader, BAD_CAST "id");
- auto server_sponsor = xmlTextReaderGetAttribute(reader, BAD_CAST "sponsor");
-
- if (server_name)
- info.name.append((char*)server_name);
-
- if (server_url)
- info.url.append((char*)server_url);
-
- if (server_county)
- info.country.append((char*)server_county);
-
- if (server_cc)
- info.country_code.append((char*)server_cc);
-
- if (server_host)
- info.host.append((char*)server_host);
-
- if (server_sponsor)
- info.sponsor.append((char*)server_sponsor);
-
- if (server_id)
- info.id = std::atoi((char*)server_id);
-
- if (server_lat)
- info.lat = std::stof((char*)server_lat);
-
- if (server_lon)
- info.lon = std::stof((char*)server_lon);
-
- xmlFree(server_url);
- xmlFree(server_lat);
- xmlFree(server_lon);
- xmlFree(server_name);
- xmlFree(server_county);
- xmlFree(server_cc);
- xmlFree(server_host);
- xmlFree(server_id);
- xmlFree(server_sponsor);
- return info;
- }
-
- return ServerInfo();
+std::string getAttributeValue(const std::string& data, const size_t offset, const size_t max_pos, const std::string& attribute_name) {
+ size_t pos = data.find(attribute_name + "=\"", offset);
+ if (pos == std::string::npos)
+ return "";
+ if (pos >= max_pos)
+ return "";
+ size_t value_pos = pos + attribute_name.length() + 2;
+ size_t end = data.find("\"", value_pos);
+ std::string s = data.substr(pos + attribute_name.length() + 2, end - value_pos);
+ return s;
}
bool SpeedTest::fetchServers(const std::string& url, std::vector<ServerInfo>& target, int &http_code) {
@@ -441,53 +390,42 @@ bool SpeedTest::fetchServers(const std::
http_code = 200;
}
- size_t len = oss.str().length();
- auto *xmlbuff = (char*)calloc(len + 1, sizeof(char));
- if (!xmlbuff){
- std::cerr << "Unable to calloc" << std::endl;
+ IPInfo ipInfo;
+ if (!SpeedTest::ipInfo(ipInfo)){
curl_easy_cleanup(curl);
+ std::cerr << "OOPS!" <<std::endl;
return false;
}
- memcpy(xmlbuff, oss.str().c_str(), len);
- oss.str("");
- xmlTextReaderPtr reader = xmlReaderForMemory(xmlbuff, static_cast<int>(len), nullptr, nullptr, 0);
+ std::string data = oss.str();
- if (reader != nullptr) {
- IPInfo ipInfo;
- if (!SpeedTest::ipInfo(ipInfo)){
- curl_easy_cleanup(curl);
- free(xmlbuff);
- xmlFreeTextReader(reader);
- std::cerr << "OOPS!" <<std::endl;
- return false;
- }
- auto ret = xmlTextReaderRead(reader);
- while (ret == 1) {
- ServerInfo info = processServerXMLNode(reader);
- if (!info.url.empty()){
- info.distance = harversine(std::make_pair(ipInfo.lat, ipInfo.lon), std::make_pair(info.lat, info.lon));
- target.push_back(info);
- }
- ret = xmlTextReaderRead(reader);
- }
- xmlFreeTextReader(reader);
- if (ret != 0) {
- curl_easy_cleanup(curl);
- free(xmlbuff);
- std::cerr << "Failed to parse" << std::endl;
- return false;
+ const std::string server_tag_start = "<server ";
+
+ size_t server_tag_begin = data.find(server_tag_start);
+ while (server_tag_begin != std::string::npos) {
+ size_t server_tag_end = data.find("/>", server_tag_begin);
+
+ auto info = ServerInfo();
+ info.name = getAttributeValue(data, server_tag_begin, server_tag_end, "name");
+ info.url = getAttributeValue(data, server_tag_begin, server_tag_end, "url");
+ info.country = getAttributeValue(data, server_tag_begin, server_tag_end, "country");
+ info.country_code = getAttributeValue(data, server_tag_begin, server_tag_end, "cc");
+ info.host = getAttributeValue(data, server_tag_begin, server_tag_end, "host");
+ info.sponsor = getAttributeValue(data, server_tag_begin, server_tag_end, "sponsor");
+ info.id = atoi(getAttributeValue(data, server_tag_begin, server_tag_end, "id").c_str());
+ info.lat = std::stof(getAttributeValue(data, server_tag_begin, server_tag_end, "lat"));
+ info.lon = std::stof(getAttributeValue(data, server_tag_begin, server_tag_end, "lon"));
+
+ if (!info.url.empty()){
+ info.distance = harversine(std::make_pair(ipInfo.lat, ipInfo.lon), std::make_pair(info.lat, info.lon));
+ target.push_back(info);
}
- } else {
- std::cerr << "Unable to initialize xml parser" << std::endl;
- curl_easy_cleanup(curl);
- free(xmlbuff);
- return false;
+
+ server_tag_begin = data.find(server_tag_start, server_tag_begin + 1);
}
+
curl_easy_cleanup(curl);
- free(xmlbuff);
- xmlCleanupParser();
std::sort(target.begin(), target.end(), [](const ServerInfo &a, const ServerInfo &b) -> bool {
return a.distance < b.distance;
});
--- a/SpeedTest.h
+++ b/SpeedTest.h
@@ -7,7 +7,6 @@
#include "SpeedTestConfig.h"
#include "SpeedTestClient.h"
-#include <libxml/xmlreader.h>
#include <functional>
#include <cmath>
#include <curl/curl.h>
@@ -50,7 +49,6 @@ private:
const ServerInfo findBestServerWithin(const std::vector<ServerInfo>& serverList, long& latency, int sample_size = 5, std::function<void(bool)> cb = nullptr);
static CURL* curl_setup(CURL* curl = nullptr);
static size_t writeFunc(void* buf, size_t size, size_t nmemb, void* userp);
- static ServerInfo processServerXMLNode(xmlTextReaderPtr reader);
double execute(const ServerInfo &server, const TestConfig &config, const opFn &fnc, std::function<void(bool)> cb = nullptr);
template <typename T>
static T deg2rad(T n);