curl 是个开源的网络裤,经常会被嵌入应用程序,用于网络相关的开发。所以我们会去捕捉curl是网络请求,分析请求/响应是否正常。我们这里只处理两种情况,应用内部设置代理,命令行模式设置代理。
下载安装Findler 并运行,默认会开启本地代理,端口号8888。但是还不能全部捕捉当前电脑上的所有HTTP请求(Findler默认只捕捉http请求)Windows 平台下Findler 默认只捕捉WinINET API 的请求,通过其他方式实现的网络请求默认状态是无法捕捉到的,需要一些额外的设置。比如通过 curl 和 Winhttp 发送的请求就无法捕捉。下面分别说一下,如何捕捉这类请求。
- 应用内部设置代理,下面是通过curl 模拟表单提交上传文件,设置代理方便Findler捕捉请求
int http_post_file(LPSTR url, LPSTR filename, LPSTR strImg, std::string& strRes)
{
assert(url != NULL);
assert(filename != NULL);
std::string strName = getfileNm(filename);
int ret = -1;
CURL *curl = NULL;
CURLcode code;
CURLFORMcode formCode;
int timeout = 15;
struct curl_httppost *post = NULL;
struct curl_httppost *last = NULL;
struct curl_slist *headerlist = NULL;
curl_formadd(&post, &last, CURLFORM_COPYNAME, "image_type",
CURLFORM_COPYCONTENTS, strImg,
CURLFORM_END);
curl_formadd(&post, &last, CURLFORM_COPYNAME, "file",
CURLFORM_FILE, filename,
CURLFORM_END);
curl_formadd(&post, &last,
CURLFORM_COPYNAME, "submit",
CURLFORM_COPYCONTENTS, "upload",
CURLFORM_END);
curl = curl_easy_init();
curl_easy_setopt(hCurl, CURLOPT_PROXY, "127.0.0.1:8888");
if (curl == NULL)
{
fprintf(stderr, "curl_easy_init() error./n");
goto out;
}
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &process_storage_server_data);
code = curl_easy_perform(curl);
if (code != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform[%d] error./n", code);
goto all;
}
ret = 0;
all:
curl_easy_cleanup(curl);
out:
curl_formfree(post);
strRes = g_StroageServerResponseResult;
return ret;
}
重点看这句
curl_easy_setopt(hCurl, CURLOPT_PROXY, "127.0.0.1:8888");
为curl 启用本地代理,端口号8888;
- curl 命令行模式设置代理
curl www.baidu.com
curl 127.0.0.1:8888 www.baidu.com
- Findler 捕捉 winhttp 请求
这里有一篇博文写的非常详细,可以参考一下。Findler如何捕捉WinHttp请求