This PR was merged into the 4.3-dev branch.
Discussion
----------
[Translation] Add XLIFF 1 source to metadata to differentiate from attr
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets |
| License | MIT
| Doc PR |
Here's our use case this patch solves:
We have 2 translation files. One is created by developer and has empty `<target>`. Second one is created by translator and has non-empty `<target>`, but same `<source>`.
Now, unlike Symfony fixtures, we also use `resname=` XLIFF1 attribute. This allows us to detect when translation is out of date, which happens when `<source>` in dev translation is changed, but `resname=` is not. As visualization which better illustrates problem:
dev.xlf:
```xml
<trans-unit id="source_is_different" resname="source_is_different">
<source>Welcome to Calida</source>
</trans-unit>
```
real.xlf:
```xml
<trans-unit id="source_is_different" resname="source_is_different">
<source>Welcome to Jacqueline</source>
<target>Willkommen bei Jacqueline</target>
</trans-unit>
```
We need to be able to tell `<source>` for this pair is different (so we prepend alert glyph to translation message, to alert developer something is wrong). In current XliffFileLoader there is no way for consumer to figure out if translation key came from `resname` or `<source>`, so we had to copy whole loader.
Commits
-------
ab04f25da4 [Translation] Add XLIFF 1 source to metadata to differentiate from attr
This PR was merged into the 4.3-dev branch.
Discussion
----------
[Mime] fixed wrong logic
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | yes
| New feature? | no <!-- don't forget to update src/**/CHANGELOG.md files -->
| BC breaks? | no <!-- see https://symfony.com/bc -->
| Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
| Fixed tickets | n/a
| License | MIT
| Doc PR | n/a
<!--
Write a short README entry for your feature/bugfix here (replace this comment block.)
This will help people understand your PR and can be used as a start of the Doc PR.
Additionally:
- Bug fixes must be submitted against the lowest branch where they apply
(lowest branches are regularly merged to upper ones so they get the fixes too).
- Features and deprecations must be submitted against the master branch.
-->
Commits
-------
836970c776 [Mime] fixed wrong logic
This PR was merged into the 4.3-dev branch.
Discussion
----------
[HttpClient] fixes
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | -
| License | MIT
| Doc PR | -
Spotted while playing with the client.
There is an issue with 307/308 redirects + streamed body that is not fixed here; use string bodies for now.
I'm going to look for a solution in another PR.
Commits
-------
3eca2b448d [HttpClient] fixes
This PR was merged into the 4.3-dev branch.
Discussion
----------
[Mime] added Headers::toArray()
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no <!-- see https://symfony.com/bc -->
| Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
| Fixed tickets | n/a
| License | MIT
| Doc PR | n/a
That helps when using the Mime component to create a form submission HTTP body (where you need to merge the headers of the MIME body with the HTTP headers):
```php
$body->getPreparedHeaders()->toArray();
vs
foreach ($body->getPreparedHeaders()->getAll() as $header) {
$headers[] = $header->toString();
}
```
Commits
-------
788bb812bf [Mime] added Headers::toArray()
This PR was squashed before being merged into the 4.3-dev branch (closes#30482).
Discussion
----------
[Mime] Fix support for date form parts
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | yes
| New feature? | yes <!-- don't forget to update src/**/CHANGELOG.md files -->
| BC breaks? | no <!-- see https://symfony.com/bc -->
| Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
| Fixed tickets | n/a
| License | MIT
| Doc PR | n/a
<!--
Write a short README entry for your feature/bugfix here (replace this comment block.)
This will help people understand your PR and can be used as a start of the Doc PR.
Additionally:
- Bug fixes must be submitted against the lowest branch where they apply
(lowest branches are regularly merged to upper ones so they get the fixes too).
- Features and deprecations must be submitted against the master branch.
-->
Commits
-------
5c8a4e3deb [Mime] removed the 2 parts constraints on Multipart (not true for DataFormPart for instance)
0450c4f244 [Mime] fixed support for date form parts
This PR was merged into the 4.3-dev branch.
Discussion
----------
[Mime] Use "yield from" when possible
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | no <!-- don't forget to update src/**/CHANGELOG.md files -->
| BC breaks? | no <!-- see https://symfony.com/bc -->
| Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
| Fixed tickets | n/a
| License | MIT
| Doc PR | n/a
Commits
-------
df1b627417 [Mime] used yield-from when possible
This PR was squashed before being merged into the 4.3-dev branch (closes#30385).
Discussion
----------
[SecurityBundle] Validate the IPs configured in access_control
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #30299
| License | MIT
| Doc PR | -
Commits
-------
857ac9519e [SecurityBundle] Validate the IPs configured in access_control
This PR was squashed before being merged into the 4.3-dev branch (closes#30413).
Discussion
----------
[HttpClient][Contracts] introduce component and related contracts
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #28628
| License | MIT
| Doc PR | -
This PR introduces new `HttpClient` contracts and
component. It makes no compromises between DX, performance, and design.
Its surface should be very simple to use, while still flexible enough
to cover most advanced use cases thanks to streaming+laziness.
Common existing HTTP clients for PHP rely on PSR-7, which is complex
and orthogonal to the way Symfony is designed. More reasons we need
this in core are the [package principles](https://en.wikipedia.org/wiki/Package_principles): if we want to be able to keep our
BC+deprecation promises, we have to build on more stable and more
abstract dependencies than Symfony itself. And we need an HTTP client
for e.g. Symfony Mailer or #27738.
The existing state-of-the-art puts a quite high bar in terms of features we must
support if we want any adoption. The code in this PR aims at implementing an
even better HTTP client for PHP than existing ones, with more (useful) features
and a better architecture. What a pitch :)
Two full implementations are provided:
- `NativeHttpClient` is based on the native "http" stream wrapper.
It's the most portable one but relies on a blocking `fopen()`.
- `CurlHttpClient` relies on the curl extension. It supports full
concurrency and HTTP/2, including server push.
Here are some examples that work with both clients.
For simple cases, all the methods on responses are synchronous:
```php
$client = new NativeHttpClient();
$response = $client->get('https://google.com');
$statusCode = $response->getStatusCode();
$headers = $response->getHeaders();
$content = $response->getContent();
```
By default, clients follow redirects. On `3xx`, `4xx` or `5xx`, the `getHeaders()` and `getContent()` methods throw an exception, unless their `$throw` argument is set to `false`.
This is part of the "failsafe" design of the component. Another example of this
failsafe property is that broken dechunk or gzip streams always trigger an exception,
unlike most other HTTP clients who can silently ignore the situations.
An array of options allows adjusting the behavior when sending requests.
They are documented in `HttpClientInterface`.
When several responses are 1) first requested in batch, 2) then accessed
via any of their public methods, requests are done concurrently while
waiting for one.
For more advanced use cases, when streaming is needed:
Streaming the request body is possible via the "body" request option.
Streaming the response content is done via client's `stream()` method:
```php
$client = new CurlHttpClient();
$response = $client->request('GET', 'http://...');
$output = fopen('output.file', 'w');
foreach ($client->stream($response) as $chunk) {
fwrite($output, $chunk->getContent());
}
```
The `stream()` method also works with multiple responses:
```php
$client = new CurlHttpClient();
$pool = [];
for ($i = 0; $i < 379; ++$i) {
$uri = "https://http2.akamai.com/demo/tile-$i.png";
$pool[] = $client->get($uri);
}
$chunks = $client->stream($pool);
foreach ($chunks as $response => $chunk) {
// $chunk is a ChunkInterface object
if ($chunk->isLast()) {
$content = $response->getContent();
}
}
```
The `stream()` method accepts a second `$timeout` argument: responses that
are *inactive* for longer than the timeout will emit an empty chunk to signal
it. Providing `0` as timeout allows monitoring responses in a non-blocking way.
Implemented:
- flexible contracts for HTTP clients
- `fopen()` + `curl`-based clients with close feature parity
- gzip compression enabled when possible
- streaming multiple responses concurrently
- `base_uri` option for scoped clients
- progress callback with detailed info and able to cancel the request
- more flexible options for precise behavior control
- flexible timeout management allowing e.g. server sent events
- public key pinning
- auto proxy configuration via env vars
- transparent IDN support
- `HttpClient::create()` factory
- extensive error handling, e.g. on broken dechunk/gzip streams
- time stats, primary_ip and other info inspired from `curl_getinfo()`
- transparent HTTP/2-push support with authority validation
- `Psr18Client` for integration with libs relying on PSR-18
- free from memory leaks by avoiding circular references
- fixed handling of redirects when using the `fopen`-based client
- DNS cache pre-population with `resolve` option
Help wanted (can be done after merge):
- `FrameworkBundle` integration: autowireable alias + semantic configuration for default options
- add `TraceableHttpClient` and integrate with the profiler
- logger integration
- add a mock client
More ideas:
- record/replay like CsaGuzzleBundle
- use raw sockets instead of the HTTP stream wrapper
- `cookie_jar` option
- HTTP/HSTS cache
- using the symfony CLI binary to test ssl-related options, HTTP/2-push, etc.
- add "auto" mode to the "buffer" option, based on the content-type? or array of content-types to buffer
- *etc.*
Commits
-------
fc83120691 [HttpClient] Add Psr18Client - aka a PSR-18 adapter
8610668c1c [HttpClient] introduce the component
d2d63a28e1 [Contracts] introduce HttpClient contracts
This PR was squashed before being merged into the 4.3-dev branch (closes#30377).
Discussion
----------
[Validator] add MIR card scheme
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #30376
| License | MIT
Commits
-------
aecb33a620 [Validator] add MIR card scheme
This PR was merged into the 4.3-dev branch.
Discussion
----------
[Workflow] Added a context to `Workflow::apply()`
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #27925 (maybe #28253 and #28266)
| License | MIT
| Doc PR |
Commits
-------
7d5b7a3392 [Workflow] Added a context to `Workflow::apply()`
This PR was merged into the 4.3-dev branch.
Discussion
----------
[Form] Allow to disable and customize PercentType symbol
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no <!-- see https://symfony.com/bc -->
| Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
| Fixed tickets | #28796 <!-- #-prefixed issue number(s), if any -->
| License | MIT
| Doc PR | symfony/symfony-docs#11078
<!--
Write a short README entry for your feature/bugfix here (replace this comment block.)
This will help people understand your PR and can be used as a start of the Doc PR.
Additionally:
- Bug fixes must be submitted against the lowest branch where they apply
(lowest branches are regularly merged to upper ones so they get the fixes too).
- Features and deprecations must be submitted against the master branch.
-->
## `PercentType` `symbol` option
As of this writing, Symfony will forcibly append a percentage sign (`%`) to all input fields that are of the PercentType form type. This PR will introduce a boolean flag called `symbol` that, when `false`, will not display the percentage sign. Each of the default layouts that define percent_widget will respect this option. You could also use a customised string as value for `symbol` option.
By default, this new option will be set to `true` so that it maintains backward compatibility. The unit tests have been updated where appropriate, and a new unit test has been added (as appropriate).
Commits
-------
53c5f41f37 [Form] Allow to disable and customize PercentType symbol
9aeaea06fc Add ‘symbol’ option to PercentType
This PR was squashed before being merged into the 4.3-dev branch (closes#30325).
Discussion
----------
[HttpKernel] Prevent search engines from indexing dev applications
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #30318
| License | MIT
| Doc PR | TODO
Add the *X-Robots-Tag: noindex* to dev (and test) applications to prevent search engines to index them.
Commits
-------
3dd86719bf [HttpKernel] Prevent search engines from indexing dev applications
This PR was squashed before being merged into the 4.3-dev branch (closes#30445).
Discussion
----------
[Mime] Fix generate message id with named address
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | yes
| New feature? | yes
| BC breaks? | no <!-- see https://symfony.com/bc -->
| Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
| Fixed tickets | #... <!-- #-prefixed issue number(s), if any -->
| License | MIT
| Doc PR |
When using a NamedAddress in from(), the generated MessageId don't pass the validation.
In effect, the email passed to generateMessageId look like this `Fabien <fabien@symfony.com>` and the strstr transform email in this `4641b2b294b53fe983a05b1a@symfony.com>`
By passing the address only instead of toString, it's fixed.
<!--
Write a short README entry for your feature/bugfix here (replace this comment block.)
This will help people understand your PR and can be used as a start of the Doc PR.
Additionally:
- Bug fixes must be submitted against the lowest branch where they apply
(lowest branches are regularly merged to upper ones so they get the fixes too).
- Features and deprecations must be submitted against the master branch.
-->
Commits
-------
375ac9237f [Mime] Fix generate message id with named address
This PR was squashed before being merged into the 4.3-dev branch (closes#30390).
Discussion
----------
[FrameworkBundle] Fix UrlGenerator::generate to return an empty string instead of null
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #30306
| License | MIT
Fix#30306 : Controller::generateUrl() must be of the type string, null returned
Commits
-------
c5b1247977 [FrameworkBundle] Fix UrlGenerator::generate to return an empty string instead of null
This PR was merged into the 3.4 branch.
Discussion
----------
[Debug] detect annotations before blank docblock lines
| Q | A
| ------------- | ---
| Branch? | 3.4
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets |
| License | MIT
| Doc PR |
This fixes the tests and a small issue after the CS changes made in df1d50dcc2 for #29920.
Commits
-------
dedd526b19 detect annotations before blank docblock lines