传输编码分块时如何使用HttpsUrlconnection读取响应

用户名

我正在编写一个内部使用HttpsUrlConnection调用另一个URL的servlet。从servlet,我必须返回与从HttpsUrlConnection调用接收到的相同的响应和相同的响应标头。

为此,我使用getHeaderFields()以下命令读取所有标题:将返回的标题复制到我的Servlet的Httpservletresponse对象。

另外,在那之后,我尝试使用connection.getErrorStream()该方法读取响应(这主要是在服务器返回状态> 400时发生的),这就是为什么我使用getErrorStream的原因。然后,我读取字节并将字节复制到我的Servlet的HttpServletResponse输出流中。

现在在某些情况下可以正常工作。

但是,当我使用连接调用的服务器返回带有传输编码的分块的响应时,然后调用我的Servlet API时,如果我将响应和响应标头复制到Httpservlet响应,它将返回错误的无效块编码。

在这种情况下,在日志中,我看到当我使用getHeaderFields读取标头时,看到的第一个标头是分块的传输编码,然后下一个标头名称为null,其值为HTTP 1/1。

另外,我看到的回应也不正确。

在这种情况下,如何从httpsurlconnection读取响应标头和响应主体,并从我的servlet中正确返回它们?

吉姆·霍金斯

我在分块编码时遇到了类似的问题。与您不同的是,我的servlet在内部使用HTTP而不是HTTPS。

我也使用一种方法来复制标题字段。但是我提供了由servlet容器管理的标头列表,因此我不创建,复制或编辑它们:

 private static final Set forbiddenCopyHeaders = new HashSet<>(Arrays.asList(new String[]{
            "connection"
            , "transfer-encoding"
            , "content-length"
            , "via"
            , "x-forwarded-for"
            , "x-forwarded-host"
            , "x-forwarded-server"
    }));

这些是我用于复制响应头的方法:

  private void copyResponseHeaders(CloseableHttpResponse internResponse, HttpServletResponse response)
    {
        Header[] headers = internResponse.getAllHeaders();
        Header[] connHeaders = internResponse.getHeaders("connection");
        StringBuilder connectionValue = new StringBuilder();

        for (Header connHeader : connHeaders)
        {
            connectionValue.append(connHeader.getValue()).append(", ");
        }

        for (Header header : headers)
        {
            String headerName = header.getName();

            boolean copyAllowed = !forbiddenCopyHeaders.contains(headerName.toLowerCase())
                    && !StringUtils.containsIgnoreCase(connectionValue.toString(), headerName);

            if (copyAllowed)
            {
                if (response.containsHeader(headerName))
                {
                    response.addHeader(headerName, header.getValue());
                }
                else
                {
                    response.setHeader(headerName, header.getValue());
                }
            }
        }

        setViaHeader(internResponse, response);
    }

方法setViaHeader():

private void setViaHeader(CloseableHttpResponse response, HttpServletResponse customerResponse)
    {
        String serverHostName = "companyServer";
        try
        {
            serverHostName = InetAddress.getLocalHost().getHostName();
        }
        catch (UnknownHostException e)
        {
            logger.error("für den VIA-Header kann der Hostname nicht ermittelt werden", e);
            System.err.println("für den VIA-Header kann der Hostname nicht ermittelt werden: " +
                    ExceptionUtils.getStackTrace(e));
        }

        Header[] originalViaHeaders = response.getHeaders("via");
        StringBuilder via = new StringBuilder("");
        if ((originalViaHeaders != null) && (originalViaHeaders.length > 0))
        {
            for (Header viaHeader : originalViaHeaders)
            {
                via.append(viaHeader.getValue()).append(", ");
            }
        }
        via.append(response.getStatusLine().getProtocolVersion().toString()).append(" ").append(serverHostName);

        customerResponse.setHeader("via", via.toString());
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

传输编码分块时如何使用HttpsUrlconnection读取响应

来自分类Dev

如何发送分块传输编码的超级响应?

来自分类Dev

传输编码:分块

来自分类Dev

传输编码:分块

来自分类Dev

Node.js:如何禁用分块传输编码?

来自分类Dev

nginx分块传输编码失败

来自分类Dev

使用分块编码时CXF缓冲数据

来自分类Dev

HttpUrlConnection读取分块响应

来自分类Dev

读取分块响应

来自分类Dev

如何使用Play 2.5在分块响应中将Anorm大型查询结果流式传输到客户端

来自分类Dev

使用分块传输编码从scala Play服务器流式传输案例类对象

来自分类Dev

分块传输编码是否可以与Nancy,OWIN和HttpListener一起使用?

来自分类Dev

如何使用gzip压缩和分块传输编码修复c套接字http服务器中图像的怪异变形

来自分类Dev

避免对HTTP / 1.1响应进行分块编码

来自分类Dev

Nginx 分块编码响应随机截断

来自分类Dev

使用分块响应通过Spray从Play枚举器流式传输数据

来自分类Dev

使用分块响应通过Spray从Play枚举器流式传输数据

来自分类Dev

接收对HttpsURLConnection GET请求的编码响应

来自分类Dev

传输编码:分块的原因404系统找不到指定的文件

来自分类Dev

分块传输编码 - 页面显示不正确

来自分类Dev

分块传输编码终止序列和 TCP recv()

来自分类Dev

Sinatra :: Rack的流式传输不会分块响应

来自分类Dev

Sinatra :: Rack的流式传输不会分块响应

来自分类Dev

使用带有HTTP分块传输的尾部标头。如何使用它设置cookie

来自分类Dev

使用分块编码上传时,使用Haproxy + Nging接收到411个错误

来自分类Dev

是什么导致PHPExcel在使用分块过滤器时读取文件时使用大量内存?

来自分类Dev

使用分块请求时如何强制关闭 excon 连接

来自分类Dev

同时使用etag和分块编码?

来自分类Dev

在Spray的分块响应中使用Ack

Related 相关文章

  1. 1

    传输编码分块时如何使用HttpsUrlconnection读取响应

  2. 2

    如何发送分块传输编码的超级响应?

  3. 3

    传输编码:分块

  4. 4

    传输编码:分块

  5. 5

    Node.js:如何禁用分块传输编码?

  6. 6

    nginx分块传输编码失败

  7. 7

    使用分块编码时CXF缓冲数据

  8. 8

    HttpUrlConnection读取分块响应

  9. 9

    读取分块响应

  10. 10

    如何使用Play 2.5在分块响应中将Anorm大型查询结果流式传输到客户端

  11. 11

    使用分块传输编码从scala Play服务器流式传输案例类对象

  12. 12

    分块传输编码是否可以与Nancy,OWIN和HttpListener一起使用?

  13. 13

    如何使用gzip压缩和分块传输编码修复c套接字http服务器中图像的怪异变形

  14. 14

    避免对HTTP / 1.1响应进行分块编码

  15. 15

    Nginx 分块编码响应随机截断

  16. 16

    使用分块响应通过Spray从Play枚举器流式传输数据

  17. 17

    使用分块响应通过Spray从Play枚举器流式传输数据

  18. 18

    接收对HttpsURLConnection GET请求的编码响应

  19. 19

    传输编码:分块的原因404系统找不到指定的文件

  20. 20

    分块传输编码 - 页面显示不正确

  21. 21

    分块传输编码终止序列和 TCP recv()

  22. 22

    Sinatra :: Rack的流式传输不会分块响应

  23. 23

    Sinatra :: Rack的流式传输不会分块响应

  24. 24

    使用带有HTTP分块传输的尾部标头。如何使用它设置cookie

  25. 25

    使用分块编码上传时,使用Haproxy + Nging接收到411个错误

  26. 26

    是什么导致PHPExcel在使用分块过滤器时读取文件时使用大量内存?

  27. 27

    使用分块请求时如何强制关闭 excon 连接

  28. 28

    同时使用etag和分块编码?

  29. 29

    在Spray的分块响应中使用Ack

热门标签

归档