curllib库http chunk发送方法纠错

来源:互联网 发布:淘宝手机缴费 编辑:程序博客网 时间:2024/06/05 16:06
                                                curllib库http chunk发送方法纠错

以前一直以为发送chunk数据只要http协议的头部添加
Transfer-Encoding: chunked

就可以了,所以写了下面错误的代码

static int send_request(const char *req, char **data, int req_length){struct curl_slist *phttp_headers = NULL;CURL* ins_curl = NULL;//make_http_headers(&phttp_headers);ins_curl = curl_easy_init();if (ins_curl == NULL){printf("init curl failed\n");return -1;}phttp_headers = curl_slist_append(phttp_headers, "Transfer-Encoding: chunked");curl_slist_append(phttp_headers, "Content-Encoding: gzip");curl_easy_setopt(ins_curl, CURLOPT_URL, DEFAULT_SERVER);curl_easy_setopt(ins_curl, CURLOPT_WRITEFUNCTION, read_response_data);curl_easy_setopt(ins_curl, CURLOPT_POST, 1L);curl_easy_setopt(ins_curl, CURLOPT_VERBOSE, 1L);curl_easy_setopt(ins_curl, CURLOPT_HEADER, 1L);curl_easy_setopt(ins_curl, CURLOPT_FOLLOWLOCATION, 1L);// setup chunk and post datacurl_easy_setopt(ins_curl, CURLOPT_HTTPHEADER, phttp_headers);curl_easy_setopt(ins_curl, CURLOPT_POSTFIELDS, req);curl_easy_setopt(ins_curl, CURLOPT_POSTFIELDSIZE, req_length);if(curl_easy_perform(ins_curl) != CURLE_OK){printf("http transform error\n");}curl_easy_cleanup(ins_curl);return 1;}

上面的错误是:
设置了CURLOPT_POSTFIELDS,CURLOPT_POSTFIELDSIZE这两选项
这样设置后就不是采用chunk发送了,而是采用普通方式

所以参考了curl库的例子
设置CURLOPT_READFUNCTION,CURLOPT_READDATA
/* we want to use our own read function */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

/* pointer to pass to our read function */
curl_easy_setopt(curl, CURLOPT_READDATA, &pooh);

size_t my_read_func(void *ptr, size_t size, size_t nmemb, void *stream){FILE *fp = (FILE *)stream;return fread(ptr, size, nmemb, fp);}

这样发送,服务器就可以收到了。

另外感觉上面的回掉写得很巧啊。
参考:
curl库中的例子post-callback.c
http://hi.baidu.com/zhujinyu/blog/item/464522f42f634664dcc4747b.html
http://blog.sina.com.cn/s/blog_78cf66b10100rvuw.html
http://blog.chinaunix.net/link.php?url=http://curl.haxx.se%2Flibcurl%2Fc%2Fcurl_easy_setopt.html%23CURLOPTREADDATA


原创粉丝点击