0.81.0 release notes

8th March 2019

New features

  • A user now can generate cache-control header value programmatically. #1615

    HttpHeaders headers = HttpHeaders.of();
    HttpFileBuilder fileBuilder = HttpFileBuilder.of(...);
    HttpFileServiceBuilder fileServiceBuilder = HttpFileServiceBuilder.forFileSystem(...);
    
    // Before:
    headers.set(HttpHeaderNames.CACHE_CONTROL, "no-cache, no-store, must-revalidate"));
    fileBuilder.setHeader(HttpHeaderNames.CACHE_CONTROL,
                          "max-age=86400, no-cache, must-revalidate");
    fileServiceBuilder.setHeader(HttpHeaderNames.CACHE_CONTROL, "public, max-age=3600");
    
    // After:
    headers.setObject(HttpHeaderNames.CACHE_CONTROL, ServerCacheControl.DISABLED);
    fileBuilder.cacheControl(new ServerCacheControlBuilder()
                                     .maxAgeSeconds(86400)
                                     .noCache()
                                     .mustRevalidate()
                                     .build());
    fileServiceBuilder.cacheControl(new ServerCacheControlBuilder()
                                            .cachePublic()
                                            .maxAgeSeconds(3600)
                                            .build());
  • Armeria supports gRPC Server Reflection. #1623

    ServerBuilder sb = new ServerBuilder();
    sb.service(new GrpcServiceBuilder().addService(new MyHelloService())
                                       .addService(ProtoReflectionService.newInstance())
                                       .build());
  • Added StreamMessage.drailAll(...) to simply collect all the elements from the StreamMessage. #1620

    HttpResponse res = HttpResponse.of(HttpHeaders.of(HttpStatus.OK)
                                                  .contentType(PLAIN_TEXT_UTF_8),
                                       HttpData.ofUtf8("bob"),
                                       HttpHeaders.of(CONTENT_MD5, "hash"));
    // Simply collect all the elements.
    List<HttpObject> drained = res.drainAll().join();
    assertThat(drained).containsExactly(
            HttpHeaders.of(HttpStatus.OK)
                       .contentType(PLAIN_TEXT_UTF_8),
            HttpData.of(StandardCharsets.UTF_8, "bob"),
            HttpHeaders.of(CONTENT_MD5, "hash"));
  • A user is able to see the HTTP trailers in a RequestLog. #1614

Improvements

Bug fixes

  • Fixed a bug where HTTP trailers is added to message headers. #1620
  • Fixed a bug where the TLS handshake exception pollutes the log message. #1612
  • Fixed a bug where Server-Sent Events messages miss the end-of-line character. #1610
  • Fixed an API design flaw where a user cannot specify more than one decorator when adding a ServiceWithPathMappings. #1627
  • Fixed a bug where contentPreview is not working correctly. #1624
  • Fixed a bug where a StackOverFlowError is raised while finding annotations in AnnotationUtil. #1635
  • Fixed a bug where the Armeria actuator sends the response with the incorrect media type. #1641

Breaking Change

  • The HttpHeaders is added to get() in HttpVfs as a parameter. #1615
    • A user can easily add the HttpHeaders when building an HttpFile.

Dependencies

  • Caffeine 2.6.2 -> 2.7.0
  • Curator 4.1.0 -> 4.2.0
  • gRPC 1.18.0 -> 1.19.0
  • Hibernate Validator 6.0.14 -> 6.0.15
  • Jetty 9.4.14 -> 9.4.15
  • protobuf-java 3.5.1 -> 3.6.1
  • RxJava 2.2.6 -> 2.2.7
  • SLF4J 1.7.25 -> 1.7.26
  • Spring Boot 2.1.2 -> 2.1.3