WebKit之curl使用

webkit使用curl库,他就要去适应curl。当然curl也会做出努力能够让别人容易使用,这也是他份内的事。
这里主要是分析几个函数,了解回调函数的使用过程。也可以帮助我们在以后使用curl库。
webkit中有这么连续的四句,注册了在接收到网页的头和网页内容时候的回调函数。
curl_easy_setopt(d->m_handle, CURLOPT_WRITEFUNCTION, writeCallback);
curl_easy_setopt(d->m_handle, CURLOPT_WRITEDATA, job);
curl_easy_setopt(d->m_handle, CURLOPT_HEADERFUNCTION, headerCallback);
curl_easy_setopt(d->m_handle, CURLOPT_WRITEHEADER, job);
首先我们的需求是通过回调函数把数据传送给webkit内核。完成这一步需要ResourceHandle,也就是这里的job.
我们把它注册到curl内部,最后再通过回调函数中第四个参数把这个值给传递回来,这样整个过程就完成了。
cur中回调函数的定义:

  1. typedef size_t (*curl_write_callback)(char *buffer,  
  2.                                       size_t size,  
  3.                                       size_t nitems,  
  4.                                       void *outstream);  

curl内部处理过程:
1.注册
  1. #define CURLOPT_WRITEDATA CURLOPT_FILE//这个宏定义需要注意  
  2. curl_easy_setopt(d->m_handle, CURLOPT_WRITEFUNCTION, writeCallback);  
  3. case CURLOPT_WRITEFUNCTION:  
  4.     /* 
  5.       * Set data write callback 
  6.       */  
  7.     data->set.fwrite_func = va_arg(param, curl_write_callback);  
  8.     if(!data->set.fwrite_func) {  
  9.     data->set.is_fwrite_set = 0;  
  10.     /* When set to NULL, reset to our internal default function */  
  11.     data->set.fwrite_func = (curl_write_callback)fwrite;//注册write call back,用于传回数据  
  12.     }  
  13.     else  
  14.     data->set.is_fwrite_set = 1;  
  15.     break;  
  16. curl_easy_setopt(d->m_handle, CURLOPT_WRITEDATA, job);  
  17. case CURLOPT_FILE:  
  18.     /* 
  19.       * FILE pointer to write to or include in the data write callback 
  20.       */  
  21.     data->set.out = va_arg(param, FILE *);  
  22.     break;  
  23. curl_easy_setopt(d->m_handle, CURLOPT_HEADERFUNCTION, headerCallback);  
  24. case CURLOPT_HEADERFUNCTION:  
  25.     /* 
  26.       * Set header write callback 
  27.       */  
  28.     data->set.fwrite_header = va_arg(param, curl_write_callback);//注册头部数据callback函数  
  29.     break;  
  30. curl_easy_setopt(d->m_handle, CURLOPT_WRITEHEADER, job);  
  31. case CURLOPT_WRITEHEADER:  
  32.     /* 
  33.       * Custom pointer to pass the header write callback function 
  34.       */  
  35.     data->set.writeheader = (void *)va_arg(param, void *);  
  36.     break;  


2.回调
最终的回调在Curl_client_write完成。
  1. if(type & CLIENTWRITE_BODY) {  
  2.   if((conn->protocol&PROT_FTP) && conn->proto.ftpc.transfertype == 'A') {  
  3. #ifdef CURL_DOES_CONVERSIONS  
  4.     /* convert from the network encoding */  
  5.     size_t rc;  
  6.     rc = Curl_convert_from_network(data, ptr, len);  
  7.     /* Curl_convert_from_network calls failf if unsuccessful */  
  8.     if(rc != CURLE_OK)  
  9.       return rc;  
  10. #endif /* CURL_DOES_CONVERSIONS */  
  11.   
  12. #ifdef CURL_DO_LINEEND_CONV  
  13.     /* convert end-of-line markers */  
  14.     len = convert_lineends(data, ptr, len);  
  15. #endif /* CURL_DO_LINEEND_CONV */  
  16.   }  
  17.   /* If the previous block of data ended with CR and this block of data is 
  18.       just a NL, then the length might be zero */  
  19.   if(len) {  
  20.     wrote = data->set.fwrite_func(ptr, 1, len, data->set.out);//调用注册回调函数传回数据  
  21.   }  
  22.   else {  
  23.     wrote = len;  
  24.   }  
  25.   
  26.   if(CURL_WRITEFUNC_PAUSE == wrote)  
  27.     return pausewrite(data, type, ptr, len);  
  28.   
  29.   if(wrote != len) {  
  30.     failf(data, "Failed writing body (%zu != %zu)", wrote, len);  
  31.     return CURLE_WRITE_ERROR;  
  32.   }  
  33. }  
  34.   
  35. if((type & CLIENTWRITE_HEADER) &&  
  36.     (data->set.fwrite_header || data->set.writeheader) ) {  
  37.   /* 
  38.     * Write headers to the same callback or to the especially setup 
  39.     * header callback function (added after version 7.7.1). 
  40.     */  
  41.   curl_write_callback writeit=  
  42.     data->set.fwrite_header?data->set.fwrite_header:data->set.fwrite_func;  
  43.   
  44.   /* Note: The header is in the host encoding 
  45.       regardless of the ftp transfer mode (ASCII/Image) */  
  46.   
  47.   wrote = writeit(ptr, 1, len, data->set.writeheader);  
  48.   if(CURL_WRITEFUNC_PAUSE == wrote)  
  49.     /* here we pass in the HEADER bit only since if this was body as well 
  50.     then it was passed already and clearly that didn't trigger the pause, 
  51.     so this is saved for later with the HEADER bit only */  
  52.     return pausewrite(data, CLIENTWRITE_HEADER, ptr, len);  
  53.   
  54.   if(wrote != len) {  
  55.     failf (data, "Failed writing header");  
  56.     return CURLE_WRITE_ERROR;  
  57.   }  
  58. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值