1.前言
2.处理HTTP Request的主要函数
ASIHTTPRequest::main流程如下(只列举了主要工作):
ASIHTTPRequest::startRequest
{
(1)向主线程发送requestStarted消息
(2)如果存在body,且需要post本地文件,则将本地文件读到postBodyReadStream对象中。然后调用CFReadStreamCreateForStreamedHTTPRequest函数,传入之前创建的CFHTTPMessageRef对象和postBodyReadStream对象,来创建一个用来读取response 的CFReadStream对象。
如果是post数据,则先根据shouldCompressRequestBody的值来判断是否要压缩,然后根据postBody的数据来创建一个NSInputStream对象,并赋给postBodyReadStream对象,然后调用CFReadStreamCreateForStreamedHTTPRequest,传入之前的header和stream对象,来创建NSReadStream对象。
如果不存在body,则直接通过CFReadStreamCreateForHTTPRequest函数来创建NSReadStream对象。
(3)针对https的情况,调用CFReadStreamSetProperty进行设置
(4)如果请求中设置了代理,则调用CFReadStreamSetProperty对stream进行代理相关的设置
(5)处理http持久连接相关的设置
(6)调用scheduleInRunLoop,将readStream对象放入runloop中
(7)调用CFReadStreamSetClient函数来将readStream关联到一个回调函数ReadStreamClientCallBack中,并使用CFReadStreamOpen打开readStream对象
(8)调用进度通知相关的函数
(9)创建一个计时器,用来调用updateStatus函数来更新进度,并将计时器放入当前runloop。
}
3.处理HTTP Response的主要函数
ASIHTTPRequest::handleNetworkEvent (该函数用来处理回调事件)
{
(1)当收到kCFStreamEventHasBytesAvailable 事件时 ,调用handleBytesAvailable(此时表示下层已经读到了response里的数据,这数据可能包含全部的header也可能header尚未读完)
(2)kCFStreamEventEndEncountered,调用handleStreamComplete,此时表示全部的数据包括header和body都已经读完,而且对应chunked数据,底层也已经将其合并完。
(3)kCFStreamEventErrorOccurred事件,调用handleStreamError处理错误
}
ASIHTTPRequest::handleBytesAvailable
{
(1)如果responseHeader对象尚未赋值,则调用readResponseHeaders读取header
(2)申请一块buffer,读取readStream对象里面的数据,此时如果能读到数据,则表示header已经读完了,当前读到的是body里面数据(因为header不是用read方法读的),如果读不到数据,则表示还没有收到body,则返回。
(3)读取到数据之后,如果header里面显示数据是压缩过的,则进行解压缩
(4)解压出数据之后有三种处理方式:
如果用户设置了didReceiveDataSelector或者dataReceivedBlock,这就表示用户希望自己处理每次得到的data,则向主线程发送passOnReceivedData消息。
如果用户在request中设置了下载路径,则将数据写到文件中
如果以上都不满足,则将数据append到rawResponseData中。
}
ASIHTTPRequest::readResponseHeaders
{
(1)使用CFReadStreamCopyProperty从readStream对象中读取header,创建一个CFHTTPMessageRef对象,并且使用CFHTTPMessageIsHeaderComplete检查该对象,判断header是否已经读完,若没有读完,则销毁该对象并返回
(2) 使用CFHTTPMessageCopyAllHeaderFields从CFHTTPMessageRef读出header到一个dictionary中
(3)如果有缓存,且允许读取缓存,则从缓存中读取header并返回。
(4)根据header中的状态码来判断是否需要进行http认证,如果需要则处理认证相关的工作
(5) 从header中content-type,用于对body进行解码,如没有该字段,则使用默认的解码方式对content进行解码
(6)处理cookie相关的工作
(7)如果不需要重定向,则从header中读取content-length,然后根据length做相关处理
(8)处理keepalive相关的工作
(9)最后向主线程发送requestReceivedResponseHeaders通知
}
ASIHTTPRequest::handleStreamComplete
{
该函数做的事情比较简单,主要就是设置各种下载结束的标志、设置读取到的文件大小并发送通知消息、移动下载的临时文件、保存cache等等。
}
ASIHTTPRequest源码简单分析的更多相关文章
-
FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
-
FFmpeg源码简单分析:libswscale的sws_scale()
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
-
Django-session中间件源码简单分析
Django-session中间件源码简单分析 settings里有关中间件的配置 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlew ...
-
FFmpeg源码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
-
negroni-gzip源码简单分析解读
negroni-gzip源码简单分析解读 这是一个为Negroni设计的gzip压缩处理中间件,需要用到已有的compress中的gzip,阅读了不长的源码之后,总结了一些关键要点和注意点. 检查是否 ...
-
FFmpeg的HEVC解码器源码简单分析:概述
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
-
FFmpeg的HEVC解码器源码简单分析:解码器主*分
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
-
urllib源码简单分析
对下面这段代码做分析 import urllib params = urllib.urlencode({'wd': 'python'}) f = urllib.urlopen("http:/ ...
-
CardboardSDK-iOS 源码简单分析
该项目地址: 地址 克隆地址为 https://github.com/rsanchezsaez/CardboardSDK-iOS.git 目前如果想在iOS设备上实现双目VR的功能,Google 已经 ...
随机推荐
-
PHP 字符串左边补0,字符串右边补0
概述:项目中经常会使用到在一串编码左边.右边甚至中间自动填充制定字符如"0" 并且制定填充后的字符串长度. 函数str_pad:该函数返回 input 被从左端.右端或者同时两端被 ...
-
ABAP->;内表数据下载到CSV格式(原创转载请注明)
需求:将alv上面的数据计算到内表中区,然后通过自定义按钮进行下载到csv格式中 附加:现在基本不用csv导出了,但是有些变态需求强行要求,也只好研究出来了,excel与txt导出很简单,那就不多说了 ...
-
微信读书 iOS 性能优化总结
微信读书作为一款阅读类的新产品,目前还处于快速迭代,不断尝试的过程中,性能问题也在业务的不断累积中逐渐体现出来.最近的 1.3.0 版本发布后,关于性能问题的用户反馈逐渐增多,为此,团队开始做一些针对 ...
-
MySQL服务器的SQL模式 (转)
转自: http://blog.csdn.net/kumu_linux/article/details/8185912 sql_mode的系统变量可以调控MySQL的SQL模式 任何一个客户端可以在不 ...
-
(转) Eclipse - Python - Installation of PyDev with a Python Hello World tutorial
Once you finished your installation of Python on your Windows OS, GNU/Linux or Mac OS, let me tell ...
-
Dos命令之Netsh
NetSH (Network Shell) 是windows系统本身提供的功能强大的网络配置命令行工具. 常用命令 1. 导出配置脚本:netsh -c interface ip dump > ...
-
webpack模块机制浅析【一】
webpack模块机制浅析[一] 今天看了看webpack打包后的代码,所以就去分析了下代码的运行机制. 下面这段代码是webpack打包后的最基本的形式,可以说是[骨架] (function(roo ...
-
第一周Python讲课内容--日记
1.python的发展史,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年...... 2.第一个helloword程序的开始 3.变量的含义,赋值传参数的作 ...
-
Spring之事务管理的好处
在以往的JDBCTemplate中事务提交成功,异常处理都是通过Try/Catch 来完成,而在Spring中.Spring容器集成了TransactionTemplate,封装了所有对事务处理的功能 ...
-
201621123050 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...