当前位置:首页 » 操作系统 » gzip源码

gzip源码

发布时间: 2022-11-12 12:15:13

‘壹’ 写C++程序的时候,怎么编写可以读取gzip压缩的文件请具体回答,最好有具体源代码。

下载并使用libz和libz2的api,就可以读取gzip文件。http://blog.csdn.net/yui/article/details/5707842

‘贰’ 怎么让页面自动解析Gzip字符串

java过滤器实现Gzip压缩实例源码教程。Gzip是若干种文件压缩程序的简称,我们这里来实现通过javaee中的filter实现对响应数据的压缩,高效的传到客户端,那么是怎么通过Gzip压缩实现的将数据压缩后客户端的,对步骤进行分析:

1.我们把客户端要对用户响应的数据先放在缓存中,

2.然后,通过Gzip将缓存中的数据压缩,

3.在过滤器中通过response的写方法,将数据响应到客户端。

为了模拟:

首先写一个请求的servlet:

package com.zsq.gzip;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GzipServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType(“text/html;charset=utf-8″);
String s=”” +
“” +
“” +
“不是吧”;
//response.getOutputStream().write(s.getBytes(“utf-8″));
response.getWriter().write(s);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}

下面是一个过滤器:

package com.zsq.gzip;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GzipFilter implements Filter{

public void destroy() {
System.out.println(“压缩过滤开始了”);
}

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) www.hbbz08.com throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
MyResponse mresponse=new MyResponse(response);
chain.doFilter(request, mresponse);
byte[] b=mresponse.getBytes();
System.out.println(“压缩前:”+b.length);
ByteArrayOutputStream out=new ByteArrayOutputStream();

GZIPOutputStream gzipOutputStream=new GZIPOutputStream(out);
gzipOutputStream.write(b);
gzipOutputStream.close();//将数据刷出,如果没有则不显示

byte[]bu=out.toByteArray();
System.out.println(“压缩后:”+bu.length);
response.setHeader(“Content-Encoding”,”gzip”);
response.getOutputStream().write(bu);

}

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println(“压缩过滤结束了。”);
}

}

其中有一个自定义类MyResponse,这个类是对Response的增强类,具体增强的是getOutputStream()和getWriter()这两个方法,通过对这两个方法将数据写到ByteArrayOutputStream中,而不是打印到页面,然后向外提供一个接口得到这个ByteArrayOutputStream对象,通过Gzip压缩,然后响应到客户端;该类的代码:

package com.zsq.gzip;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class MyResponse extends HttpServletResponseWrapper{

private ByteArrayOutputStream bytes=new ByteArrayOutputStream();//用bytes保存数据
private HttpServletResponse response;

private PrintWriter pw;
public MyResponse(HttpServletResponse response) {
super(response);
// TODO Auto-generated constructor stub
this.response=response;
}

@Override
public ServletOutputStream getOutputStream(){
return new MyServletOutputStream(bytes);//调用自定义类将数据写到bytes中
}

@Override
public PrintWriter getWriter(){

try {
pw=new PrintWriter(new OutputStreamWriter(bytes,”utf-8″));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return pw;
}

public byte[] getBytes(){//向外提供一个接口得到bytes数据。
if(pw!=null){
pw.close();
return bytes.toByteArray();
}

if(bytes!=null){
try {
bytes.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
return bytes.toByteArray();
}

‘叁’ 如何利用gzip压缩网页来提升网站浏览速度

纯Tomcat 服务器
如果您的 WEB 应用程序是跑在 Tomcat
服务器下的,而且直接使用 Tomcat 所提供的 HTTP 服务,那建议你马上动手,因为实在是太简单了,你只需要在 server.xml
配置文件中给 HTTP Connector 增加一个 compression 的参数值为 on 并重启 Tomcat
服务器就立刻生效,配置如下:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" compression="on"/>
Tomcat
采用的是 HTTP/1.1 的 GZIP 压缩协议,它会根据浏览器送过来的请求中的 accept-encoding 值是否包含 gzip
来判断浏览器是否支持 gzip 压缩协议,如果浏览器支持就启用 gzip 压缩,否则就不进行任何压缩处理。Tomcat 中还有另外一个参数
compressableMimeType,这个参数可以用来指定压缩哪种类型的内容,例如可以指定该配置值为:text/html,text
/plain ,则只压缩 contentType 为 text/html 和 text/plain 的页面,不过您最好也将 css 和
javascript 文件也算在压缩的文件类型中,因为这两者的压缩效果也十分的明显。
Apache 服务器

apache 1.3 版本,大家常用 mod_gzip 对输出内容进行压缩,现在主流的浏览器都支持 gzip 解压缩。在 apache2
下,这个模块换名为 mod_deflate,对应的模块文件名是 mod_deflate.so。mod_gzip 本文不做介绍,下面描述一下在
Apache 2 下如何启用并配置 mod_deflate 模块。默认安装的 Apache 不管是 Windows 还是
linux/Unix,都是不启用该模块的, Linux/Unix 下甚至不带该模块,你需要手工编译这个模块。
下面我们分别介绍在 Windows 和 Linux 操作系统下如何启用并配置 mod_deflate 模块。
在 Windows 下采用安装程序安装的 Apache 服务器已经带有 deflate 所需要的模块 mod_deflate.so 和 mod_headers.so,我们只需要在 httpd.conf 配置文件中启用并进行相关的配置即可,配置如下:
LoadMole deflate_mole moles/mod_deflate.so
LoadMole headers_mole moles/mod_headers.so
<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>

如果是 Linux/Unix 操作系统,如果你没有在编译安装的过程中将所需要的两个模块 mod_deflate 和 mod_headers
编译进去的话,那就稍微有点麻烦,首先我们先看如何在编译安装 Apache 过程中也同时编译这两个模块,请在执行 configure
程序时增加两个参数分别是:
# ./configure --enable-deflate --enable-headers
这样在编译完 Apache 后就可以直接在 httpd.conf 中启用并配置 deflate 模块了,配置的方法跟 Windows 平台下是相同的。

果说您的 Apache 已经在运行了,不想再重新编译一次,那也可以选择只编译 deflate 模块所需的文件 mod_deflate.c
和mod_headers.c。这两个文件位于 {apache-src}/moles/filters/ 目录下(其中 {apache-src}
为 apache 源文件所在的目录)。使用如下命令来单独编译这两个源文件。
# {apache-bin}/apxs -i -a -c {apache-src}/moles/filters/mod_deflate.c
# {apache-bin}/apxs –i –a –c {apache-src}/moles/filters/mod_headers.c
其中 {apache-bin} 为 Apache 安装目录下的 bin 目录,接下来在 httpd.conf 直接配置该模块即可。
很多时候你在单独编译 deflate 模块的时候可能会碰到编译错误,提示是:
Cannot load /opt/apache/moles/mod_deflate.so into server: /opt/apache/moles/mod_deflate.so: undefined symbol: deflate
解决的方法如下:
编辑 /usr/local/apache2/bin/apr-config 文件修改其中的 LDFLAGS 值为 "-lz",然后再重新编译 mod_deflate 模块,apxs -ica mod_deflate.c 即可。
为了省却不必要的麻烦,请尽量在编译安装时直接加上 --enable-deflate --enable-headers 参数。
IIS 服务器

软的 IIS 服务器同样也是目前用得最多的 WEB 服务器之一,而且用来运行 ASP 页面也是必不可少的。IIS6,iis本身支持 gzip
压缩,IIS5就比较费劲了,你可以找一些第三方的组件来处理,例如 httpzip,接下来我们介绍如何在 IIS6 中启用压缩功能。
打开 Internet 信息服务(IIS)管理器,右击"网站"->"属性",选择"服务"。在 "HTTP压缩" 框中选中 "压缩应用程序文件" 和 "压缩静态文件",按需要设置 "临时目录" 和 "临时目录的最大限制",
设置网站属性


下来配置 gzip 组件,在 Internet 信息服务(IIS)管理器,点击 "Web 服务扩展"->"增加一个新的 Web
服务扩展...",在 "新建 Web 服务扩展" 框中输入扩展名 "HTTP Compression",添加 "要求的文件" 为
C:\WINDOWS\system32\inetsrv\gzip.dll,选中 "设置扩展状态为允许",如下图所示:
设置 Web 服务扩展,新建 Web 服务扩展

还没完呢,我们还需要修改一个配置文件,修改之前请先停止 IIS 服务,打开 C:\Windows\System32\inetsrv\MetaBase.xml,这个文件很大,找到下面一段信息:
<IIsCompressionScheme Location ="/LM/W3SVC/Filters/Compression/gzip"
HcCompressionDll="%windir%\system32\inetsrv\gzip.dll"
HcCreateFlags="1"
HcDoDynamicCompression="TRUE"
HcDoOnDemandCompression="TRUE"
HcDoStaticCompression="TRUE"
HcDynamicCompressionLevel="0"
HcFileExtensions="htm
html
txt"
HcOnDemandCompLevel="10"
HcPriority="1"
HcScriptFileExtensions="asp
dll
exe"
>
</IIsCompressionScheme>
增加一些要进行压缩的文件后缀,其中 HcFileExtensions 是静态文件的扩展名,增加 js 和 css 等;HcScriptFileExtensions 为动态文件的扩展名,增加 aspx,保存后启动 IIS 即可生效。

后我们介绍如何来测试前面所做的工作是否起效,你可能会觉得很奇怪,配置好了,用浏览器打开页面正常,查看页面源码,内容并没有变化,大小也跟原来一样,
怎么回事呢?这是因为浏览器已经把内容解压了的结果,有两个方法来判断压缩是否生效:第一,查看 WEB 服务器的日志,不管是 Apache 或者是
IIS,二者的访问日志格式都差不多是下面这种格式:
127.0.0.1 - - [14/May/2006:08:44:28 +0800] "GET /manual/style/css/manual.css HTTP/1.1" 200 19351

后两个数字分别是 HTTP 的结果码(200 表示 OK),19351
表示的是响应内容的大小,把这个大小跟你在浏览器上查看源码的大小比较一下就可以知道是否生效。另外一种方法就是自己写一个 HTTP
客户端的小程序并设置 Accept-Encoding 的值为 gzip,deflate,由这个程序去请求服务器端的某个 URL
地址,然后打印出响应的内容,如果是一堆乱码,恭喜你,配置成功。下面是一段 Java 写的测试客户端代码(需要用到
commons-httpclient 包):
HttpClient http = new HttpClient();
String url = http://www.softbar.com;
GetMethod get = new GetMethod(url);
try{
System.out.println("fetching url : "+ url);
get.addRequestHeader("accept-encoding", "gzip,deflate");
int er = http.executeMethod(get);
if(er==200){
System.out.println(get.getResponseContentLength());
String html = get.getResponseBodyAsString();
System.out.println(html);
System.out.println(html.getBytes().length);
}
}finally{
get.releaseConnection();
}
结论

上是目前比较流行的两个 WEB 服务器软件以及 Tomcat 服务器对于页面压缩的配置方法;其他的一些 J2EE
应用服务器如果不支持这个功能的话可以考虑利用过滤器(Servlet Filter)来进行处理,具体的代码以及配置方法可以参考 Resin
服务器所提供的文档。但是有一点需要提醒各位读者的是,本文介绍的访问只是在服务器本身的响应速度已经足够优化的情况下进行,也就是说在带宽成为系统瓶颈
的时候才来考虑该方案。

‘肆’ 如何编译TrueCrypt源码

TrueCrypt是一款开源的虚拟加密磁盘工具,目前最新版本是7.0a,本文以该版本源代码为基础,介绍了如何在VC2008下进行编译。

环境配置
1. Microsoft Visual Studio 2008 SP1 (VC++ 2008)
2. Microsoft Visual Studio VC++ 1.52
3. NASM version 2.07 compiled on Jul 19 2009
4. gzip 1.2.4 Win32 (02 Dec 97)
5. PKCS11头文件
6. Windows Driver Develop Kit 7600.16385.1
7. TrueCrypt 7.0a Source.zip

准备步骤
1. Microsoft Visual Studio 2008 SP1 (VC++ 2008) ,这个是必需的了
2. 安装Microsoft Visual Studio VC++ 1.52,(这里为了方便管理编译TrueCrypt所需要的lib,我们可以在c盘建立一个目录,就命名为TrueCrypt)把MSVC++ 1.52安装在C:\TrueCrypt\MSVC\
3. 下载NASM,解压缩到C:\TrueCrypt\ NASM\
4. 下载gzip,解压缩到C:\TrueCrypt\ gzip\
5. 下载PKCS11头文件,解压缩到C:\TrueCrypt\PKCS11_INC\
6. 下载WDK7600.16385.1(这个是目前最新的,更新消息参考微软官网),安装到E:\WinDDK\7600.16385.1\(这个目录是我这边这么设置的,在下面环境变量设置需要注意)
7. 下载TrueCrypt 7.0a源代码(http://www.truecrypt.org/downloads2)

环境变量设置
右键我的电脑——属性——高级——环境变量,添加下面几个系统变量:
1. 变量名MSVC16_ROOT,变量值C:\TrueCrypt\MSVC
2. 变量名PKCS11_INC,变量值C:\TrueCrypt\PKCS11_INC
3. 变量名WINDDK_ROOT,变量值E:\WinDDK\7600.16385.1
4. 修改系统Path,在末尾增加C:\TrueCrypt\NASM;C:\TrueCrypt\gzip
环境变量设置完毕后需要重启电脑

源代码修改
1. 修改C:\TrueCrypt\PKCS11_INC\ pkcs11.h,添加
#define CKR_NEW_PIN_MODE 0x000001B0
#define CKR_NEXT_OTP 0x000001B1
可以直接添加在#define __PASTE(x,y) x##y后面一行
2. 修改TrueCrypt 7.0a Source其中的Setup项目中的Setup.h文件,添加
/*---region add by gc---*/
#include "wtypes.h"
const PROPERTYKEY PKEY_AppUserModel_ID = {
{
(unsigned long)2009,/*unsigned long Data1;*/
(unsigned short)12,/*unsigned short Data2;*/
(unsigned short)23,/*unsigned short Data3;*/
0x44,0x55,0x55,0x55,0x55,0x55,0x55,0x55
},/*GUID fmtid;*/
(DWORD)PID_FIRST_USABLE /*DWORD pid;*/
};
/*---endregion---*/
添加在文件的开始处,即
#ifdef __cplusplus
extern "C" {
#endif
后面一行即可。

到此为止,所有配置均设置完毕,打开TrueCrypt.sln解决方案,Build Solution就可以在Debug目录生成Setup Files目录,其下至少可以看到TrueCrypt.exe,truecrypt.sys,truecrypt-x64.sys这个三个文件了。

‘伍’ 如何解决http封包中gzip编码的html

如何解决http封包中gzip编码的html
大家都知道,在默认模式下,http协议中发送的网页的Html代码是经过gzip编码后传送的。那么我们怎么才能回复这段编码后的html呢?
大家可能都知道linux下有一个gzip命令。可以把文件压缩成gzip编码的格式,即*.gz
而对于文件的压缩和解压缩,可以采用zlib库中提供的各种接口来进行操作。但是这里问题来了。关于gzip编码的那些函数都带有gz开头的标示。而这些接口维护了一个名叫gz_stream的结构体。并且是针对文件FILE*操作的。

而我们要解决的问题是,我们把截取的封包中的gzip编码的内容拿出来,放到一个buffer中。那么怎么才能针对这个buffer中的数据应用这些接口呢?

我本来的想法是能不能在这些接口中找到专门对内存中的数据进行解码?

考虑这个问题,我看了这个库的源代码。后来放弃了。至于放弃的原因,可能是我意志力不够,或者不想看那些源代码了。总之,我看了一天,看的我头疼。

后来我就想个办法绕开这一思路,走个弯路。问题豁然开朗。

思路如下:

1. 把获取到的经过编码的数据保存到一个文件中。注意写文件的时候一定要以二进制方式。否则是不能解码的。

2. 应用zlib中的接口,gzopen(),gzread(),gzclose()即可完成解码的任务了。

‘陆’ linux命令的源代码怎么获取

1. 以搜索ls命令源码为例,先搜索命令所在包,命令如下: lpj@lpj-linux:~$ which ls /bin/ls 2. 用命令搜索该软件所在包,代码如下: lpj@lpj-linux:~$ dpkg -S /bin/ls coreutils: /bin/ls 3. 从上一步中可以知道ls命令的实现在包coreutils中,用apt安装(说安装有些歧义,主要是区分apt-get -d)该包的源代码然后解压,代码如下: sudo apt-get source coreutils cd /usr/src/coreutils-XXX #XXX表示版本号 sudo tar zxvf coreutils-XXX.tar.gz 或者只下载源码,然后手动打补丁再解压,代码如下: sudo apt-get -d source coreutils cd /usr/src tar zxvf coreutils-XXX.tar.gz gzip -d coreutils-XXX.diff.gz #这一步会生成coreutils-XXX.diff文件 patch -p0 < coreutils-XXX.diff cd coreutils-XXX tar zxvf coreutils-XXX.tar.gz OK,这几步执行完后,就可以进入/usr/src/coreutils-XXX/coreutils-XXX/src中查看各命令对应的源代码了

‘柒’ 如何查看linux命令源代码和函数源代码

1. 以搜索ls命令源码为例,先搜索命令所在包,命令如下:

lpj@lpj-linux:~$ which ls
/bin/ls

2. 用命令搜索该软件所在包,代码如下:

lpj@lpj-linux:~$ dpkg -S /bin/ls
coreutils: /bin/ls

3. 从上一步中可以知道ls命令的实现在包coreutils中,用apt安装(说安装有些歧义,主要是区分apt-get -d)该包的源代码然后解压,代码如下:

sudo apt-get source coreutils
cd /usr/src/coreutils-XXX #XXX表示版本号
sudo tar zxvf coreutils-XXX.tar.gz

或者只下载源码,然后手动打补丁再解压,代码如下:

sudo apt-get -d source coreutils
cd /usr/src
tar zxvf coreutils-XXX.tar.gz
gzip -d coreutils-XXX.diff.gz #这一步会生成coreutils-XXX.diff文件
patch -p0 < coreutils-XXX.diff
cd coreutils-XXX
tar zxvf coreutils-XXX.tar.gz

OK,这几步执行完后,就可以进入/usr/src/coreutils-XXX/coreutils-XXX/src中查看各命令对应的源代码了

‘捌’ 这个gzip文件怎么打开

建议去下载个,好压软件,在网络输入好压,就有了,基本现在所有的压缩格式都支持,速度很快,比winrar要好用很多!全免费的软件吆!

‘玖’ php获取网页源码内容有哪些办法

可以参考以下几种方法:

方法一: file_get_contents获取

<span style="white-space:pre"></span>$url="http://www..com/";

<span style="white-space:pre"></span>$fh= file_get_contents

('http://www.hxfzzx.com/news/fzfj/');<span style="white-space:pre"></span>echo $fh;

拓展资料

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。

用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

‘拾’ OkHttp源码分析:五大拦截器详解

主要完成两件事: 重试与重定向

重试与重定向拦截器主要处理Response,可以看到RouteException和IOException都是调用了recover,返回true表示允许重试。允许重试—>continue—> while (true)—>realChain.proceed,这就完成了重试的过程。

接着看重定向

重定向总结

另附HTTP响应状态码分类:

小结: RetryAndFollowUpInterceptor是整个责任链中的第一个,首次接触到Request和最后接收Response的角色,它的主要功能是判断是否需要重试与重定向。

重试的前提是出现了RouteException或IOException,会通过recover方法进行判断是否进行重试。

重定向是发生在重试判定后,不满足重试的条件,会进一步调用followUpRequest根据Response的响应码进行重定向操作。

补全请求头:

小结: BridgeInterceptor是连接应用程序和服务器的桥梁,它为我们补全请求头,将请求转化为符合网络规范的Request。得到响应后:1.保存Cookie,在下次请求会读取对应的cookie数据设置进请求头,默认cookieJar不提供的实现 2.如果使用gzip返回的数据,则使用 GzipSource 包装便于解析。

缓存拦截器顾名思义处理缓存的,但是要建立在get请求的基础上,我们可以去通过okHttpClient.cache(cache)去设置。缓存拦截器的处理流程:

1.从缓存中取出对应请求的响应缓存

2.通过CacheStrategy判断使用缓存或发起网络请求,此对象中的networkRequest代表需要发起网络请求,cacheResponse表示直接使用缓存。

即: networkRequest存在则优先发起网络请求,否则使用cacheResponse缓存,若都不存在则请求失败。

如果最终判定不能使用缓存,需要发起网络请求,则来到下一个拦截器ConnectInterceptor

StreamAllocation对象是在第一个拦截器RetryAndFollowUpInterceptor中初始化完成的(设置了连接池、url路径等),当一个请求发出,需要建立连接,建立连接之后需要使用流来读取数据,这个StreamAllocation就是协调请求、连接与数据流三者之前的关系,它负责为一次请求寻找连接,然后获得流来实现网络通信。

StreamAllocation对象有两个关键角色:

真正的连接是在RealConnection中实现的,连接由ConnectionPool管理。

接着我们看下RealConnection的创建和连接的建立:

streamAllocation.newStream—>findHealthyConnection—>findConnection

findConnection:

①StreamAllocation的connection如果可以复用则复用

②如果connection不能复用,则从连接池中获取RealConnection对象,获取成功则返回

③如果连接池里没有,则new一个RealConnection对象

④调用RealConnection的connect()方法发起请求

⑤将RealConnection对象存进连接池中,以便下次复用

⑥返回RealConnection对象

小结:

ConnectInterceptor拦截器从拦截器链中获取StreamAllocation对象,这个对象在第一个拦截器中创建,在ConnectInterceptor中才用到。

执行StreamAllocation对象的newStream方法创建HttpCodec对象,用来编码HTTP request和解码HTTP response。

newStream方法里面通过findConnection方法返回了一个RealConnection对象。

StreamAllocation对象的connect方法拿到上面返回的RealConnection对象,这个RealConnection对象是用来进行实际的网络IO传输的。

writeRequestHeaders和readResponseHeaders(以Http2Codec为例)

小结: CallServerInterceptor完成HTTP协议报文的封装和解析。

①获取拦截器链中的HttpCodec、StreamAllocation、RealConnection对象

②调用httpCodec.writeRequestHeaders(request)将请求头写入缓存

③判断是否有请求体,如果有,请求头通过携带特殊字段 Expect:100-continue来询问服务器是否愿意接受请求体。(一般用于上传大容量请求体或者需要验证)

④通过httpCodec.finishRequest()结束请求

⑤通过responseBuilder构建Response

⑥返回Response

热点内容
哪里修安卓手机最好 发布:2025-05-16 07:58:25 浏览:824
服务器和电脑是什么区别 发布:2025-05-16 07:58:24 浏览:719
安卓116是什么意思 发布:2025-05-16 07:44:59 浏览:590
配置低而动力好的车怎么选 发布:2025-05-16 07:44:15 浏览:900
如何退出登录的服务器界面 发布:2025-05-16 07:41:58 浏览:71
机斗勇者2勇者证密码多少 发布:2025-05-16 07:40:18 浏览:47
sql字符串包含字符串 发布:2025-05-16 07:37:29 浏览:995
java制作教程视频 发布:2025-05-16 07:35:55 浏览:251
搞笑解压舞 发布:2025-05-16 07:25:44 浏览:265
c封装源码 发布:2025-05-16 07:18:34 浏览:796