전송 인코딩이 청크 될 때 HttpsUrlconnection을 사용하여 응답을 읽는 방법

user3565529

내부적으로 HttpsUrlConnection을 사용하여 다른 Url을 호출하는 서블릿을 작성하고 있습니다. 서블릿에서 HttpsUrlConnection 호출에서받은 것과 동일한 응답과 동일한 응답 헤더를 반환해야합니다.

이를 위해 다음을 사용하여 모든 헤더를 읽었습니다 getHeaderFields(). 내 서블릿의 Httpservletresponse 객체에 반환 된 헤더를 복사합니다.

또한, 그 후 응답을 읽으려고합니다 connection.getErrorStream()(이것은 대부분 서버가 400을 반환 할 때 발생합니다). 그래서 getErrorStream을 사용합니다. 그런 다음 바이트를 읽고 서블릿의 HttpServletResponse 출력 스트림에 바이트를 복사합니다.

이제 이것은 잘 작동하는 경우가 있습니다.

그러나 연결을 사용하여 호출하는 서버가 Transfer Encoding 청크로 응답을 반환하면 서블릿 API를 호출 할 때 응답 및 응답 헤더를 Httpservlet 응답에 복사하면 잘못된 청크 인코딩에 대한 오류가 반환됩니다.

이 경우 로그에서 getHeaderFields를 사용하여 헤더를 읽을 때 내가 보는 첫 번째 헤더는 Transfer encoding chunked이고 다음 헤더 이름은 null이고 값은 HTTP 1/1입니다.

또한 내가 본 반응도 적절하지 않습니다.

이 경우 httpsurlconnection에서 응답 헤더와 응답 본문을 읽고 서블릿에서 올바르게 반환하는 방법은 무엇입니까?

JimHawkins

청크 인코딩과 비슷한 문제가 발생했습니다. 차이점은 내 서블릿이 내부적으로 HTTPS 대신 HTTP를 사용한다는 것입니다.

헤더 필드를 복사하는 방법도 사용합니다. 하지만 서블릿 컨테이너에서 관리하는 헤더 목록을 제공하므로 생성, 복사 또는 편집하지 않습니다.

 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

청크 전송 인코딩 하이퍼 응답을 보내는 방법은 무엇입니까?

분류에서Dev

gzip 압축 및 청크 전송 인코딩을 사용하여 C 소켓 http 서버에서 이미지의 이상한 왜곡을 수정하는 방법

분류에서Dev

Spring Integration DSL을 사용하여 rabbitMQ 응답 큐에서 응답이 올 때 HTTP 요청 / 응답을 구현하는 방법은 무엇입니까?

분류에서Dev

TestCafe RequestLogger-각 요청 개체에 대해 어설 션을 수행하기 전에 모든 응답이 반환 될 때까지 기다리는 방법

분류에서Dev

SwiftUI : 바인딩 값이 변경 될 때 네트워크 요청을 만드는 방법은 무엇입니까?

분류에서Dev

sdiff 출력이 파일로 전송 될 때 형식을 유지하는 방법은 무엇입니까?

분류에서Dev

자바 스크립트를 사용하여 if 문이 전달 될 때까지 버튼을 비활성화하는 방법은 무엇입니까?

분류에서Dev

Actions SDK가 포함 된 Google Actions를 이행 도구로 사용하여 미디어 응답이 전송되었을 때 "다음"및 "이전"을 캡처하고 처리하는 방법이 있습니까?

분류에서Dev

Postman에서 "요청이 전송 될 때 계산 됨"헤더를 보는 방법

분류에서Dev

클라이언트가 서버에 응답하지 않을 때 웹 페이지 재전송을 중지하는 방법

분류에서Dev

guzzle을 사용하여 응답 다운로드를 시작하기 전에 엄청난 HTTP 응답을받을 것임을 감지하는 방법

분류에서Dev

API로 전송 된 요청과 페이지 요소 클릭시 응답을 확인하는 방법이 있습니까?

분류에서Dev

ListView에 바인딩 될 때 목록을 업데이트하는 방법

분류에서Dev

"= heist roleid"메시지가 표시 될 때 내 봇이 지정된 역할 ID에 메시지 전송 권한을 부여하도록하는 방법

분류에서Dev

Play 프레임 워크를 사용하여 스트림을 HTTP 청크 응답으로 인라인으로 표시하는 방법

분류에서Dev

laravel에서 반환 된 응답을 인코딩하는 방법

분류에서Dev

포스트 요청이 전송되었을 때 응답이없는 것 같습니다.

분류에서Dev

Api 응답이 백그라운드에서 수신 될 때 로컬 알림을 사용하는 방법은 무엇입니까?

분류에서Dev

awk를 사용하여 조건이 충족 될 때 선택 열을 인쇄하는 방법

분류에서Dev

세션 및 쿠키 조합, 요청이 서버로 전송 될 때 올바른 사용자를 식별하는 방법

분류에서Dev

Tampermonkey 스크립트를 사용하여 나가는 요청과 웹 사이트의 응답을 추적하는 방법은 무엇입니까?

분류에서Dev

Scotty / WAI에서 응답이 완전히 전송 된 후 작업을 실행하는 방법

분류에서Dev

앱이 백그라운드로 전환 될 때 응답을 기다리는 중

분류에서Dev

파이썬 http 응답을 디코딩하는 방법

분류에서Dev

다음 작업을 실행하기 전에 요청이 완료 될 때까지 기다리는 방법 (Xcode 11)

분류에서Dev

파이썬 사전을 인코딩하는 방법?

분류에서Dev

한 파일의 값이 다른 파일의 인수로 사용될 때 여러 JSON 파일을 Onservable 배열에 전달하는 방법은 무엇입니까?

분류에서Dev

모든 스크립트가 완전히로드 될 때까지 이미지 클릭을 방지하는 방법

분류에서Dev

Python request.head () : 예외 대신 Python 요청 모듈을 사용하여 응답 코드를 얻는 방법

Related 관련 기사

  1. 1

    청크 전송 인코딩 하이퍼 응답을 보내는 방법은 무엇입니까?

  2. 2

    gzip 압축 및 청크 전송 인코딩을 사용하여 C 소켓 http 서버에서 이미지의 이상한 왜곡을 수정하는 방법

  3. 3

    Spring Integration DSL을 사용하여 rabbitMQ 응답 큐에서 응답이 올 때 HTTP 요청 / 응답을 구현하는 방법은 무엇입니까?

  4. 4

    TestCafe RequestLogger-각 요청 개체에 대해 어설 션을 수행하기 전에 모든 응답이 반환 될 때까지 기다리는 방법

  5. 5

    SwiftUI : 바인딩 값이 변경 될 때 네트워크 요청을 만드는 방법은 무엇입니까?

  6. 6

    sdiff 출력이 파일로 전송 될 때 형식을 유지하는 방법은 무엇입니까?

  7. 7

    자바 스크립트를 사용하여 if 문이 전달 될 때까지 버튼을 비활성화하는 방법은 무엇입니까?

  8. 8

    Actions SDK가 포함 된 Google Actions를 이행 도구로 사용하여 미디어 응답이 전송되었을 때 "다음"및 "이전"을 캡처하고 처리하는 방법이 있습니까?

  9. 9

    Postman에서 "요청이 전송 될 때 계산 됨"헤더를 보는 방법

  10. 10

    클라이언트가 서버에 응답하지 않을 때 웹 페이지 재전송을 중지하는 방법

  11. 11

    guzzle을 사용하여 응답 다운로드를 시작하기 전에 엄청난 HTTP 응답을받을 것임을 감지하는 방법

  12. 12

    API로 전송 된 요청과 페이지 요소 클릭시 응답을 확인하는 방법이 있습니까?

  13. 13

    ListView에 바인딩 될 때 목록을 업데이트하는 방법

  14. 14

    "= heist roleid"메시지가 표시 될 때 내 봇이 지정된 역할 ID에 메시지 전송 권한을 부여하도록하는 방법

  15. 15

    Play 프레임 워크를 사용하여 스트림을 HTTP 청크 응답으로 인라인으로 표시하는 방법

  16. 16

    laravel에서 반환 된 응답을 인코딩하는 방법

  17. 17

    포스트 요청이 전송되었을 때 응답이없는 것 같습니다.

  18. 18

    Api 응답이 백그라운드에서 수신 될 때 로컬 알림을 사용하는 방법은 무엇입니까?

  19. 19

    awk를 사용하여 조건이 충족 될 때 선택 열을 인쇄하는 방법

  20. 20

    세션 및 쿠키 조합, 요청이 서버로 전송 될 때 올바른 사용자를 식별하는 방법

  21. 21

    Tampermonkey 스크립트를 사용하여 나가는 요청과 웹 사이트의 응답을 추적하는 방법은 무엇입니까?

  22. 22

    Scotty / WAI에서 응답이 완전히 전송 된 후 작업을 실행하는 방법

  23. 23

    앱이 백그라운드로 전환 될 때 응답을 기다리는 중

  24. 24

    파이썬 http 응답을 디코딩하는 방법

  25. 25

    다음 작업을 실행하기 전에 요청이 완료 될 때까지 기다리는 방법 (Xcode 11)

  26. 26

    파이썬 사전을 인코딩하는 방법?

  27. 27

    한 파일의 값이 다른 파일의 인수로 사용될 때 여러 JSON 파일을 Onservable 배열에 전달하는 방법은 무엇입니까?

  28. 28

    모든 스크립트가 완전히로드 될 때까지 이미지 클릭을 방지하는 방법

  29. 29

    Python request.head () : 예외 대신 Python 요청 모듈을 사용하여 응답 코드를 얻는 방법

뜨겁다태그

보관