WebKit之curl使用

转载 2015年11月20日 00:20:59
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. }  

WebKit库的使用

apple和google为webkit该浏览器引擎的发扬光大做出了重要贡献,在WWDC 2014发布会上发布iOS 8中,apple公布了WebKit框架,这意味着OSX和IOS开发者将共用同样的开发...
  • zhaoyya
  • zhaoyya
  • 2014年10月23日 08:42
  • 639

Libcurl库常用接口使用说明,限速设置及在Webkit上的运用

libcurl 接口调用方式  libcurl提供了一组C语言API函数直接调用。首先需要提到的两个函数就是curl_global_init()和 curl_global_cleanup()...
  • hu_jiangan
  • hu_jiangan
  • 2015年10月15日 15:05
  • 342

Webkit之插件扩展

在Safari里有一个单例对象WebPluginDatabase负责管理本地的插件,每个plugin对应一个WebBasePluginPackage,存放在plugins里。 在第一次调用sha...
  • sauphy
  • sauphy
  • 2015年11月17日 00:21
  • 810

webkit常见问题汇总

前段时间有人问我一个简单的问题,html如何创建解析的? 我讲了一大堆,什么通过DocumentLoader, CachedResourceLoader, CacheResource, Resourc...
  • lihui130135
  • lihui130135
  • 2015年04月15日 19:02
  • 2007

webkit资料教程汇总

转自 http://www.usidcbbs.com/simple/?t4848.html 一 . WebKit 简介         Webkit 是一个开放源代码的浏览器引...
  • wxkey
  • wxkey
  • 2014年12月11日 18:19
  • 1322

Android webkit 时代结束,我们需要做些什么准备?

Android 4.4最新发布版本对浏览器来说是一个革命性变化,external下面的webkit源码已经被移除,前一阵子吵得沸沸扬扬的chromium作为android默认浏览器的猜测已经尘埃落定,...
  • lihui130135
  • lihui130135
  • 2014年03月03日 01:26
  • 3728

深入理解webkit内核系列第一篇:如何快速编译

最近发现询问webkit如何编译的人很多,为了方便大家写一篇关于如何在linux下面编译webkit的文章,方便大家来学习讨论。我们知道webkit是一个跨平台的浏览器能够在苹果,windows,li...
  • lihui130135
  • lihui130135
  • 2014年03月13日 01:43
  • 7636

webkit浏览器开发之路(一)——环境搭建

最近在着手开发浏览器,于是便用到了非常受欢迎的webkit,
  • coffeeRoy
  • coffeeRoy
  • 2014年06月06日 09:57
  • 2626

开发者应当了解的WebKit知识

对一些开发者而言,WebKit就是一个黑盒子。丢进去HTML、CSS、JS等一连串的东西,而WebKit就能变魔术一般显示出一个很棒的网页出来。实际上,正我的同事IlyaGroriks提到的:   ...
  • HorkyChen
  • HorkyChen
  • 2013年03月02日 22:46
  • 60683

iOS 中的UIWebView 和webkit 的联系使用

1. 0 目录          WebKit在给人的印象,是一个浏览引擎,貌似只是和网页有关,其实在OS X和iOS上,多于一行的文字渲染,都和WebKit有关。浏览网页,在iOS上,使用的是UI...
  • FirstBloodFB
  • FirstBloodFB
  • 2015年02月09日 13:08
  • 1078
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebKit之curl使用
举报原因:
原因补充:

(最多只允许输入30个字)