精华内容
下载资源
问答
  • Springboot gzip解压http数据流

    千次阅读 2019-07-25 11:00:00
    * GZIP处理Filter */ @WebFilter(filterName = "httpServletGzipFilter", urlPatterns = "/") public class HttpServletGzipFilter implements Filter { @Override public void destroy() {} ...

    编写Filter

    /**
     * GZIP处理Filter
     */
    @WebFilter(filterName = "httpServletGzipFilter", urlPatterns = "/")
    public class HttpServletGzipFilter implements Filter {
        @Override
        public void destroy() {}
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request), response);
        }
        @Override
        public void init(FilterConfig arg0) throws ServletException {}
    }
    
    @Slf4j
    class HttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper {
        private HttpServletRequest request;
    
        public HttpServletRequestWrapper(HttpServletRequest request) {
            super(request);
            this.request = request;
        }
        
        /**
         * 根据 request header 的 Content-Encoding 判断是否启用 gzip 解压数据流
         * @return
         * @throws IOException
         */
        @Override
        public ServletInputStream getInputStream() throws IOException {
            ServletInputStream stream = request.getInputStream();
            String contentEncoding = request.getHeader("Content-Encoding");
            if (null != contentEncoding && contentEncoding.indexOf("gzip") != -1) {
                try {
                    final GZIPInputStream gzipInputStream = new GZIPInputStream(stream);
                    ServletInputStream newStream = new ServletInputStream() {
                        @Override
                        public int read() throws IOException {
                            return gzipInputStream.read();
                        }
    
                        @Override
                        public boolean isFinished() {
                            return false;
                        }
    
                        @Override
                        public boolean isReady() {
                            return false;
                        }
    
                        @Override
                        public void setReadListener(ReadListener readListener) {}
                    };
                    return newStream;
                } catch (Exception e) {
                    log.error("uncompress content fail.", e);
                }
            }
    
            return stream;
        }
    }
    

    注册Filter交给Spring管理

    @Configuration
    public class HttpServletFilterConfig {
        /**
         * 注册 HttpServletFilter
         *
         * @return
         */
        @Bean
        public FilterRegistrationBean filterRegistrationBean() {
            FilterRegistrationBean registrationBean = new FilterRegistrationBean();
            registrationBean.setFilter(new HttpServletGzipFilter());
    
            List<String> urlPatterns = new ArrayList<>();
            urlPatterns.add("/*");
            registrationBean.setUrlPatterns(urlPatterns);
    
            return registrationBean;
        }
    }
    

    Controller中获取Request body数据

    public abstract class BaseController {
        /**
         * 获取GZIP解压后的消息体
         *
         * @param request
         * @return
         */
        protected String getRequestBody(HttpServletRequest request) {
            try {
                ServletInputStream inputStream = request.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
    
                return sb.toString();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    测试验证

    编写测试请求处理器,并使用okhttp进行验证。

    @RestController
    @RequestMapping("/gzip")
    public class testController extends BaseController {
        @RequestMapping(value = "/requstData")
        public String requstData(HttpServletRequest request) {
            return getRequestBody(request);
        }
    }
    

    编写gzip测试类

    public class GzipTest {
        public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
    
        @Test
        public void gzipTest() {
            String url = "http://localhost:8080/gzip/requstData";
            String str = "%5-1sdf22322222sedssf测试sdklasdkgnfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff!@#$%^&****()_+=";
            try {
                String responseData = post(url, str);
                System.out.println(responseData);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public String post(String url, String json) throws IOException {
            OkHttpClient client = new OkHttpClient.Builder()
            		// 通过GzipRequestInterceptor类拦截响应,自动处理gzip解压
                    .addInterceptor(new GzipRequestInterceptor())
                    .build();
    
            RequestBody body = RequestBody.create(json, JSON);
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            try (Response response = client.newCall(request).execute()) {
                return response.body().string();
            }
        }
    
        class GzipRequestInterceptor implements Interceptor {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request originalRequest = chain.request();
                if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {
                    return chain.proceed(originalRequest);
                }
    
                Request compressedRequest = originalRequest.newBuilder()
                        .header("Content-Encoding", "gzip")
                        .method(originalRequest.method(), gzip(originalRequest.body()))
                        .build();
                return chain.proceed(compressedRequest);
            }
    
            private RequestBody gzip(final RequestBody body) {
                return new RequestBody() {
                    @Override
                    public MediaType contentType() {
                        return body.contentType();
                    }
    
                    @Override
                    public long contentLength() {
                        // We don't know the compressed length in advance!
                        return -1;
                    }
    
                    @Override
                    public void writeTo(BufferedSink sink) throws IOException {
                        BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
                        body.writeTo(gzipSink);
                        gzipSink.close();
                    }
                };
            }
        }
    }
    

    测试结果
    在这里插入图片描述

    参考文献

    https://www.jianshu.com/p/a9d861732445
    https://blog.csdn.net/aiynmimi/article/details/77453809

    展开全文
  • zlib解压httpgzip数据

    2012-08-10 00:08:22
    zlib解压 httpgzip数据解压
  • gzip解压

    千次阅读 2016-09-20 15:49:25
     1、首先说为什么采用zlib解压,因为zlib可以解压内存数据。 2、下载zlib库后,自己在projcts目录里面根据需要编译lib库 3、静态链接只需要zlib.h ;zconf.h;zlib.lib三个文件即可(动态.../* HTTP gzip decomp
    

    1、首先说为什么采用zlib解压,因为zlib可以解压内存数据。

    2、下载zlib库后,自己在projcts目录里面根据需要编译lib库

    3、静态链接只需要zlib.h ;zconf.h;zlib.lib三个文件即可(动态的不介绍了)

    4、解压函数:

    1. /* HTTP gzip decompress */  
    2. int httpgzdecompress(Byte *zdata, uLong nzdata,  
    3.     Byte *data, uLong *ndata)  
    4. {  
    5.     int err = 0;  
    6.     z_stream d_stream = { 0 }; /* decompression stream */  
    7.     static char dummy_head[2] =  
    8.     {  
    9.         0x8 + 0x7 * 0x10,  
    10.         (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,  
    11.     };  
    12.     d_stream.zalloc = (alloc_func)0;  
    13.     d_stream.zfree = (free_func)0;  
    14.     d_stream.opaque = (voidpf)0;  
    15.     d_stream.next_in = zdata;  
    16.     d_stream.avail_in = 0;  
    17.     d_stream.next_out = data;  
    18.     //if (inflateInit2(&d_stream, -MAX_WBITS) != Z_OK) return -1;  
    19.     if (inflateInit2(&d_stream, 47) != Z_OK) return -1;  
    20.     while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {  
    21.         d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */  
    22.         if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;  
    23.         if (err != Z_OK)  
    24.         {  
    25.             if (err == Z_DATA_ERROR)  
    26.             {  
    27.                 d_stream.next_in = (Bytef*)dummy_head;  
    28.                 d_stream.avail_in = sizeof(dummy_head);  
    29.                 if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)  
    30.                 {  
    31.                     return -1;  
    32.                 }  
    33.             }  
    34.             else return -1;  
    35.         }  
    36.     }  
    37.     if (inflateEnd(&d_stream) != Z_OK) return -1;  
    38.     *ndata = d_stream.total_out;  
    39.     return 0;  
    40. }  
    /* HTTP gzip decompress */
    int httpgzdecompress(Byte *zdata, uLong nzdata,
    	Byte *data, uLong *ndata)
    {
    	int err = 0;
    	z_stream d_stream = { 0 }; /* decompression stream */
    	static char dummy_head[2] =
    	{
    		0x8 + 0x7 * 0x10,
    		(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
    	};
    	d_stream.zalloc = (alloc_func)0;
    	d_stream.zfree = (free_func)0;
    	d_stream.opaque = (voidpf)0;
    	d_stream.next_in = zdata;
    	d_stream.avail_in = 0;
    	d_stream.next_out = data;
    	//if (inflateInit2(&d_stream, -MAX_WBITS) != Z_OK) return -1;
    	if (inflateInit2(&d_stream, 47) != Z_OK) return -1;
    	while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {
    		d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
    		if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
    		if (err != Z_OK)
    		{
    			if (err == Z_DATA_ERROR)
    			{
    				d_stream.next_in = (Bytef*)dummy_head;
    				d_stream.avail_in = sizeof(dummy_head);
    				if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
    				{
    					return -1;
    				}
    			}
    			else return -1;
    		}
    	}
    	if (inflateEnd(&d_stream) != Z_OK) return -1;
    	*ndata = d_stream.total_out;
    	return 0;
    }
    直接调用就OK了 注意传入的buffer数据和长度都要赋值

    eg:

      char* pDest =  new char[1024 * 16];
      uLong ulLength = 1024*16;
      gzdecompress((Byte*)precvBuff, nCount, (Byte*)pDest, &ulLength);



    展开全文
  • python http请求时gzip解压

    千次阅读 2015-01-09 16:20:02
    #!/usr/bin/env python # encoding=utf-8   import urllib2, httplib import StringIO, gzip  ...#解压gzip def gzdecode(data) :  compressedstream = StringIO.StringIO(data)  gziper = gzip
    #!/usr/bin/env python  
    
    # encoding=utf-8  
      
    import urllib2, httplib  
    import StringIO, gzip 


    #解压gzip
    def gzdecode(data) :
        compressedstream = StringIO.StringIO(data)
        gziper = gzip.GzipFile(fileobj=compressedstream)  
        data2 = gziper.read()   # 读取解压缩后数据 

        return data2 

    转自:http://blog.csdn.net/wzq9706/article/details/25122417

    展开全文
  • 关于HTTP GZIP解压问题

    万次阅读 2012-07-09 11:32:23
    寻找gzip 获取一个网页数据返回的编码类型是gzip,我该怎么解压缩 HTTP头获取? 如何用vb获取网络上的xml文件,并解析内容 ...关于GZIP格式解压缩HTTP数据包的问题,我使用ZLIB为什么必须先保存文件,内存解压缩出错
    寻找gzip 
    获取一个网页数据返回的编码类型是gzip,我该怎么解压缩
    HTTP头获取?
    如何用vb获取网络上的xml文件,并解析内容
    关于GZIP的解码
    怎样解gzip的压缩
    请问Wininet是否可以进行Gzip的http传输,尤其是post的时候!如果可以如何实现?
    关于GZIP格式解压缩HTTP数据包的问题,我使用ZLIB为什么必须先保存文件,内存解压缩出错
    无法获取$_SERVER["HTTP_REFERER"]
    关于GZIP的问题,高分求解!!
    .....
    等都是关于gzip解压的
    问题:
    提取http的gzip内容,并解压。
    关键点:
    1 提取http数据包的内容,主要是gzip格式的
    2 数据包的重组
    3 在内存中解压gzip数据

    这两个周过来,都是在网上过来的,得到网友的帮助不少,很是感激,为了不让这个问题继续困扰后来的un_gziper,特写此文。
    1 数据包内存的提取:
    关键的地方是找到gzip内存的开始位置以及如何确定gzip内容的大小
    开始位置:“Content-Encoding: gzip\r\n\r\n”
    gzip大小:“Content-Length:”后面的就是了
    2 数据包的重组,一般网页的内容很少是一个数据包可以装得下的,所以都得进行gzip之后再用多个数据包进行传输
    关键的地方是:
    get请求数据包的ack和seq与http返回数据包的ack,seq有密切的联系:
    举例说明:
    get请求:ack=0,seq=0
    http1:seq=0,ack=584
    http2: seq=1420,ack=584
    ...
    简单的分析说明可以看出,我们的算法设计:
    首先得到get请求的ack,返回的数据包的seq等于这个值,同时记下这个数据包的ack,后面进行分包发送的http的数据包的ack都是这个值,这个是关键点之一,同时综合
    Content-Length就可以得到gzip的全部内容。
    至此,原始数据提取完毕,该是如何解压的问题了
    3解压gzip
    我做了上面的1,2步以后将内容保存到文件里面,用gzip命令可以打开,验证了数据的完整性。
    而后我采用了zlib提供的uncompress函数,和大多数的网友一样,都是犯了一个致命的错误,没有仔细的阅读zlib的文档!导致一次次无谓的识别!
    事实上zlib格式和gzib格式是有差别的,而uncompress是用来解压zlib格式文件的,这就是为什么会出现用compress函数压缩的数据,在内存中可以直接用uncompress函数进行解压的,而就不能解压gzip数据的问题!

    后来测试了zlib包里面的example例子,算是对zlib有了一点点的了解,应该用inflate类函数进行解压!
    当然这样遇到了问题,格式不对!
    后来在网上看到的帖子:gzip格式用inflate函数还不行,必需要用inflateInit2(&strm, 47); !!!!!!!!!!!!!!!!!!
    问题解决!
    这里借用那位网友的源代码,同时对他表示感谢!

    int inflate_read(char *source,int len,char **dest,int gzip)
    {
    int ret;
    unsigned have;
    z_stream strm;
    unsigned char out[CHUNK];
    int totalsize = 0;

    /* allocate inflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = 0;
    strm.next_in = Z_NULL;

    if(gzip)
    ret = inflateInit2(&strm, 47);
    else
    ret = inflateInit(&strm);

    if (ret != Z_OK)
    return ret;

    strm.avail_in = len;
    strm.next_in = source;

    /* run inflate() on input until output buffer not full */
    do {
    strm.avail_out = CHUNK;
    strm.next_out = out;
    ret = inflate(&strm, Z_NO_FLUSH);
    assert(ret != Z_STREAM_ERROR); /* state not clobbered */
    switch (ret) {
    case Z_NEED_DICT:
    ret = Z_DATA_ERROR; /* and fall through */
    case Z_DATA_ERROR:
    case Z_MEM_ERROR:
    inflateEnd(&strm);
    return ret;
    }
    have = CHUNK - strm.avail_out;
    totalsize += have;
    *dest = realloc(*dest,totalsize);
    memcpy(*dest + totalsize - have,out,have);
    } while (strm.avail_out == 0);

    /* clean up and return */
    (void)inflateEnd(&strm);
    return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
    }


    后记,这个过程是痛苦的,但也是幸福的!
    这里我发起一个小小的倡议,对所有关注gzip解压的问题的网友:
    我们都遇到了一个问题就是zlib的文档都是英文的,有个别网友翻译了开头的一小部分,但是这是不够的!
    所以,我希望有兴趣的朋友可以一起来帮zlib的文档翻译成为中文!

    有兴趣的可以加我!


    转自:http://hi.baidu.com/oathevil/blog/item/702f54cd2ce0531b00e9285d.html

    展开全文
  • c语言解压http中的gzip文件

    千次阅读 2018-05-24 15:24:39
    这是一篇流水账,记录前两天在解决http解压gzip数据流程。(写完这篇就可以做其他工作了~~)目的:c语言http包中解析gzip数据一、 tcpdump抓包,这条数据包是我试用某app时收到的包,咱们先是用wireshark解析。图...
  • golang gzip解压

    2017-02-14 13:11:00
    "compress/gzip" "encoding/binary" "io/ioutil" ) func ParseGzip(data []byte) ([]byte, error) { b := new(bytes.Buffer) binary.Write(b, binary.LittleEndian, data) r, err := gzip.NewReader(b) ...
  • 解压HTTP gzip

    千次阅读 2010-05-05 00:24:00
    解压HTTP gzip的 收藏 #include #include #include #include /* Compress data */int zcompress(Bytef *data, uLong ndata, Bytef *zdata, uLong *nzdata){ z_stream c_stream; int err = 0; if(data && ndata > ...
  • 爬虫练习,通过添加http header来模拟浏览器访问,绕过网站反爬策略,文中也介绍了gzip解压的实现。
  • iOS客户端的gzip解压

    万次阅读 2013-07-06 19:39:24
    当服务器返回的httpHeader的"Content-Encoding" 属性的值是gzip时,数据会自动被解压缩,但有时候在客户端还没拿到数据的时候,就已经被某些网关解压了,这样gzip就没有起到作用。因此可以约定其他策略,防止网关...
  • 客户端的gzip解压

    2012-10-03 23:19:28
    当服务器返回的httpHeader的"Content-Encoding" 属性的值是gzip时,数据会自动被解压缩,但有时候在客户端还没拿到数据的时候,就已经被某些网关解压了,这样gzip就没有起到作用。因此可以约定其他策略,防止网关...
  • iOS中的gzip解压

    千次阅读 2017-03-18 20:29:29
    搜索一 下有人说gzip压缩的用urlrequest可以自己解压,但是这必须从服务器返回的header中有accept-Encoding说明是gzip 的。也就是用这句就可以实现自解压: [urlRequest addValue:@"gzip" forHTTPHeaderField:...
  • Qt笔记8--zlib实现gzip解压

    万次阅读 2019-09-07 12:16:26
    Qt笔记8--zlib实现gzip解压 几个月前,由于需要使用过zlib解压文本和图片,现在将当初的方法记录在这里,以便于后续查阅! 1、功能及使用方法 功能: 1)解压gzip压缩的字符串 2)解压gzip压缩的图片 方法...
  • HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送。如果服务器支持压缩,它将返回由 gzip 压缩的数据...httplib没有gzip解压功能,需要额外进行gzip解压,方法: ...
  • js解压gzip

    2019-11-22 17:21:07
    //js解压gzip function unzip(key) { // 解压 // 将二进制字符串转换为字符数组 var charData = key.split('').map(function (x) { return x.charCodeAt(0); }); // 将数字数组转换成字节数组 var binData = ...
  • python gzip http post请求结果解压

    千次阅读 2015-11-04 23:15:28
    #!/usr/bin/env python # encoding=utf-8 import urllib2, httplib import StringIO, gzip ...#解压gzip def gzdecode(data) : compressedstream = StringIO.StringIO(data) gziper = gzip.GzipFile(f
  • gzip解压和压缩

    万次阅读 2009-03-23 09:46:00
    我发现网上很少有这样完整例子...我现在把从网上找到例子帖出来,可以解压HTTP gzip的 #include #include #include #include /* Compress data */int zcompress(Bytef *data, uLong ndata, Bytef *zdata, uLong *nzdat
  • java实现html网页的gzip解压   在对网页抓包中发现,返回的很多网页是经过压缩的,比如访问谷歌首页,返回的头文件中包含Content-Encoding gzip 使用gzip可以省下很多网页流量,在网速一定的情况下,可以提高访问效率...
  • IOS解压GZIP

    2014-08-04 16:33:07
    当服务器返回的httpHeader的"Content-Encoding" 属性的值是gzip时,数据会自动被解压缩,但有时候在客户端还没拿到数据的时候,就已经被某些网关解压了,这样gzip就没有起到作用。因此可以约定其他策略,防止网关...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,647
精华内容 23,058
关键字:

gzip解压http