servletResponse.setStatus(response.getStatus());
@Test public void testSetResponse() throws Exception { RibbonOrigin origin = new RibbonOrigin("blah"); origin = Mockito.spy(origin); CaseInsensitiveMultiMap headers = new CaseInsensitiveMultiMap(); headers.addHeader("test", "test"); headers.addHeader("content-length", "100"); byte[] body = "test-body".getBytes("UTF-8"); InputStream inp = new ByteArrayInputStream(body); Mockito.when(proxyResp.getStatus()).thenReturn(200); Mockito.when(proxyResp.getInputStream()).thenReturn(inp); Mockito.when(proxyResp.hasEntity()).thenReturn(true); Mockito.when(proxyResp.getHttpHeaders()).thenReturn(headers); HttpResponseMessage response = origin.createHttpResponseMessage(proxyResp, request); Assert.assertEquals(200, response.getStatus()); byte[] respBodyBytes = ByteBufUtils.toBytes(response.getBodyStream().toBlocking().single()); Assert.assertNotNull(respBodyBytes); Assert.assertEquals(body.length, respBodyBytes.length); Assert.assertTrue(response.getHeaders().contains("test", "test")); } }
@Override public Observable<ZuulMessage> write(ZuulMessage msg, HttpServerResponse nativeResponse) { HttpResponseMessage zuulResp = (HttpResponseMessage) msg; // Set the response status code. nativeResponse.setStatus(HttpResponseStatus.valueOf(zuulResp.getStatus())); // Now set all of the response headers - note this is a multi-set in keeping with HTTP semantics for (Map.Entry<String, String> entry : zuulResp.getHeaders().entries()) { nativeResponse.getHeaders().add(entry.getKey(), entry.getValue()); } // Write response body stream as received. Observable<ZuulMessage> chain; Observable<ByteBuf> bodyStream = zuulResp.getBodyStream(); if (bodyStream != null) { chain = bodyStream .doOnNext(bb -> nativeResponse.writeBytesAndFlush(bb)) .ignoreElements() .doOnCompleted(() -> nativeResponse.close()) .map(bb -> msg); } else { chain = Observable.just(msg); } return chain; }
@Override public void handle(HttpResponseMessage response) { HttpRequestMessage request = response.getRequest(); SessionContext context = response.getContext(); long duration = context.getTimings().getRequest().getDuration(); int responseBodySize = response.getBody() == null ? 0 : response.getBody().length; // Write to access log. accessLogPublisher.publish(new SimpleAccessRecord(LocalDateTime.now(), response.getStatus(), request.getMethod(), request.getPathAndQuery(), duration, responseBodySize, request.getHeaders(), response.getHeaders() )); // Publish request-level metrics. if (requestMetricsPublisher != null) { requestMetricsPublisher.collectAndPublish(context); } } }