@Override public HttpStatus status() { return delegate.status(); }
@Override public Boolean apply(HttpHeaders headers) { return statusSet.contains(headers.status()) == sign; }
private HttpHeaders setHttpStatus(HttpHeaders headers) { if (headers.status() != null) { // Do not overwrite HTTP status. return headers; } final HttpStatus defaultHttpStatus = defaultHttpHeaders.status(); assert defaultHttpStatus != null; return headers.isImmutable() ? HttpHeaders.copyOf(headers).status(defaultHttpStatus) : headers.status(defaultHttpStatus); }
/** * Returns the status of the {@link Response}. * * @return the {@link HttpStatus}. {@link HttpStatus#UNKNOWN} if the {@link Response} has failed even * before receiving its first non-informational headers. * @throws RequestLogAvailabilityException if this property is not available yet */ default HttpStatus status() { final HttpStatus status = responseHeaders().status(); assert status != null; return status; }
/** * Returns the {@link HttpHeaderNames#STATUS STATUS} of this message. * * @return the status, or {@code null} if there's no such header */ @Nullable default HttpStatus status() { return headers().status(); }
ArmeriaClientHttpResponse(com.linecorp.armeria.common.HttpHeaders headers, ResponseBodyPublisher publisher, DataBufferFactoryWrapper<?> factoryWrapper) { this.headers = requireNonNull(headers, "headers"); final com.linecorp.armeria.common.HttpStatus status = headers.status(); checkArgument(status != null, "no status in HTTP headers"); this.status = status; body = Flux.from(publisher).cast(HttpData.class).map(factoryWrapper::toDataBuffer); }
@Override public void onNext(HttpObject o) { if (o instanceof HttpHeaders) { final HttpHeaders headers = (HttpHeaders) o; final HttpStatus status = headers.status(); if (status != null && status.codeClass() != HttpStatusClass.INFORMATIONAL && this.headers == null) { this.headers = headers; assert subscription != null; subscription.cancel(); } } }
@Override public CompletionStage<Backoff> shouldRetry(ClientRequestContext ctx, @Nullable Throwable cause) { final HttpStatus status; if (ctx.log().isAvailable(RequestLogAvailability.RESPONSE_HEADERS)) { status = ctx.log().responseHeaders().status(); } else { status = null; } return CompletableFuture.completedFuture(backoffFunction.apply(status, cause)); } }
@Override public CompletionStage<Boolean> shouldReportAsSuccess(ClientRequestContext ctx, @Nullable Throwable cause) { if (cause instanceof UnprocessedRequestException) { return CompletableFuture.completedFuture(null); // Neither success nor failure. } final HttpStatus status; if (ctx.log().isAvailable(RequestLogAvailability.RESPONSE_HEADERS)) { status = ctx.log().responseHeaders().status(); } else { status = null; } return CompletableFuture.completedFuture(function.apply(status, cause)); } }
/** * Sets the 'content-length' header to the response. */ private static void setContentLength(HttpRequest req, HttpHeaders headers, int contentLength) { // https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4 // prohibits to send message body for below cases. // and in those cases, content should be empty. if (req.method() == HttpMethod.HEAD || ArmeriaHttpUtil.isContentAlwaysEmpty(headers.status())) { return; } headers.setInt(HttpHeaderNames.CONTENT_LENGTH, contentLength); }
@Override protected HttpObject filter(HttpObject obj) { if (!(obj instanceof HttpHeaders)) { return obj; } final HttpHeaders headers = (HttpHeaders) obj; final HttpStatus status = headers.status(); if (status == null || status.codeClass() == HttpStatusClass.INFORMATIONAL) { return headers; } final HttpHeaders mutableHeaders = headers.toMutable(); setCorsResponseHeaders(ctx, req, mutableHeaders); return mutableHeaders.asImmutable(); } };
/** * Converts the headers of the given Netty HTTP/1.x response into Armeria HTTP/2 headers. */ public static HttpHeaders toArmeria(HttpResponse in) { final io.netty.handler.codec.http.HttpHeaders inHeaders = in.headers(); final HttpHeaders out = new DefaultHttpHeaders(true, inHeaders.size()); out.status(in.status().code()); // Add the HTTP headers which have not been consumed above toArmeria(inHeaders, out); return out; }
@Override public void onComplete() { final Iterator<HttpObject> it = received.build().iterator(); final HttpHeaders headers = (HttpHeaders) it.next(); assertThat(headers.status()).isEqualTo(HttpStatus.OK); assertThat(headers.contentType()).isEqualTo(MediaType.JSON_SEQ); // JSON Text Sequences: *(Record Separator[0x1E] JSON-text Line Feed[0x0A]) assertThat(((HttpData) it.next()).array()) .isEqualTo(new byte[] { 0x1E, '\"', 'a', '\"', 0x0A }); assertThat(((HttpData) it.next()).array()) .isEqualTo(new byte[] { 0x1E, '\"', 'b', '\"', 0x0A }); assertThat(((HttpData) it.next()).array()) .isEqualTo(new byte[] { 0x1E, '\"', 'c', '\"', 0x0A }); assertThat(((HttpData) it.next()).isEmpty()).isTrue(); assertThat(it.hasNext()).isFalse(); isFinished.set(true); } });
@Test public void completable() { final HttpClient client = HttpClient.of(rule.uri("/completable")); AggregatedHttpMessage msg; msg = client.get("/done").aggregate().join(); assertThat(msg.headers().status()).isEqualTo(HttpStatus.OK); msg = client.get("/error").aggregate().join(); assertThat(msg.headers().status()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); }
@Override public boolean tryWrite(HttpObject o) { if (o instanceof HttpHeaders) { // NB: It's safe to call logBuilder.start() multiple times. logBuilder.startResponse(); final HttpHeaders headers = (HttpHeaders) o; final HttpStatus status = headers.status(); if (status != null && status.codeClass() != HttpStatusClass.INFORMATIONAL) { logBuilder.responseHeaders(headers); } } else if (o instanceof HttpData) { logBuilder.increaseResponseLength(((HttpData) o).length()); } return delegate.tryWrite(o); }
@Test public void maybe() { final HttpClient client = HttpClient.of(rule.uri("/maybe")); AggregatedHttpMessage msg; msg = client.get("/string").aggregate().join(); assertThat(msg.headers().contentType()).isEqualTo(MediaType.PLAIN_TEXT_UTF_8); assertThat(msg.content().toStringUtf8()).isEqualTo("a"); msg = client.get("/json").aggregate().join(); assertThat(msg.headers().contentType()).isEqualTo(MediaType.JSON_UTF_8); assertThatJson(msg.content().toStringUtf8()).isStringEqualTo("a"); msg = client.get("/empty").aggregate().join(); assertThat(msg.headers().status()).isEqualTo(HttpStatus.OK); assertThat(msg.content().isEmpty()).isTrue(); msg = client.get("/error").aggregate().join(); assertThat(msg.headers().status()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); }
@Test public void single() { final HttpClient client = HttpClient.of(rule.uri("/single")); AggregatedHttpMessage msg; msg = client.get("/string").aggregate().join(); assertThat(msg.headers().contentType()).isEqualTo(MediaType.PLAIN_TEXT_UTF_8); assertThat(msg.content().toStringUtf8()).isEqualTo("a"); msg = client.get("/json").aggregate().join(); assertThat(msg.headers().contentType()).isEqualTo(MediaType.JSON_UTF_8); assertThatJson(msg.content().toStringUtf8()).isStringEqualTo("a"); msg = client.get("/error").aggregate().join(); assertThat(msg.headers().status()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); }
@Test public void statusOk() throws Exception { unframedGrpcService = (UnframedGrpcService) new GrpcServiceBuilder().addService(testService) .setMaxInboundMessageSizeBytes(MAX_MESSAGE_BYTES) .setMaxOutboundMessageSizeBytes(MAX_MESSAGE_BYTES) .supportedSerializationFormats( GrpcSerializationFormats.values()) .enableUnframedRequests(true) .build(); final HttpResponse response = unframedGrpcService.serve(ctx, request); final AggregatedHttpMessage aggregatedHttpMessage = response.aggregate().get(); assertThat(aggregatedHttpMessage.headers().status()).isEqualTo(HttpStatus.OK); assertThat(aggregatedHttpMessage.content().toStringUtf8()).isEqualTo("{}"); }
@Test public void observable() { final HttpClient client = HttpClient.of(rule.uri("/observable")); AggregatedHttpMessage msg; msg = client.get("/string").aggregate().join(); assertThat(msg.headers().contentType()).isEqualTo(MediaType.PLAIN_TEXT_UTF_8); assertThat(msg.content().toStringUtf8()).isEqualTo("a"); msg = client.get("/json/1").aggregate().join(); assertThat(msg.headers().contentType()).isEqualTo(MediaType.JSON_UTF_8); assertThatJson(msg.content().toStringUtf8()) .isArray().ofLength(1).thatContains("a"); msg = client.get("/json/3").aggregate().join(); assertThat(msg.headers().contentType()).isEqualTo(MediaType.JSON_UTF_8); assertThatJson(msg.content().toStringUtf8()) .isArray().ofLength(3).thatContains("a").thatContains("b").thatContains("c"); msg = client.get("/error").aggregate().join(); assertThat(msg.headers().status()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); }