Skip to content

Move content previewing and encoding/decoding service to server/service option #6577

@ikhoon

Description

@ikhoon

Content previewing was implemented as a decorator to record the uncompressed content in conjunction with DecodingSevice and EncodingService. However, this approach may fail to capture the actual response sent over the wire. For example, a response generated by ServerErrorHandler cannot be previewed. Also, if a response is changed after ContentPreviewingService, the updated content is not reflected in RequestLog.responseContentPreview().

To address the limitation, we may need to configure ContentPreviewingFactory through server/service options (instead of using ContentPreviwingService) and record the previews internally at the Armeria transport layer. To recode decoded content consistently, compression/ decompression should also be configured via server/service options so that previewing happens after decompression and before compression.

decode request -> decompression -> content preview -> request decorators -> service -> 
response decorators -> server error handler -> content preview -> compression -> write response

API proposal:

// Migrate EncodingServiceBuilder into CompressionBuilder
Compression compression =
  Compression
     .builder()
     .encoderFactories(...)
     .encodableContentTypes(...)
     ...
     .build();
     
Server
  .builder()
  // Enabled by default
  .decompress(streamDecoderFactories)
  // 
  .compress(compression);
  .contentPreview(contentPreviewerFactory)
  .route().get("/get")
          // Apply response compression at the service level
          .compress(...)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions