diff --git a/test_http_client/Makefile b/test_http_client/Makefile new file mode 100644 index 0000000..d3201e8 --- /dev/null +++ b/test_http_client/Makefile @@ -0,0 +1,2 @@ +test_http_client: test_http_client.cpp + g++ $^ -o $@ -levent \ No newline at end of file diff --git a/test_http_client/first_libevent.vcxproj b/test_http_client/first_libevent.vcxproj new file mode 100644 index 0000000..81fc288 --- /dev/null +++ b/test_http_client/first_libevent.vcxproj @@ -0,0 +1,162 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {129BF326-BFEE-4F1C-920C-0C302BB84895} + Win32Proj + firstlibevent + 10.0.17763.0 + test_http_client + + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + NotUsing + Level3 + Disabled + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ..\..\include + + + Console + true + ..\..\lib + libevent.lib;ws2_32.lib;%(AdditionalDependencies) + + + + + + + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + Level3 + MaxSpeed + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/test_http_client/test_event_client.sln b/test_http_client/test_event_client.sln new file mode 100644 index 0000000..5111269 --- /dev/null +++ b/test_http_client/test_event_client.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.1525 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "first_libevent", "first_libevent.vcxproj", "{129BF326-BFEE-4F1C-920C-0C302BB84895}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {129BF326-BFEE-4F1C-920C-0C302BB84895}.Debug|x64.ActiveCfg = Debug|x64 + {129BF326-BFEE-4F1C-920C-0C302BB84895}.Debug|x64.Build.0 = Debug|x64 + {129BF326-BFEE-4F1C-920C-0C302BB84895}.Debug|x86.ActiveCfg = Debug|Win32 + {129BF326-BFEE-4F1C-920C-0C302BB84895}.Debug|x86.Build.0 = Debug|Win32 + {129BF326-BFEE-4F1C-920C-0C302BB84895}.Release|x64.ActiveCfg = Release|x64 + {129BF326-BFEE-4F1C-920C-0C302BB84895}.Release|x64.Build.0 = Release|x64 + {129BF326-BFEE-4F1C-920C-0C302BB84895}.Release|x86.ActiveCfg = Release|Win32 + {129BF326-BFEE-4F1C-920C-0C302BB84895}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {191D7F93-7554-493B-92E1-BB302C5A8383} + EndGlobalSection +EndGlobal diff --git a/test_http_client/test_http_client.cpp b/test_http_client/test_http_client.cpp new file mode 100644 index 0000000..1fa3379 --- /dev/null +++ b/test_http_client/test_http_client.cpp @@ -0,0 +1,130 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif // !_WIN32 + + +using namespace std; + + +void http_client_cb(struct evhttp_request *req, void *ctx) { + cout << "http_client_cb" << endl; + bufferevent *bev = (bufferevent*)ctx; + if (req == NULL) { + int errcode = EVUTIL_SOCKET_ERROR(); + cout << "socket error: " << evutil_socket_error_to_string(errcode) << endl; + return; + } + + //获取path + const char* path = evhttp_request_get_uri(req); + cout << "request path is " << path << endl; + + //获取返回的code + cout << "Respone: " << evhttp_request_get_response_code(req); + cout << "" << evhttp_request_get_response_code_line(req) << endl; + char buf[1024] = { 0 }; + evbuffer *input = evhttp_request_get_input_buffer(req); + for (;;) { + int len = evbuffer_remove(input,buf,sizeof(buf)-1); + if(len <=0 ) + buf[len] = 0; + } +} + + +int main() +{ +#ifdef _WIN32 + //初始化socket库 + WSADATA wsa; + WSAStartup(MAKEWORD(2, 2), &wsa); +#else + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { //忽略管道信号,发送数据给已关闭的socket,会飞掉! + return 1; + } +#endif + + //创建libevent上下文 + event_base* base = event_base_new(); + + // 生成请求信息 GET + //string http_url = "http://www.pyfup.com/index.html?id=1"; + string http_url = "http://121.4.70.4:3000//index.html?id=1"; //地址 自己换着测试 + + evhttp_uri *uri = evhttp_uri_parse(http_url.c_str()); + const char* schemo = evhttp_uri_get_scheme(uri); + if (!schemo) { + cerr << "schemo is null" << endl; + return -1; + } + cout << "schemo is " << schemo << endl; + + int port = evhttp_uri_get_port(uri); + if (port < 0) { + if (strcmp(schemo, "http") == 0) + port = 80; + } + + cout << "host is " << port << endl; + + const char* host = evhttp_uri_get_host(uri); + if (!host) { + cerr << "host is null" << endl; + return -1; + } + + cout << "host is " << host << endl; + const char *path = evhttp_uri_get_path(uri); + if (!path || strlen(path) == 0) { + path = "/"; + } + cout << "path is " << path << endl; + + + + //?号之后的内容 + const char* query = evhttp_uri_get_query(uri); + if (query) { + cout << "query is " << query << endl; + } + + + bufferevent *bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE); + evhttp_connection *evcon = evhttp_connection_base_bufferevent_new(base, NULL, bev, host, port); + evhttp_request *req = evhttp_request_new(http_client_cb, bev); + + //设置请求的head 消息报头 信息 + struct evkeyvalq*out_put_headers = evhttp_request_get_output_headers(req); + evhttp_add_header(out_put_headers, "Host", host); + + //发起请求 + evhttp_make_request(evcon, req, EVHTTP_REQ_GET, path); + + + + + if (base) + event_base_dispatch(base); //事件分发处理 + + if (base) + event_base_free(base); + +#if _WIN32 + WSACleanup(); +#endif // _WIN32 + + + + return 0; +} + +