{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":46251204,"defaultBranch":"main","name":"armeria","ownerLogin":"line","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2015-11-16T04:04:01.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/13128444?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1717464610.0","currentOid":""},"activityList":{"items":[{"before":"500f1383f45bee0677f535a63408c64ea4b9951c","after":"da982d39858cae90d82d3391fd268c90fb723dce","ref":"refs/heads/main","pushedAt":"2024-06-04T12:12:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Record causes of failed attempts for RetryingClient (#5583)\n\nMotivation:\r\n#5283\r\n\r\nModifications:\r\n- Separating `onResponse` into `onResponseOnClient` and `onResponseOnServer` as refactoring\r\n- Add `failureAttempts(Throwable error)` and `failureAttempts(HttpStatus httpstatus)` at `ClientRequestMetrics` and make us enable to record causes of failed attempts\r\n\r\nResult:\r\n\r\n- Closes #5283\r\n- The metrics for failed requests while retrying now include the cause of the failure.\r\nCo-authored-by: jrhee17 ","shortMessageHtmlLink":"Record causes of failed attempts for RetryingClient (#5583)"}},{"before":"ea194006ada6b0c6785cee2dcc972324a5dbae0d","after":"500f1383f45bee0677f535a63408c64ea4b9951c","ref":"refs/heads/main","pushedAt":"2024-06-04T11:11:26.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Refactor `WeightRampingUpStrategy` to be timestamp based (#5693)\n\nMotivation:\r\n\r\nThe motivation for this PR stems from #5688.\r\n\r\nThe current `WeightRampingUpStrategy` internally maintains the ramping up status of endpoints. However, it is possible that although an `EndpointGroup` has just been created certain endpoints must be considered already ramped up. For instance, in xDS we newly create an `EndpointGroup` every time a `ClusterSnapshot` is updated. However, even if a `ClusterSnapshot` has changed, we need to retain an endpoint's ramping up status.\r\n\r\nTo resolve this, I propose a timestamp based solution. Specifically, I believe an `Endpoint` can maintain a state `createdAtNanos` and `WeightRampingUpStrategy` can refer to this value to determine the ramp-up status. We can also allow users to specify their own timestamp via an attribute if they are maintaining their own `Endpoint` pool like done in xDS.\r\n\r\nWhile implementing a timestamp based solution, I found that the previous logic is probably simpler to manage if it were refactored. Specifically, I propose that a `rampingUpInterval` is divided into `rampingUpTaskWindow`s. Each `rampingUpTaskWindow` will be assigned a scheduler. If a scheduler doesn't have any more endpoints to ramp up, the scheduler is stopped. I've also removed the endpoint deduplication related logic to make the implementation simpler.\r\n\r\nModifications:\r\n\r\n- Defined an attribute `createdAtNanos` which signifies when an `Endpoint` has been created.\r\n- Refactored `WeightRampingUpStrategy` to refer to `createdAtNanos` when computing the initial ramping up step\r\n- Refactored `WeightRampingUpStrategy` overall to always use the created timestamp when 1) determining the initial ramping up step 2) determining which ramping up scheduler to use\r\n - Removed deduplication logic for simplifying logic\r\n - Removed weight update logic for simplifying logic.\r\n\r\nResult:\r\n\r\n- We can prepare to support `WeightRampingUpStrategy` for xDS.\r\n","shortMessageHtmlLink":"Refactor WeightRampingUpStrategy to be timestamp based (#5693)"}},{"before":"7474525b8cf25f02be6df7c38510a8fb6a88cb1f","after":"ea194006ada6b0c6785cee2dcc972324a5dbae0d","ref":"refs/heads/main","pushedAt":"2024-06-04T11:10:19.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Support colons in path for server-side (#5676)\n\nMotivation:\r\n\r\nCurrently, gRPC verb suffix is supported by introducing a `VerbSuffixPathMapping`.\r\nThere were several issues with this approach:\r\n- `VerbSuffixPathMapping` was applied inconsistently.\r\n - For instance, `RouteBuilder path(String pathPattern)` applies `VerbSuffixPathMapping`, but `RouteBuilder path(String prefix, String pathPattern)` doesn't.\r\n- In the context of `ExactPathMapping`, `VerbSuffixPathMapping` was acting as a workaround to support colons in the path. Additionally the support for colons is incomplete since only the last colon is correctly handled.\r\n - Another side-effect of this is route collisions are incorrectly reported since the verb suffix isn't taken into account.\r\n- Continued support of `VerbSuffixPathMapping` makes supporting colons natively difficult.\r\n- Misc) A path such ending with an escape character failed to start up the server: `/path\\\\`\r\n\r\nThe original motivation for #5613 was that the following patterns weren't supported.\r\n- /path/{param}:verb\r\n- /path/literal:verb\r\n\r\nI propose that the first case be handled via using `REGEX` `PathMapping` types, and the second case be handled by natively supporting colons in our path parameters.\r\nNote that colons are supported per the [rfc3986](https://datatracker.ietf.org/doc/html/rfc3986#section-3.3), and we already have an issue https://github.com/line/armeria/issues/4577.\r\n\r\n1. Supporting `/path/{param}:verb`\r\n\r\nI propose that we support this simply by introducing a new `PathMappingType.REGEX`. We can simply check if the last `PathSegment` is a `VerbPathSegment`. If it is a `VerbPathSegment`, then we can just use `PathMappingType.REGEX`.\r\n\r\n2. Supporting `/path/literal:verb`\r\n\r\nInternally, we represent colons as parameterized variables both in `ParameterizedPathMapping` and `RoutingTrieBuilder`. This makes it difficult to support colons, so I propose that we modify the internal representation to a different character (`\\0`). This character isn't a valid path character per [rfc3986](https://datatracker.ietf.org/doc/html/rfc3986#section-3.3), so I believe the impact is minimal.\r\n\r\nOne side effect of this approach is that `ParameterizedPathMapping#paths` will return null character delimited paths.\r\ne.g. `/v0/:/path` -> `/v0/\\0/path`\r\nHaving said this, I believe the normal user path doesn't really use this value so it shouldn't matter.\r\n\r\n3. Supporting colons in general\r\n\r\nWhen one calls `RouteBuilder#path(String)`, we determine whether to use `ParameterizedPathMapping` or `ExactPathMapping` depending on whether a colon is used.\r\n\r\nhttps://github.com/line/armeria/blob/8ab42847c146b481c72f000dbc1c4d77dc009220/core/src/main/java/com/linecorp/armeria/server/RouteBuilder.java#L546\r\n\r\n- If the colon does not start the segment (e.g. `/a:b`), it is trivial to assume that the colon should be matched exactly.\r\n- If the colon does start the segment (e.g. `/:param`), it is ambiguous whether the user intended this to be a literal or parameter.\r\n\r\nFor this case, I propose the following:\r\n- If a colon is used as-is, `/:param`, then the segment will be used to represent a parameter\r\n- If a colon is escaped, `/\\\\:param`, then the segment will be treated as a literal\r\n\r\nOptimization) `ExactPathMapping` is more performant than `ParameterizedPathMapping` because a simple equality check is done. I propose as an optimization we modify the condition to check if `/:` is contained instead of `:`. As a downside of this approach, the colon escape logic needs to also be added to `ExactPathMapping`. This can be undone if this logic seems too complicated though.\r\n\r\nModifications:\r\n\r\n- When `VerbPathSegment` is used, use `RegexPathMapping` for gRPC transcoding.\r\n- Removed `VerbSuffixPathMapping` and related changes in `RoutingTrieBuilder`, `RouteBuilder`, and `ParameterizedPathMapping`\r\n- Modified `RoutingTrieBuilder` and `ParameterizedPathMapping` to use `\\0` instead of ':' to represent parameterized path segments. This allows us to use ':' in most `PathMapping` types.\r\n- Relaxed `ParameterizedPathMapping` to act like `ExactPathMapping` when a path segment isn't capturing a path parameter.\r\n- Replace `/\\\\:` to `/:` in `ParameterizedPathMapping` and `ExactPathMapping` to give users an option to use the first colon as a literal.\r\n\r\nResult:\r\n\r\n- https://github.com/line/armeria/issues/4577 is closed\r\n- Logic related to gRPC verb suffixes is generalized and cleaned up\r\n\r\n","shortMessageHtmlLink":"Support colons in path for server-side (#5676)"}},{"before":null,"after":"a9e2159543cc05db3f126ce40822273209fa2bdc","ref":"refs/heads/dependabot/github_actions/dawidd6/action-download-artifact-4","pushedAt":"2024-06-04T01:30:10.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dependabot[bot]","name":null,"path":"/apps/dependabot","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/29110?s=80&v=4"},"commit":{"message":"Bump dawidd6/action-download-artifact from 3 to 4\n\nBumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 3 to 4.\n- [Release notes](https://github.com/dawidd6/action-download-artifact/releases)\n- [Commits](https://github.com/dawidd6/action-download-artifact/compare/v3...v4)\n\n---\nupdated-dependencies:\n- dependency-name: dawidd6/action-download-artifact\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] ","shortMessageHtmlLink":"Bump dawidd6/action-download-artifact from 3 to 4"}},{"before":"baa68298f34a7092417f63ceeb0241c5c73f37fb","after":"7474525b8cf25f02be6df7c38510a8fb6a88cb1f","ref":"refs/heads/main","pushedAt":"2024-06-04T00:57:07.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Fix a possible deadlock when `OAuth2Client` is used with `RetryingClient` (#5715)\n\nMotivation:\r\n\r\nWhen `OAuth2Client` fails to acquire a granted access token, it directly returns a failed response. As the response is returned, `RequestLog` is not completed.\r\n\r\n`RetryingClient` waits for some properties of `RequestLog` to be completed. Therefore, the incomplete `RequestLog` causes `RetryingClient` to get stuck.\r\n\r\nThis PR is a temporary workaround to fix the problem. The deadlock phenomenon will occur easily if a decorator returns a response directly. I created #5714 in which I will try to solve this problem ultimately.\r\n\r\nModifications:\r\n\r\n- If `getAccessToken()` completes exceptionally, completes the log and then returns a failed response.\r\n\r\nResult:\r\n\r\nFixed a bug where `RetryingClient` gets to deadlock when `OAuth2Client` fails to obtain an access token.","shortMessageHtmlLink":"Fix a possible deadlock when OAuth2Client is used with `RetryingCli…"}},{"before":"fc41ef29a9e30301a5983e8dab9b6fc19a6f91af","after":"baa68298f34a7092417f63ceeb0241c5c73f37fb","ref":"refs/heads/main","pushedAt":"2024-06-04T00:56:18.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Fix a bug when gRPC transcoding is used with parameterized paths (#5679)\n\nMotivation:\r\n\r\nThis bug was found while analyzing the code for #5676.\r\n\r\nOur gRPC-transcoding path parser contains logic which uses the parameter name when constructing the mapped path.\r\nWhile doing so, we use an arbitrary name prefixed with a 'p' if we are unable to determine a suitable parameter name.\r\n\r\nhttps://github.com/line/armeria/blob/1737482b82255d2ff4728927bdf91631bf1b23e9/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingPathParser.java#L385\r\n\r\nThis can be problematic since a path may be constructed in a different way from what the user expected.\r\n\r\ne.g. Assume we use the following path pattern:\r\n- path: `/v1/conflict/{id=hello/*}/{p0}/test`\r\n\r\nThe above path will currently be mapped to:\r\n- `/v1/conflict/hello/:p0/:p0/test`.\r\n\r\nHowever, there is no guarantee that `id` and `p0` should be equal, and hence should be built to the following path:\r\n- `/v1/conflict/hello/:p0/:p1/test`.\r\n\r\nI propose that we prepend a '@' to the generated fields. The reasoning for this is:\r\n- Protobuf doesn't allow field names other than letters, digits, underscores in identifiers.\r\n - https://protobuf.dev/reference/protobuf/proto3-spec/#identifiers\r\n - https://protobuf.dev/reference/protobuf/proto2-spec/#identifiers\r\n- '@' is a valid character in a path segment, so it stays the same after `RequestTarget#forServer` is called. This is useful when displaying the paths in `DocService` (called by `MethodInfo`).\r\n - https://datatracker.ietf.org/doc/html/rfc3986#section-3.3\r\n\r\nAs long as the above is satisfied, I think any character is fine.\r\nI actually believe any `sub-delims` character can be used, so let me know if any character should be preferred more.\r\n\r\n> sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n\r\nModifications:\r\n\r\n- Modified to prepend a '@' character in front of generated fields.\r\n\r\nResult:\r\n\r\n- There is no longer a bug when a user uses field `p{\\d}` for gRPC transcoding.\r\n\r\n","shortMessageHtmlLink":"Fix a bug when gRPC transcoding is used with parameterized paths (#5679)"}},{"before":"00d421f25639bd8c4993ac564692d4900a0412c9","after":"fc41ef29a9e30301a5983e8dab9b6fc19a6f91af","ref":"refs/heads/main","pushedAt":"2024-06-04T00:54:22.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Ensure `ArmeriaServerConfigurator` overrides properties from `ArmeriaSettings` (#5692)\n\nMotivation:\r\nThe properties from `ArmeriaSettings` should be considered as default values and should be overridden by the beans that implement `ArmeriaServerConfigurator`. This ensures that custom configurations provided by `ArmeriaServerConfigurator` take precedence over the default settings.\r\n\r\nModifications:\r\n- Adjusted the order of configuration application so that `ArmeriaServerConfigurator` is applied last, ensuring it can override properties set by `ArmeriaSettings`.\r\n\r\nResult:\r\n- `ArmeriaServerConfigurator` now properly overrides the properties set by `ArmeriaSettings`.\r\n- Close #5009","shortMessageHtmlLink":"Ensure ArmeriaServerConfigurator overrides properties from `Armeria…"}},{"before":"7f2aa00e21be8f63e83b6aed370c4a96749f9edd","after":"00d421f25639bd8c4993ac564692d4900a0412c9","ref":"refs/heads/main","pushedAt":"2024-06-03T01:03:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Add armeria-prometheus1 module for Prometheus version 1 and deprecate older classes. (#5698)\n\nMotivation:\r\nMicrometer 1.13.0 updates its Prometheus dependency from 0.x to 1.x. In Prometheus 1.x, the package of `PrometheusMeterRegistry` has changed and `CollectorRegistry` is no longer used. More details can be found in the [migration guide](https://github.com/micrometer-metrics/micrometer/wiki/1.13-Migration-Guide).\r\n\r\nModifications:\r\n- Updated Micrometer from 1.12.4 to 1.13.0.\r\n- Removed the Micrometer 1.3 integration test module.\r\n - We dropped supporting Micrometer <= 1.5 already: #5661\r\n- Updated Prometheus from 0.16.0 to 1.3.0.\r\n- Added `armeria-prometheus1` module.\r\n - `PrometheusMeterRegistries`, `PrometheusVersion1ExpositionService`, and its builder classes are added.\r\n- Deprecated `PrometheusMeterRegistries`, `PrometheusExpositionService`, and its builder classes.\r\n\r\nResult:\r\n- The older `PrometheusMeterRegistries`, `PrometheusExpositionService`, and its builders are deprecated.\r\n - Use the same classes in the `armeria-prometheus1`.","shortMessageHtmlLink":"Add armeria-prometheus1 module for Prometheus version 1 and deprecate…"}},{"before":"2112f50524cf9568ead7e2929fe6cb6f76e2c645","after":"7f2aa00e21be8f63e83b6aed370c4a96749f9edd","ref":"refs/heads/main","pushedAt":"2024-06-03T01:03:10.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Add GraphQL setter to GraphqlServiceBuilder (#5269)\n\nMotivation:\r\nA user might want to set `GraphQL` directly to the `GraphqlServiceBuilder` which could be shared\r\nbetween Expedia `GraphQLRequestHandler` and Armeria's `GraphqlService`.\r\n\r\nModification:\r\n- Add the setter method for `GraphQL`.\r\n\r\nResult:\r\n- You can now set `GraphQL` to the `GraphqlServiceBuilder`.","shortMessageHtmlLink":"Add GraphQL setter to GraphqlServiceBuilder (#5269)"}},{"before":"e263d76deff8f936a58db69de6ad63d0c0458407","after":"2112f50524cf9568ead7e2929fe6cb6f76e2c645","ref":"refs/heads/main","pushedAt":"2024-05-31T06:55:49.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Respond with 408 status when the server didn't receive the request fully (#5680)\n\nMotivation:\r\nCurrently, the server always responds with a 503 status if a `RequestTimeoutException` is raised. However, according to the RFC 9110, the correct response in this case should be a 408 status code. https://httpwg.org/specs/rfc9110.html#status.408\r\n```\r\nThe 408 (Request Timeout) status code indicates that the server did not receive a complete request message within the time that it was prepared to wait.\r\n```\r\n\r\nModification:\r\n- Introduced `DecodedHttpRequest.isNormallyClosed()` to check if the request was received fully.\r\n- Updated the server to send a 408 response when a request times out and the service didn't receive the request fully.\r\n\r\nResult:\r\n- The server now returns a 408 status if a service didn't receive the request fully and the request times out.\r\n- Issue #5579 has been closed.","shortMessageHtmlLink":"Respond with 408 status when the server didn't receive the request fu…"}},{"before":"a994e48c30eee6813172c6216fe3b4e626cdf03b","after":"e263d76deff8f936a58db69de6ad63d0c0458407","ref":"refs/heads/main","pushedAt":"2024-05-31T02:48:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Provide a way to find dynamic decorators handling the current request (#5670)\n\nMotivation:\r\n\r\n`HttpService.as(Class)` can be used to unwrap and find an instance of a decorator or a service.\r\n`ServiceRequestContext.config().service().as(Class)` can't find all decorators because decorators set with `ServerBuilder.decorator()` don't statically wrap the services.\r\n\r\nI propose to add `ServiceRequestContext.findService(Class)` for finding both dynamic and static decorators handling a request.\r\n\r\nModifications:\r\n\r\n- Add `ServiceRequestContext.findService(Class)` that gets all service chain from `InitialDispatcherService` and finds the specific service.\r\n\r\nResult:\r\n\r\nYou can now easily find both dynamic and static decorators that handle a request by using `ServiceRequestContext.findService(Class)`.","shortMessageHtmlLink":"Provide a way to find dynamic decorators handling the current request ("}},{"before":"63f9b2c1d61f6d528a4d997e7291bb006bda1821","after":"a994e48c30eee6813172c6216fe3b4e626cdf03b","ref":"refs/heads/main","pushedAt":"2024-05-30T07:50:36.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Always use HTTP/2 preface for H2C (#5706)\n\nMotivation:\r\n\r\nThere are two modes to negotiate cleartext HTTP/2 connections. They are HTTP/2 connection preface and HTTP/1 upgrade requests. The default behavior is determined by `ClientFactoryOptions.useHttp2Preface()`. This option affects' http' and `h2c`, so even if a user uses `h2c` with prior knowledge, an upgrade request will be sent if `useHttp2Preface() == false`.\r\n\r\nWith prior knowledge, it is an unwanted behavior for `useHttp2Preface()` option to affect `h2c` scheme. `h2c` is an explicit scheme whose negotiation should be fixed to the HTTP/2 connection preface. Its endpoint may not understand the HTTP/1 upgrade.\r\n\r\nSo it would make more sense to apply to `useHttp2Preface()` option to adjust the default behavior of `http`. If both `http` and `h2c` follow `useHttp2Preface()`, there is no difference in behavior between them.\r\n\r\nModifications:\r\n\r\n- Always use HTTP/2 connection preface for `h2c`\r\n- `useHttp2Preface()` option now affects only `http`.\r\n\r\nResult:\r\n\r\nArmeria client always uses HTTP/2 connection preface for `h2c`, regardless of the value of `useHttp2Preface()`.","shortMessageHtmlLink":"Always use HTTP/2 preface for H2C (#5706)"}},{"before":"08397876da97d7b20a410a063c6f89eae6c38a2c","after":"63f9b2c1d61f6d528a4d997e7291bb006bda1821","ref":"refs/heads/main","pushedAt":"2024-05-30T07:49:24.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Provide a way to automatically delete multipart temporary files (#5653)\n\nMotivation:\r\n\r\nArmeria does not automatically delete the uploaded files, so users should manually remove the temporary files themselves. It would be useful if we provided some options for how to delete multipart temporary files.\r\n\r\nRelated: #5652\r\n\r\nModifications:\r\n\r\n- Add `MultipartRemovalStrategy` that is used to determine how to delete multipart files. For now, three options are supported.\r\n - NEVER\r\n - ON_RESPONSE_COMPLETION\r\n - ON_JVM_SHUTDOWN\r\n- Add builder methods to server/virtualhost/service builders.\r\n\r\nBreaking changes:\r\n\r\n- Multipart temporary files are now automatically removed when a response is fully sent. If you want to keep the existing behavior, use `MultipartRemovalStrategy.NEVER`.\r\n\r\nResult:\r\n\r\n- You can now specify when to remove multipart temporary files using `MultipartRemovalStrategy`.\r\n\r\n```java\r\nServer\r\n .builder()\r\n .multipartRemovalStrategy(MultipartRemovalStrategy.ON_RESPONSE_COMPLETION)\r\n```\r\n- Fixes #5652","shortMessageHtmlLink":"Provide a way to automatically delete multipart temporary files (#5653)"}},{"before":"01f2c6f6ee49548c499b202be50fc9d3df84dd4f","after":"08397876da97d7b20a410a063c6f89eae6c38a2c","ref":"refs/heads/main","pushedAt":"2024-05-30T07:46:52.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Apply gRPC exception handler function to cancellations as well (#5398)\n\nMotivation:\r\n\r\nhttps://github.com/line/armeria/issues/5329\r\n\r\nControl over the returned status when a cancellation happens using a custom function.\r\n\r\nModifications:\r\n\r\n- Use the method's gRPC exception handler function during cancellation. Fallback to old logic if it doesn't exist.\r\n\r\nResult:\r\n\r\n- Closes #5329\r\n\r\nCo-authored-by: minwoox \r\nCo-authored-by: minux ","shortMessageHtmlLink":"Apply gRPC exception handler function to cancellations as well (#5398)"}},{"before":"cbb81dd11a69920101a9bafee8bb6d07a7ac44f0","after":"01f2c6f6ee49548c499b202be50fc9d3df84dd4f","ref":"refs/heads/main","pushedAt":"2024-05-29T07:32:03.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Update dependencies (#5699)\n\nUpdate dependencies\r\n- Blockhound 1.0.8.RELEASE -> 1.0.9.RELEASE\r\n- Control Plane 1.0.44 -> 1.0.45\r\n- GraphQL Kotlin 7.0.2 -> 7.1.1\r\n- gRPC Java 1.63.0 -> 1.64.0\r\n- Guava 33.1.0-jre -> 33.2.0-jre\r\n- Jackson 2.17.0 -> 2.17.1\r\n- Kotlin Coroutine 1.8.0 -> 1.8.1\r\n- Kubernetes client 6.11.0 -> 6.12.1\r\n- Mircometer 1.12.4 -> 1.13.0\r\n- Netty 4.1.108.Final -> 4.1.110.Final\r\n- Reactor 3.6.4 -> 3.6.6\r\n- Scala2.13 2.13.13 -> 2.13.14\r\n- Scala Collection compat 2.11.0 -> 2.12.0 \r\n- Spring 6.1.5 -> 6.1.8\r\n- Spring Boot 3.2.4 -> 3.3.0\r\n- Build\r\n - Errorprone 2.26.1 -> 2.27.1\r\n - Finagle 23.11.0 -> 24.2.0\r\n - GraphQL DGS client 8.5.3 -> 8.6.1\r\n - Jakarta Validation 3.0.2 -> 3.1.0\r\n - Jakarta WebSocket 2.1.1 -> 2.2.0\r\n - Jkube 1.15.0 -> 1.16.2\r\n - Picocli 4.7.5 -> 4.7.6\r\n - Test containers 1.19.7 -> 1.19.8\r\n\r\nClose #5697","shortMessageHtmlLink":"Update dependencies (#5699)"}},{"before":"7ffc004e3b63c4c3dbb86d936df91d68e3ea4c3c","after":null,"ref":"refs/heads/update-public-suffixes","pushedAt":"2024-05-28T10:06:14.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"mergify[bot]","name":null,"path":"/apps/mergify","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/10562?s=80&v=4"}},{"before":"1b28c8e587c05ba20646ae8545e1d7ffecbdab09","after":"cbb81dd11a69920101a9bafee8bb6d07a7ac44f0","ref":"refs/heads/main","pushedAt":"2024-05-28T10:06:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"mergify[bot]","name":null,"path":"/apps/mergify","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/10562?s=80&v=4"},"commit":{"message":"Update public suffix list (#5704)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: Meri Kim ","shortMessageHtmlLink":"Update public suffix list (#5704)"}},{"before":null,"after":"7ffc004e3b63c4c3dbb86d936df91d68e3ea4c3c","ref":"refs/heads/update-public-suffixes","pushedAt":"2024-05-28T10:05:33.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Update public suffix list","shortMessageHtmlLink":"Update public suffix list"}},{"before":"24140998343844c7657a699c44ddfbb3ab31f8f7","after":"1b28c8e587c05ba20646ae8545e1d7ffecbdab09","ref":"refs/heads/main","pushedAt":"2024-05-27T02:06:57.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Fix flaky test in InputStreamStreamMessageTest (#5702)\n\nClose #5695","shortMessageHtmlLink":"Fix flaky test in InputStreamStreamMessageTest (#5702)"}},{"before":"1fa54422de0fec643b05944d0239a947b5299239","after":"24140998343844c7657a699c44ddfbb3ab31f8f7","ref":"refs/heads/main","pushedAt":"2024-05-24T04:21:41.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Fix flaky tests (#5694)\n\nClose #5681 \r\nClose #4553","shortMessageHtmlLink":"Fix flaky tests (#5694)"}},{"before":"2a0dba1595796f53bc06284d509add56442c5eaf","after":"1fa54422de0fec643b05944d0239a947b5299239","ref":"refs/heads/main","pushedAt":"2024-05-23T02:21:18.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"update check-style setting for LY corp copyright (#5678)\n\nMotivation:\r\nIn the latest developer guide, it is recommended to use `Copyright $today.year LY Corporation`, but the check-style settings have not been adapted accordingly. When this copyright notice is used, a check-style warning occurs.\r\nModifications:\r\n\r\n- Updated check-style setting for LY corp copyright\r\n\r\nResult:\r\n\r\n- Using either LINE copyright or LY copyright will pass the check-style test.\r\n\r\n","shortMessageHtmlLink":"update check-style setting for LY corp copyright (#5678)"}},{"before":"f72333be566bad0928ff941eb1cf12a6e3a489f0","after":"2a0dba1595796f53bc06284d509add56442c5eaf","ref":"refs/heads/main","pushedAt":"2024-05-23T02:18:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Fix asJson method to pass mapper in WebClientRequestPreparation (#5512)\n\nMotivation:\r\n\r\nResolve issue #5454 with proper handling of ObjectMapper instance.\r\n\r\nModifications:\r\n\r\n- Pass the provided ObjectMapper to the ResponseAs.json method:\r\n `WebClientRequestPreparation.asJson(Class clazz, ObjectMapper mapper)`.\r\n\r\nResult:\r\n\r\n- The `asJson` method pass the provided ObjectMapper instance to the `ResponseAs.json` method as it should\r\n- Closes #5454","shortMessageHtmlLink":"Fix asJson method to pass mapper in WebClientRequestPreparation (#5512)"}},{"before":"a68b5f9c223dd84fe19cebc6176ebc0b954b9e48","after":"f72333be566bad0928ff941eb1cf12a6e3a489f0","ref":"refs/heads/main","pushedAt":"2024-05-22T10:30:03.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Fix flaky test in Http1ServerDelayedCloseConnectionTest (#5691)","shortMessageHtmlLink":"Fix flaky test in Http1ServerDelayedCloseConnectionTest (#5691)"}},{"before":"806556e5a4d27b549c4c6c24f75d96a1447d85d1","after":"a68b5f9c223dd84fe19cebc6176ebc0b954b9e48","ref":"refs/heads/main","pushedAt":"2024-05-22T10:29:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Add headers and MediaTypes for Git HTTP (#5689)\n\nMotivation:\r\nAdded necessary headers and MediaTypes for Git HTTP, as a follow-up to https://github.com/line/centraldogma/pull/954.","shortMessageHtmlLink":"Add headers and MediaTypes for Git HTTP (#5689)"}},{"before":"1e1439664309f457458517c42dd38e201e98cad7","after":"806556e5a4d27b549c4c6c24f75d96a1447d85d1","ref":"refs/heads/main","pushedAt":"2024-05-20T09:18:10.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Refactor messageContext initialization for enhanced scope availability in SamlAssertionConsumerFunction (#5622)\n\nMotivation:\r\n\r\nThis PR addresses a code enhancement in the SamlAssertionConsumerFunction by initializing the messageContext variable at the beginning of the method. This change is intended to streamline the assignment and handling of messageContext, ensuring that it can be consistently used throughout the method, particularly in exception handling scenarios.\r\n\r\nModifications:\r\n\r\nDeclared messageContext at the method start to allow its use across the entire method scope, including within try and catch blocks.\r\n\r\nResult:\r\n\r\n- Closes #5401 \r\n- The refactor ensures messageContext is available for error handling.","shortMessageHtmlLink":"Refactor messageContext initialization for enhanced scope availabilit…"}},{"before":"a7f7e3c2d7f02bfc9b9cc9fcf93f7f195aeb4414","after":"1e1439664309f457458517c42dd38e201e98cad7","ref":"refs/heads/main","pushedAt":"2024-05-20T08:12:59.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Refactor GrpcStatus to implement GrpcExceptionHandlerFunction (#5571)\n\nMotivation:\r\n\r\n- Closes #5550 \r\n\r\nModifications:\r\n\r\n- `GrpcStatus` implements `GrpcExceptionHandlerFunction`\r\n- Rename `GrpcStatus` to `DefaultGrpcExceptionHandlerFunction`\r\n\r\nResult:\r\n\r\n- Closes #5550\r\n- GrpcClientBuilder uses `DefaultGrpcExceptionHandlerFunction` as default\r\n- GrpcService can use `DefaultGrpcExceptionHandlerFunction` for its `exceptionHandler`\r\n\r\n","shortMessageHtmlLink":"Refactor GrpcStatus to implement GrpcExceptionHandlerFunction (#5571)"}},{"before":"0eae6266939cb0077a9f1c065597624065dee5cf","after":"a7f7e3c2d7f02bfc9b9cc9fcf93f7f195aeb4414","ref":"refs/heads/main","pushedAt":"2024-05-20T08:10:29.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Add feature to gracefully shutdown connections in HttpClientFactory (#5489)\n\nMotivation:\r\n\r\nAdd graceful shutdown feature in `HttpClientFactory`. The implementation has been referenced from the server side graceful shutdown. \r\n\r\nModifications:\r\n\r\n- Add `clientConnectionDrainDurationMillis` which is used to set client-side drain settings \r\n- When `drainDurationMillis > 0` in `HttpClientFactory`, graceful shutdown is applied. \r\n\r\nResult:\r\n\r\n- Closes #<[5470](https://github.com/line/armeria/issues/5470)>. (If this resolves the issue.)\r\n- By allowing a grace period for ongoing requests to finish before closing connections, users can ensure that their requests complete\r\n\r\nCo-authored-by: minwoox ","shortMessageHtmlLink":"Add feature to gracefully shutdown connections in HttpClientFactory (#…"}},{"before":"8ab42847c146b481c72f000dbc1c4d77dc009220","after":"0eae6266939cb0077a9f1c065597624065dee5cf","ref":"refs/heads/main","pushedAt":"2024-05-20T07:44:45.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Collect timings related with TLS handshake (#5647)\n\nMotivation:\r\n\r\nCollect the timings related with TLS handshake. If a request was the first in a connection, armeria could also provide it in a RequestLog to tell a user that the request timing has been affected by TLS handshake.\r\n\r\nModifications:\r\n\r\n- Add TLS handshake related field in `ClientConnectionTimings`\r\n- Add TLS handshake duration metric field at MetricCollectingClient\r\n- Start collecting the TLS handshake timer in the case below.\r\n - ~~If the client is enabled as `TCP fast open` in the first request, start the timer before the TCP connection.~~\r\n - start the timer when netty calls `SslHandler.channelActive()`\r\n\r\nResult:\r\n\r\n- Closes #3647","shortMessageHtmlLink":"Collect timings related with TLS handshake (#5647)"}},{"before":null,"after":"36576052f11d0b2d0bd9f2e9b574daef0e43d93b","ref":"refs/heads/dependabot/gradle/com.gradle.develocity-3.17.4","pushedAt":"2024-05-20T01:32:59.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dependabot[bot]","name":null,"path":"/apps/dependabot","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/29110?s=80&v=4"},"commit":{"message":"Bump com.gradle.develocity from 3.17.3 to 3.17.4\n\nBumps com.gradle.develocity from 3.17.3 to 3.17.4.\n\n---\nupdated-dependencies:\n- dependency-name: com.gradle.develocity\n dependency-type: direct:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] ","shortMessageHtmlLink":"Bump com.gradle.develocity from 3.17.3 to 3.17.4"}},{"before":"1737482b82255d2ff4728927bdf91631bf1b23e9","after":"8ab42847c146b481c72f000dbc1c4d77dc009220","ref":"refs/heads/main","pushedAt":"2024-05-16T07:28:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"minwoox","name":"minux","path":"/minwoox","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/25103250?s=80&v=4"},"commit":{"message":"Add option to respect the marshaller specified in gRPC MethodDescriptor (#5630)\n\nMotivation:\r\n\r\n- This PR adds option to use marshaller that specified in gRPC `MethodDescriptor`\r\n- Related Issue #5103\r\n - Partial solved: Option to use marshaller that specified in gRPC `MethodDescriptor`\r\n - Unsolved part: Provide way to add custom marshaller\r\n\r\nModifications:\r\n\r\n- New option `useMethodMarshaller`\r\n - default value is `false`\r\n- Add validate logic for `GrpcServiceBuilder` and `GrpcClientBuilder` to check that `unsafeWrapDeserializedBuffer` and `useMethodMarshaller` are mutually exclusive\r\n\r\nResult:\r\n- Have new option `useMethodMarshaller`\r\n- Throw `IllegalStateException` when both `unsafeWrapDeserializedBuffer` and `useMethodMarshaller` are enabled\r\n","shortMessageHtmlLink":"Add option to respect the marshaller specified in gRPC MethodDescript…"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEW_tJsQA","startCursor":null,"endCursor":null}},"title":"Activity · line/armeria"}