本文介绍一下C++下一个libghttp库的使用
0x00 安装
下载地址:https://github.com/Rvn0xsy/libghttp.git
git clone https://github.com/Rvn0xsy/libghttp.git
cd libghttp
./configure
make
make install
0x01 问题解决
checking host system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized
checking build system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized
checking for ranlib... ranlib
checking for ld used by GCC... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD-compatible nm... /usr/bin/nm -B
checking whether ln -s works... yes
updating cache ./config.cache
ltconfig: you must specify a host type if you use `--no-verify'
Try `ltconfig --help' for more information.
configure: error: libtool configure failed
即configure无法识别系统的类型, 所以提示you must specify a host type.
用 /usr/share/libtool/config/config.guess
覆盖源码包中的 config.guess
cp /usr/share/libtool/config/config.guess ./config.guess
用 /usr/share/libtool/config/config.sub
覆盖源码包中的 config.sub
cp /usr/share/libtool/config/config.sub ./config.sub
这样configure就可以猜出系统的类型了
如果/usr/share/libtool/config/config.guess
不存在则安装libtool,sudo apt-get install libtool
开始安装:
./configure --prefix=/usr/local
make
sudo make install
0x02 异步请求
int ghttp_set_sync(ghttp_request *a_request,ghttp_sync_mode a_mode);
比普通模式要快
0x03 封装代码
CMakeLists.txt :
cmake_minimum_required(VERSION 3.8)
project(untitled1)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp http.h http.cpp)
INCLUDE_DIRECTORIES(
/usr/local/include
)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/usr/local/lib")
INCLUDE_DIRECTORIES(/usr/local/include)
SET(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,/usr/local/lib")
add_executable(untitled1 ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(untitled1 libghttp.a)
main.cpp :
#include <iostream>
#include <getopt.h>
#include <vector>
#include <string>
#include "http.h"
#include <sys/time.h>
int main() {
struct timeval times;
gettimeofday(×,NULL);
long int current_time = times.tv_sec;
http Req("/home/payloads/CLionProjects/untitled1/cmake-build-debug/url");
if(Req.checkDic()==-1){
std::cout << "Error .. " << std::endl;
return -1;
}
Req.getUrlList();
Req.Print();
gettimeofday(×,NULL);
std::cout << "end " << times.tv_sec - current_time << std::endl;
return 0;
}
http.h :
//
// Created by payloads on 11/19/17.
//
#ifndef UNTITLED1_HTTP_H
#define UNTITLED1_HTTP_H
#include <ghttp.h>
#include <string>
#include <vector>
struct requestResult{
int status_code;
std::string url;
std::string server;
std::string power;
std::string title;
};
class http{
public:
http(std::string urlists);
~http();
void getUrlList();
int checkDic();
void Print();
private:
ghttp_request * req;
int request(std::string url);
std::vector<std::string> targets;
std::string urlists;
std::string currentUrl;
std::vector<struct requestResult> httpresult;
// void debug();
};
#endif //UNTITLED1_HTTP_H
http.cpp :
//
// Created by payloads on 11/19/17.
//
#include "http.h"
#include <string>
#include <fstream>
#include <iostream>
#include <cstring>
#include <regex>
http::http(std::string urlists){
this->urlists = urlists;
req = ghttp_request_new();
ghttp_set_type(req,ghttp_type_get);
ghttp_set_sync(req,ghttp_sync);
}
int http::checkDic() {
std::fstream URLio(urlists,std::ios::in);
std::string buff;
if(URLio.is_open()){
while(!URLio.eof()){
getline(URLio,buff);
targets.push_back(buff);
}
}else{
return -1;
}
return 0;
}
void http::getUrlList() {
for(auto it=targets.begin();it != targets.end(); it ++){
std::cout << *it << std::endl;
currentUrl = *it;
request(*it);
std::regex title("<title>([^<]+)</title>");
std::smatch match_title;
struct requestResult * res = new requestResult;
res->status_code = ghttp_status_code(req);
res->server = ghttp_get_header(req,"Server")==NULL?"":ghttp_get_header(req,"Server");
res->power = ghttp_get_header(req,"X-Powered-By") == NULL?"":ghttp_get_header(req,"X-Powered-By");
std::string body = ghttp_get_body(req)==NULL?"":ghttp_get_body(req);
res->title = regex_search(body, match_title, title)?match_title[1].str():"";
res->url = currentUrl;
httpresult.push_back(*res);
delete res;
}
}
int http::request(std::string url) {
ghttp_set_uri(req,(char *)url.data());
ghttp_prepare(req);
ghttp_process(req);
}
http::~http() {
ghttp_flush_response_buffer(req);
ghttp_request_destroy(req);
}
void http::Print() {
for(auto it = httpresult.begin();it != httpresult.end(); it++){
std::cout <<" URL -> " << it->url << " Title -> " << it->title
<< std::endl << " Server -> " << it->server
<< std::endl << " Power -> " << it->power
<< std::endl << " Status_Code -> " << it->status_code
<< std::endl;
}
}
0x04 参考文档
https://sourcecodebrowser.com/libghttp/1.0.9/dir_506518e21dfd39d0ce0207889f9217e3.html