Merge branch '5.0' into 5.1

* 5.0:
  [Mime] Remove unused var
  [HttpClient] fix monitoring timeouts when other streams are active
  [PhpUnitBridge] fix syntax on PHP 5.3
  [PhpUnitBridge] Fix undefined index when output of "composer show" cannot be parsed
  properly cascade validation to child forms
  [PhpUnitBridge] fix undefined var on version 3.4
  Move ajax clear event listener initialization on loadToolbar
  [HttpClient] Throw JsonException instead of TransportException on empty response in Response::toArray()
  take into account the context when preserving empty array objects
  [VarExporter] tfix: s/markAsSkipped/markTestSkipped/
  bumped Symfony version to 5.0.10
  updated VERSION for 5.0.9
  updated CHANGELOG for 5.0.9
  bumped Symfony version to 4.4.10
  updated VERSION for 4.4.9
  updated CHANGELOG for 4.4.9
  bumped Symfony version to 3.4.42
  updated VERSION for 3.4.41
  update CONTRIBUTORS for 3.4.41
  updated CHANGELOG for 3.4.41
This commit is contained in:
Nicolas Grekas 2020-06-07 17:42:22 +02:00
commit 2ea0a147ce
20 changed files with 346 additions and 85 deletions

View File

@ -7,6 +7,68 @@ in 4.4 minor versions.
To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash
To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v4.4.0...v4.4.1
* 4.4.9 (2020-05-31)
* bug #37008 [Security] Fixed AbstractToken::hasUserChanged() (wouterj)
* bug #36894 [Validator] never directly validate Existence (Required/Optional) constraints (xabbuh)
* bug #37007 [Console] Fix QuestionHelper::disableStty() (chalasr)
* bug #36865 [Form] validate subforms in all validation groups (xabbuh)
* bug #36907 Fixes sprintf(): Too few arguments in form transformer (pedrocasado)
* bug #36868 [Validator] Use Mime component to determine mime type for file validator (pierredup)
* bug #37000 Add meaningful message when using ProcessHelper and Process is not installed (l-vo)
* bug #36995 [TwigBridge] fix fallback html-to-txt body converter (nicolas-grekas)
* bug #36993 [ErrorHandler] fix setting $trace to null in FatalError (nicolas-grekas)
* bug #36987 Handle fetch mode deprecation of DBAL 2.11. (derrabus)
* bug #36974 [Security] Fixed handling of CSRF logout error (wouterj)
* bug #36947 [Mime] Allow email message to have "To", "Cc", or "Bcc" header to be valid (Ernest Hymel)
* bug #36914 Parse and render anonymous classes correctly on php 8 (derrabus)
* bug #36921 [OptionsResolver][Serializer] Remove calls to deprecated ReflectionParameter::getClass() (derrabus)
* bug #36920 [VarDumper] fix PHP 8 support (nicolas-grekas)
* bug #36917 [Cache] Accessing undefined constants raises an Error in php8 (derrabus)
* bug #36891 Address deprecation of ReflectionType::getClass() (derrabus)
* bug #36899 [VarDumper] ReflectionFunction::isDisabled() is deprecated (derrabus)
* bug #36905 [Validator] Catch expected ValueError (derrabus)
* bug #36915 [DomCrawler] Catch expected ValueError (derrabus)
* bug #36908 [Cache][HttpClient] Made method signatures compatible with their corresponding traits (derrabus)
* bug #36906 [DomCrawler] Catch expected ValueError (derrabus)
* bug #36904 [PropertyAccess] Parse php 8 TypeErrors correctly (derrabus)
* bug #36839 [BrowserKit] Raw body with custom Content-Type header (azhurb)
* bug #36896 [Config] Removed implicit cast of ReflectionProperty to string (derrabus)
* bug #35944 [Security/Core] Fix wrong roles comparison (thlbaut)
* bug #36882 [PhpUnitBridge] fix installing under PHP >= 8 (nicolas-grekas)
* bug #36833 [HttpKernel] Fix that the `Store` would not save responses with the X-Content-Digest header present (mpdude)
* bug #36867 [PhpUnitBridge] fix bad detection of unsilenced deprecations (nicolas-grekas)
* bug #36862 [Security] Unserialize $parentData, if needed, to avoid errors (rfaivre)
* bug #36855 [HttpKernel] Fix error logger when stderr is redirected to /dev/null (fabpot)
* bug #36838 [HttpKernel] Bring back the debug toolbar (derrabus)
* bug #36592 [BrowserKit] Allow Referer set by history to be overridden (Slamdunk)
* bug #36823 [HttpClient] fix PHP warning + accept status code >= 600 (nicolas-grekas)
* bug #36824 [Security/Core] fix compat of `NativePasswordEncoder` with pre-PHP74 values of `PASSWORD_*` consts (nicolas-grekas)
* bug #36811 [DependencyInjection] Fix register event listeners compiler pass (X-Coder264)
* bug #36789 Change priority of KernelEvents::RESPONSE subscriber (marcw)
* bug #36794 [Serializer] fix issue with PHP 8 (nicolas-grekas)
* bug #36786 [WebProfiler] Remove 'none' when appending CSP tokens (ndench)
* bug #36743 [Yaml] Fix escaped quotes in quoted multi-line string (ossinkine)
* bug #36777 [TwigBundle] FormExtension does not have a constructor anymore since sf 4.0 (Tobion)
* bug #36716 [Mime] handle passing custom mime types as string (mcneely)
* bug #36747 Queue name is a required parameter (theravel)
* bug #36751 [Mime] fix bad method call on `EmailAddressContains` (Kocal)
* bug #36696 [Console] don't check tty on stdin, it breaks with "data lost during stream conversion" (nicolas-grekas)
* bug #36569 [PhpUnitBridge] Mark parent class also covered in CoverageListener (lyrixx)
* bug #36690 [Yaml] prevent notice for invalid octal numbers on PHP 7.4 (xabbuh)
* bug #36590 [Console] Default hidden question to 1 attempt for non-tty session (ostrolucky)
* bug #36497 [Filesystem] Handle paths on different drives (crishoj)
* bug #36678 [WebProfiler] Do not add src-elem CSP directives if they do not exist (ndench)
* bug #36501 [DX] Show the ParseException message in all YAML file loaders (fancyweb)
* bug #36683 [Yaml] fix parse error when unindented collections contain a comment (wdiesveld)
* bug #36672 [Validator] Skip validation when email is an empty object (acrobat)
* bug #36673 [PhpUnitBridge] fix PHP 5.3 compat again (nicolas-grekas)
* bug #36505 [Translation] Fix for translation:update command updating ICU messages (artemoliynyk)
* bug #36627 [Validator] fix lazy property usage. (bendavies)
* bug #36601 [Serializer] do not transform empty \Traversable to Array (soyuka)
* bug #36606 [Cache] Fixed not supported Redis eviction policies (SerheyDolgushev)
* bug #36625 [PhpUnitBridge] fix compat with PHP 5.3 (nicolas-grekas)
* 4.4.8 (2020-04-28)
* bug #36536 [Cache] Allow invalidateTags calls to be traced by data collector (l-vo)

View File

@ -7,6 +7,68 @@ in 5.0 minor versions.
To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash
To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v5.0.0...v5.0.1
* 5.0.9 (2020-05-31)
* bug #37008 [Security] Fixed AbstractToken::hasUserChanged() (wouterj)
* bug #36894 [Validator] never directly validate Existence (Required/Optional) constraints (xabbuh)
* bug #37007 [Console] Fix QuestionHelper::disableStty() (chalasr)
* bug #36865 [Form] validate subforms in all validation groups (xabbuh)
* bug #36907 Fixes sprintf(): Too few arguments in form transformer (pedrocasado)
* bug #36868 [Validator] Use Mime component to determine mime type for file validator (pierredup)
* bug #37000 Add meaningful message when using ProcessHelper and Process is not installed (l-vo)
* bug #36995 [TwigBridge] fix fallback html-to-txt body converter (nicolas-grekas)
* bug #36993 [ErrorHandler] fix setting $trace to null in FatalError (nicolas-grekas)
* bug #36987 Handle fetch mode deprecation of DBAL 2.11. (derrabus)
* bug #36974 [Security] Fixed handling of CSRF logout error (wouterj)
* bug #36947 [Mime] Allow email message to have "To", "Cc", or "Bcc" header to be valid (Ernest Hymel)
* bug #36914 Parse and render anonymous classes correctly on php 8 (derrabus)
* bug #36921 [OptionsResolver][Serializer] Remove calls to deprecated ReflectionParameter::getClass() (derrabus)
* bug #36920 [VarDumper] fix PHP 8 support (nicolas-grekas)
* bug #36917 [Cache] Accessing undefined constants raises an Error in php8 (derrabus)
* bug #36891 Address deprecation of ReflectionType::getClass() (derrabus)
* bug #36899 [VarDumper] ReflectionFunction::isDisabled() is deprecated (derrabus)
* bug #36905 [Validator] Catch expected ValueError (derrabus)
* bug #36915 [DomCrawler] Catch expected ValueError (derrabus)
* bug #36908 [Cache][HttpClient] Made method signatures compatible with their corresponding traits (derrabus)
* bug #36906 [DomCrawler] Catch expected ValueError (derrabus)
* bug #36904 [PropertyAccess] Parse php 8 TypeErrors correctly (derrabus)
* bug #36839 [BrowserKit] Raw body with custom Content-Type header (azhurb)
* bug #36896 [Config] Removed implicit cast of ReflectionProperty to string (derrabus)
* bug #35944 [Security/Core] Fix wrong roles comparison (thlbaut)
* bug #36882 [PhpUnitBridge] fix installing under PHP >= 8 (nicolas-grekas)
* bug #36833 [HttpKernel] Fix that the `Store` would not save responses with the X-Content-Digest header present (mpdude)
* bug #36867 [PhpUnitBridge] fix bad detection of unsilenced deprecations (nicolas-grekas)
* bug #36862 [Security] Unserialize $parentData, if needed, to avoid errors (rfaivre)
* bug #36855 [HttpKernel] Fix error logger when stderr is redirected to /dev/null (fabpot)
* bug #36838 [HttpKernel] Bring back the debug toolbar (derrabus)
* bug #36592 [BrowserKit] Allow Referer set by history to be overridden (Slamdunk)
* bug #36823 [HttpClient] fix PHP warning + accept status code >= 600 (nicolas-grekas)
* bug #36824 [Security/Core] fix compat of `NativePasswordEncoder` with pre-PHP74 values of `PASSWORD_*` consts (nicolas-grekas)
* bug #36811 [DependencyInjection] Fix register event listeners compiler pass (X-Coder264)
* bug #36789 Change priority of KernelEvents::RESPONSE subscriber (marcw)
* bug #36794 [Serializer] fix issue with PHP 8 (nicolas-grekas)
* bug #36786 [WebProfiler] Remove 'none' when appending CSP tokens (ndench)
* bug #36743 [Yaml] Fix escaped quotes in quoted multi-line string (ossinkine)
* bug #36777 [TwigBundle] FormExtension does not have a constructor anymore since sf 4.0 (Tobion)
* bug #36716 [Mime] handle passing custom mime types as string (mcneely)
* bug #36747 Queue name is a required parameter (theravel)
* bug #36751 [Mime] fix bad method call on `EmailAddressContains` (Kocal)
* bug #36696 [Console] don't check tty on stdin, it breaks with "data lost during stream conversion" (nicolas-grekas)
* bug #36569 [PhpUnitBridge] Mark parent class also covered in CoverageListener (lyrixx)
* bug #36690 [Yaml] prevent notice for invalid octal numbers on PHP 7.4 (xabbuh)
* bug #36590 [Console] Default hidden question to 1 attempt for non-tty session (ostrolucky)
* bug #36497 [Filesystem] Handle paths on different drives (crishoj)
* bug #36678 [WebProfiler] Do not add src-elem CSP directives if they do not exist (ndench)
* bug #36501 [DX] Show the ParseException message in all YAML file loaders (fancyweb)
* bug #36683 [Yaml] fix parse error when unindented collections contain a comment (wdiesveld)
* bug #36672 [Validator] Skip validation when email is an empty object (acrobat)
* bug #36673 [PhpUnitBridge] fix PHP 5.3 compat again (nicolas-grekas)
* bug #36505 [Translation] Fix for translation:update command updating ICU messages (artemoliynyk)
* bug #36627 [Validator] fix lazy property usage. (bendavies)
* bug #36601 [Serializer] do not transform empty \Traversable to Array (soyuka)
* bug #36606 [Cache] Fixed not supported Redis eviction policies (SerheyDolgushev)
* bug #36625 [PhpUnitBridge] fix compat with PHP 5.3 (nicolas-grekas)
* 5.0.8 (2020-04-28)
* bug #36536 [Cache] Allow invalidateTags calls to be traced by data collector (l-vo)

View File

@ -23,15 +23,15 @@ Symfony is the result of the work of many people who made the code better
- Johannes S (johannes)
- Kris Wallsmith (kriswallsmith)
- Yonel Ceruto (yonelceruto)
- Hugo Hamon (hhamon)
- Wouter de Jong (wouterj)
- Hugo Hamon (hhamon)
- Thomas Calvet (fancyweb)
- Alexander M. Turek (derrabus)
- Abdellatif Ait boudad (aitboudad)
- Samuel ROZE (sroze)
- Romain Neutron (romain)
- Pascal Borreli (pborreli)
- Joseph Bielawski (stloyd)
- Alexander M. Turek (derrabus)
- Karma Dordrak (drak)
- Lukas Kahwe Smith (lsmith)
- Jules Pietri (heah)
@ -60,16 +60,16 @@ Symfony is the result of the work of many people who made the code better
- Alexander Mols (asm89)
- Konstantin Myakshin (koc)
- Grégoire Paris (greg0ire)
- Bulat Shakirzyanov (avalanche123)
- Valentin Udaltsov (vudaltsov)
- Bulat Shakirzyanov (avalanche123)
- Kevin Bond (kbond)
- Saša Stamenković (umpirsky)
- Peter Rehm (rpet)
- Henrik Bjørnskov (henrikbjorn)
- Gabriel Ostrolucký (gadelat)
- Henrik Bjørnskov (henrikbjorn)
- Gábor Egyed (1ed)
- Miha Vrhovnik
- David Maicher (dmaicher)
- Gábor Egyed (1ed)
- Diego Saint Esteben (dii3g0)
- Jan Schädlich (jschaedl)
- Titouan Galopin (tgalopin)
@ -132,6 +132,7 @@ Symfony is the result of the work of many people who made the code better
- Daniel Wehner (dawehner)
- Tugdual Saunier (tucksaun)
- excelwebzone
- Massimiliano Arione (garak)
- Gordon Franke (gimler)
- Joel Wurtz (brouznouf)
- Fabien Pennequin (fabienpennequin)
@ -139,7 +140,6 @@ Symfony is the result of the work of many people who made the code better
- Przemysław Bogusz (przemyslaw-bogusz)
- Eric GELOEN (gelo)
- Lars Strojny (lstrojny)
- Massimiliano Arione (garak)
- Jannik Zschiesche (apfelbox)
- Robert Schönthal (digitalkaoz)
- Gregor Harlan (gharlan)
@ -161,6 +161,7 @@ Symfony is the result of the work of many people who made the code better
- Yanick Witschi (toflar)
- Arnaud Kleinpeter (nanocom)
- Guilherme Blanco (guilhermeblanco)
- Laurent VOULLEMIER (lvo)
- SpacePossum
- Pablo Godel (pgodel)
- Jérémie Augustin (jaugustin)
@ -181,6 +182,7 @@ Symfony is the result of the work of many people who made the code better
- jeremyFreeAgent (jeremyfreeagent)
- Rouven Weßling (realityking)
- Jérôme Parmentier (lctrs)
- Ben Davies (bendavies)
- Andreas Schempp (aschempp)
- Clemens Tolboom
- Helmer Aaviksoo
@ -195,7 +197,7 @@ Symfony is the result of the work of many people who made the code better
- Tyson Andre
- GDIBass
- Samuel NELA (snela)
- Ben Davies (bendavies)
- Saif (╯°□°)╯ (azjezz)
- James Halsall (jaitsu)
- Matthieu Napoli (mnapoli)
- Florent Mata (fmata)
@ -204,6 +206,7 @@ Symfony is the result of the work of many people who made the code better
- Dmitrii Chekaliuk (lazyhammer)
- Clément JOBEILI (dator)
- Marek Štípek (maryo)
- Filippo Tessarotto (slamdunk)
- Daniel Espendiller
- Possum
- Dorian Villet (gnutix)
@ -211,11 +214,11 @@ Symfony is the result of the work of many people who made the code better
- Sergey Linnik (linniksa)
- Richard Miller (mr_r_miller)
- Albert Casademont (acasademont)
- Wouter J
- Mario A. Alvarez Garcia (nomack84)
- Dennis Benkert (denderello)
- DQNEO
- Andre Rømcke (andrerom)
- Saif (╯°□°)╯ (azjezz)
- mcfedr (mcfedr)
- Gary PEGEOT (gary-p)
- Ruben Gonzalez (rubenrua)
@ -232,7 +235,6 @@ Symfony is the result of the work of many people who made the code better
- Stadly
- Stepan Anchugov (kix)
- bronze1man
- Filippo Tessarotto (slamdunk)
- sun (sun)
- Larry Garfield (crell)
- Nikolay Labinskiy (e-moe)
@ -245,7 +247,6 @@ Symfony is the result of the work of many people who made the code better
- fivestar
- Dominique Bongiraud
- Jeremy Livingston (jeremylivingston)
- Laurent VOULLEMIER (lvo)
- Michael Lee (zerustech)
- Matthieu Auger (matthieuauger)
- Mathias Arlaud (mtarld)
@ -255,6 +256,7 @@ Symfony is the result of the work of many people who made the code better
- Dustin Whittle (dustinwhittle)
- jeff
- John Kary (johnkary)
- Tien Vo (tienvx)
- Justin Hileman (bobthecow)
- Blanchon Vincent (blanchonvincent)
- Michele Orselli (orso)
@ -269,7 +271,6 @@ Symfony is the result of the work of many people who made the code better
- Tristan Darricau (nicofuma)
- Victor Bocharsky (bocharsky_bw)
- Tomas Norkūnas (norkunas)
- Wouter J
- Smaine Milianni (ismail1432)
- Marcel Beerta (mazen)
- Christopher Hertel (chertel)
@ -295,7 +296,6 @@ Symfony is the result of the work of many people who made the code better
- Marcos Sánchez
- Elnur Abdurrakhimov (elnur)
- Manuel Reinhard (sprain)
- Tien Vo (tienvx)
- Danny Berger (dpb587)
- Antonio J. García Lagar (ajgarlag)
- Adam Prager (padam87)
@ -309,6 +309,7 @@ Symfony is the result of the work of many people who made the code better
- Arjen Brouwer (arjenjb)
- Katsuhiro OGAWA
- Patrick McDougle (patrick-mcdougle)
- Marc Weistroff (futurecat)
- Alif Rachmawadi
- Anton Chernikov (anton_ch1989)
- Kristen Gilden (kgilden)
@ -318,6 +319,7 @@ Symfony is the result of the work of many people who made the code better
- Jakub Kucharovic (jkucharovic)
- Loick Piera (pyrech)
- Uwe Jäger (uwej711)
- Martin Hujer (martinhujer)
- Eugene Leonovich (rybakit)
- Joseph Rouff (rouffj)
- Félix Labrecque (woodspire)
@ -354,9 +356,9 @@ Symfony is the result of the work of many people who made the code better
- Wouter Van Hecke
- Peter Kruithof (pkruithof)
- Michael Holm (hollo)
- Antonio Pauletich (x-coder264)
- Arjen van der Meijden
- Mathieu Lechat
- Marc Weistroff (futurecat)
- Damien Alexandre (damienalexandre)
- Simon Mönch (sm)
- Christian Schmidt
@ -388,6 +390,7 @@ Symfony is the result of the work of many people who made the code better
- Aurelijus Valeiša (aurelijus)
- Jan Decavele (jandc)
- Gustavo Piltcher
- Jesse Rushlow (geeshoe)
- Stepan Tanasiychuk (stfalcon)
- Tiago Ribeiro (fixe)
- Hidde Boomsma (hboomsma)
@ -416,7 +419,9 @@ Symfony is the result of the work of many people who made the code better
- Nicolas LEFEVRE (nicoweb)
- alquerci
- Oleg Andreyev
- Langlet Vincent (deviling)
- Mateusz Sip (mateusz_sip)
- Alessandro Lai (jean85)
- Francesco Levorato
- Vitaliy Zakharov (zakharovvi)
- Tobias Sjösten (tobiassjosten)
@ -427,14 +432,15 @@ Symfony is the result of the work of many people who made the code better
- Tomasz Kowalczyk (thunderer)
- Artur Eshenbrener
- Timo Bakx (timobakx)
- Antonio Pauletich (x-coder264)
- Thomas Perez (scullwm)
- Felix Labrecque
- Yaroslav Kiliba
- Terje Bråten
- Robbert Klarenbeek (robbertkl)
- soyuka
- Eric Masoero (eric-masoero)
- Denis Brumann (dbrumann)
- Gocha Ossinkine (ossinkine)
- JhonnyL
- Haralan Dobrev (hkdobrev)
- hossein zolfi (ocean)
@ -449,10 +455,10 @@ Symfony is the result of the work of many people who made the code better
- Philipp Kräutli (pkraeutli)
- Grzegorz (Greg) Zdanowski (kiler129)
- Iker Ibarguren (ikerib)
- Dimitri Gritsajuk (ottaviano)
- Kirill chEbba Chebunin (chebba)
- Rokas Mikalkėnas (rokasm)
- Greg Thornton (xdissent)
- Martin Hujer (martinhujer)
- Alex Bowers
- Philipp Cordes
- Costin Bereveanu (schniper)
@ -473,6 +479,7 @@ Symfony is the result of the work of many people who made the code better
- Endre Fejes
- Tobias Naumann (tna)
- Daniel Beyer
- Timothée Barray (tyx)
- Shein Alexey
- Romain Gautier (mykiwi)
- Joe Lencioni
@ -489,7 +496,6 @@ Symfony is the result of the work of many people who made the code better
- Xavier HAUSHERR
- Albert Jessurum (ajessu)
- Laszlo Korte
- Jesse Rushlow (geeshoe)
- Miha Vrhovnik
- Alessandro Desantis
- hubert lecorche (hlecorche)
@ -501,6 +507,7 @@ Symfony is the result of the work of many people who made the code better
- Christophe L. (christophelau)
- Sander Toonen (xatoo)
- Anthon Pang (robocoder)
- Marko Kaznovac (kaznovac)
- Sébastien Santoro (dereckson)
- Brian King
- Michel Salib (michelsalib)
@ -524,7 +531,6 @@ Symfony is the result of the work of many people who made the code better
- Mihai Stancu
- Ivan Nikolaev (destillat)
- Gildas Quéméner (gquemener)
- Alessandro Lai (jean85)
- Desjardins Jérôme (jewome62)
- Arturs Vonda
- Josip Kruslin
@ -561,7 +567,6 @@ Symfony is the result of the work of many people who made the code better
- Marek Pietrzak
- Luc Vieillescazes (iamluc)
- franek (franek)
- soyuka
- Raulnet
- Christian Wahler
- Giso Stallenberg (gisostallenberg)
@ -571,7 +576,6 @@ Symfony is the result of the work of many people who made the code better
- HypeMC
- Soufian EZ-ZANTAR (soezz)
- Zander Baldwin
- Gocha Ossinkine (ossinkine)
- Adam Harvey
- Anton Bakai
- Martin Auswöger
@ -603,9 +607,9 @@ Symfony is the result of the work of many people who made the code better
- Philipp Rieber (bicpi)
- Manuel de Ruiter (manuel)
- Nathanael Noblet (gnat)
- Dimitri Gritsajuk (ottaviano)
- nikos.sotiropoulos
- Eduardo Oliveira (entering)
- Oleksii Zhurbytskyi
- Ilya Antipenko (aivus)
- Ricardo Oliveira (ricardolotr)
- Roy Van Ginneken (rvanginneken)
@ -645,9 +649,9 @@ Symfony is the result of the work of many people who made the code better
- Gábor Fási
- DUPUCH (bdupuch)
- Nate (frickenate)
- Timothée Barray (tyx)
- jhonnyL
- Jacek Jędrzejewski (jacek.jedrzejewski)
- Stefan Kruppa
- sasezaki
- Bozhidar Hristov (warxcell)
- Dawid Pakuła (zulusx)
@ -684,7 +688,6 @@ Symfony is the result of the work of many people who made the code better
- Pavel Campr (pcampr)
- Andrii Dembitskyi
- Johnny Robeson (johnny)
- Marko Kaznovac (kaznovac)
- Guilliam Xavier
- Disquedur
- Michiel Boeckaert (milio)
@ -711,6 +714,7 @@ Symfony is the result of the work of many people who made the code better
- vitaliytv
- Philippe Segatori
- Dalibor Karlović (dkarlovi)
- Andrey Sevastianov
- Sebastian Blum
- Alexis Lefebvre
- aubx
@ -728,6 +732,7 @@ Symfony is the result of the work of many people who made the code better
- Sinan Eldem
- BoShurik
- Alexandre Dupuy (satchette)
- Michel Hunziker
- Malte Blättermann
- Simeon Kolev (simeon_kolev9)
- Joost van Driel (j92)
@ -741,7 +746,6 @@ Symfony is the result of the work of many people who made the code better
- Stefan Gehrig (sgehrig)
- Hany el-Kerdany
- Wang Jingyu
- Langlet Vincent (deviling)
- Åsmund Garfors
- Gunnstein Lye (glye)
- Maxime Douailin
@ -847,8 +851,10 @@ Symfony is the result of the work of many people who made the code better
- Michael Lutz
- Koen Reiniers (koenre)
- jochenvdv
- Michel Roca (mroca)
- Reedy
- Arturas Smorgun (asarturas)
- Michał (bambucha15)
- Alexander Volochnev (exelenz)
- Michael Piecko
- Toni Peric (tperic)
@ -879,12 +885,12 @@ Symfony is the result of the work of many people who made the code better
- Axel Guckelsberger (guite)
- Jose Gonzalez
- Jonathan (jls-esokia)
- Oleksii Zhurbytskyi
- Dariusz Ruminski
- Joshua Nye
- Claudio Zizza
- Dave Marshall (davedevelopment)
- Jakub Kulhan (jakubkulhan)
- Nathan Dench (ndenc2)
- Shaharia Azam
- avorobiev
- stoccc
@ -948,9 +954,11 @@ Symfony is the result of the work of many people who made the code better
- GDIBass
- Antoine Lamirault
- Adrien Lucas (adrienlucas)
- Jeroen Thora (bolle)
- Zhuravlev Alexander (scif)
- Stefano Degenkamp (steef)
- James Michael DuPont
- Carlos Buenosvinos (carlosbuenosvinos)
- Tom Klingenberg
- Christopher Hall (mythmakr)
- Patrick Dawkins (pjcdawkins)
@ -982,6 +990,7 @@ Symfony is the result of the work of many people who made the code better
- Julie Hourcade (juliehde)
- Dmitry Parnas (parnas)
- Paul LE CORRE
- Loïc Beurlet
- Daniel Gorgan
- Tony Malzhacker
- Mathieu MARCHOIS
@ -1006,7 +1015,6 @@ Symfony is the result of the work of many people who made the code better
- Jelle Kapitein
- Benoît Bourgeois
- mantulo
- Stefan Kruppa
- corphi
- JoppeDC
- grizlik
@ -1049,6 +1057,7 @@ Symfony is the result of the work of many people who made the code better
- Arno Geurts
- Adán Lobato (adanlobato)
- Ian Jenkins (jenkoian)
- Hugo Alliaume (kocal)
- Marcos Gómez Vilches (markitosgv)
- Matthew Davis (mdavis1982)
- Markus S. (staabm)
@ -1062,6 +1071,7 @@ Symfony is the result of the work of many people who made the code better
- Daniel Cestari
- Matt Janssen
- David Lima
- Dmitriy Derepko
- Stéphane Delprat
- Brian Freytag (brianfreytag)
- Samuele Lilli (doncallisto)
@ -1148,6 +1158,7 @@ Symfony is the result of the work of many people who made the code better
- Anton Babenko (antonbabenko)
- Irmantas Šiupšinskas (irmantas)
- Danilo Silva
- Giuseppe Campanelli
- Arnaud PETITPAS (apetitpa)
- Ken Stanley
- Zachary Tong (polyfractal)
@ -1164,6 +1175,7 @@ Symfony is the result of the work of many people who made the code better
- Tero Alén (tero)
- Stanislav Kocanda
- DerManoMann
- MatTheCat
- Guillaume Royer
- Artem (digi)
- boite
@ -1184,7 +1196,6 @@ Symfony is the result of the work of many people who made the code better
- Danijel Obradović
- Pablo Borowicz
- Mathieu Santostefano
- Michel Hunziker
- Arjan Keeman
- Máximo Cuadros (mcuadros)
- Lukas Mencl
@ -1277,7 +1288,6 @@ Symfony is the result of the work of many people who made the code better
- Jakub Sacha
- Olaf Klischat
- orlovv
- Andrey Sevastianov
- Claude Dioudonnat
- Jonathan Hedstrom
- Peter Smeets (darkspartan)
@ -1297,12 +1307,10 @@ Symfony is the result of the work of many people who made the code better
- James Hudson
- Stephen Clouse
- e-ivanov
- Michał (bambucha15)
- Benjamin Dos Santos
- Einenlum
- Jérémy Jarrié (gagnar)
- Jochen Bayer (jocl)
- Michel Roca (mroca)
- Patrick Carlo-Hickman
- Bruno MATEU
- Jeremy Bush
@ -1416,6 +1424,7 @@ Symfony is the result of the work of many people who made the code better
- Florian Hermann (fhermann)
- Mo Di (modi)
- Pablo Schläpfer
- Christian Rishøj
- Patrick Berenschot
- SuRiKmAn
- Gert de Pagter
@ -1423,6 +1432,7 @@ Symfony is the result of the work of many people who made the code better
- David Négrier (moufmouf)
- Quique Porta (quiqueporta)
- mohammadreza honarkhah
- Artem Oliynyk (artemoliynyk)
- Andrea Quintino (dirk39)
- Tomasz Szymczyk (karion)
- Alex Vasilchenko
@ -1453,6 +1463,7 @@ Symfony is the result of the work of many people who made the code better
- Andrei Igna
- Adam Prickett
- azine
- Anton Kroshilin
- Dawid Sajdak
- Ludek Stepan
- Aaron Stephens (astephens)
@ -1605,6 +1616,7 @@ Symfony is the result of the work of many people who made the code better
- Robert Queck
- Peter Bouwdewijn
- mlively
- Wouter Diesveld
- Amine Matmati
- caalholm
- Nouhail AL FIDI (alfidi)
@ -1612,6 +1624,7 @@ Symfony is the result of the work of many people who made the code better
- Felipy Tavares Amorim (felipyamorim)
- Guillaume Loulier (guikingone)
- Klaus Silveira (klaussilveira)
- Pedro Casado (pdr33n)
- Pierre Grimaud (pgrimaud)
- Thomas Chmielowiec (chmielot)
- Jānis Lukss
@ -1724,6 +1737,7 @@ Symfony is the result of the work of many people who made the code better
- Stanislav Gamayunov (happyproff)
- Iwan van Staveren (istaveren)
- Alexander McCullagh (mccullagh)
- Paul L McNeely (mcneely)
- Povilas S. (povilas)
- Laurent Negre (raulnet)
- Evrard Boulou
@ -1809,6 +1823,7 @@ Symfony is the result of the work of many people who made the code better
- Mathieu Dewet (mdewet)
- Nicolas Tallefourtané (nicolab)
- Botond Dani (picur)
- Rémi Faivre (rfv)
- Romaric Drigon (romaricdrigon)
- Thierry Marianne (thierrymarianne)
- Nick Stemerdink
@ -1816,6 +1831,7 @@ Symfony is the result of the work of many people who made the code better
- jjanvier
- Julius Beckmann
- loru88
- Thibaut Salanon
- Romain Dorgueil
- Christopher Parotat
- Dennis Haarbrink
@ -1860,6 +1876,7 @@ Symfony is the result of the work of many people who made the code better
- Chris
- Farid Jalilov
- Florent Olivaud
- Eric Hertwig
- JakeFr
- Simon Sargeant
- efeen
@ -1920,6 +1937,7 @@ Symfony is the result of the work of many people who made the code better
- Michael van Tricht
- ReScO
- Tim Strehle
- Sébastien COURJEAN
- Sam Ward
- Michael Voříšek
- Walther Lalk
@ -1972,6 +1990,7 @@ Symfony is the result of the work of many people who made the code better
- Martijn Boers (plebian)
- Pedro Magalhães (pmmaga)
- Rares Vlaseanu (raresvla)
- Sergii Dolgushev (serhey)
- tante kinast (tante)
- Stephen Lewis (tehanomalousone)
- Ahmed Hannachi (tiecoders)
@ -1981,6 +2000,7 @@ Symfony is the result of the work of many people who made the code better
- Darryl Hein (xmmedia)
- Sadicov Vladimir (xtech)
- Kevin EMO (zarcox)
- sdkawata
- Andrzej
- Alexander Zogheb
- Rémi Blaise
@ -2016,6 +2036,7 @@ Symfony is the result of the work of many people who made the code better
- Ashura
- Götz Gottwald
- Veres Lajos
- Ernest Hymel
- Nick Chiu
- grifx
- Robert Campbell
@ -2045,6 +2066,7 @@ Symfony is the result of the work of many people who made the code better
- Rowan Manning
- Per Modin
- David Windell
- Christian Scheb
- Gabriel Birke
- skafandri
- Derek Bonner
@ -2088,7 +2110,6 @@ Symfony is the result of the work of many people who made the code better
- baron (bastien)
- Rosio (ben-rosio)
- Simon Paarlberg (blamh)
- Jeroen Thora (bolle)
- Brieuc THOMAS (brieucthomas)
- Masao Maeda (brtriver)
- Damien Harper (damien.harper)
@ -2148,6 +2169,7 @@ Symfony is the result of the work of many people who made the code better
- Michael Orlitzky
- Nicolas A. Bérard-Nault
- Quentin Favrie
- Matthias Derer
- Saem Ghani
- Stefan Oderbolz
- Curtis
@ -2173,7 +2195,6 @@ Symfony is the result of the work of many people who made the code better
- Daniele Cesarini (ijanki)
- Ismail Asci (ismailasci)
- Jeffrey Moelands (jeffreymoelands)
- Hugo Alliaume (kocal)
- Simon CONSTANS (kosssi)
- Dennis Langen (nijusan)
- Paulius Jarmalavičius (pjarmalavicius)
@ -2218,6 +2239,7 @@ Symfony is the result of the work of many people who made the code better
- Antonio Angelino
- Jens Schulze
- Matt Fields
- Olatunbosun Egberinde
- Niklas Keller
- Andras Debreczeni
- Vladimir Sazhin
@ -2352,11 +2374,11 @@ Symfony is the result of the work of many people who made the code better
- Karolis Daužickas
- Nicolas
- Sergio Santoro
- Dmitriy Derepko
- tirnanog06
- phc
- Дмитрий Пацура
- Signor Pedro
- Matthias Larisch
- ilyes kooli
- Ilia Lazarev
- Michaël VEROUX
@ -2388,8 +2410,10 @@ Symfony is the result of the work of many people who made the code better
- Christian Gripp (core23)
- Christoph Schaefer (cvschaefer)
- Damon Jones (damon__jones)
- Cătălin Dan (dancatalin)
- Łukasz Giza (destroyer)
- Daniel Londero (dlondero)
- Dmitrii Tarasov (dtarasov)
- Sebastian Landwehr (dword123)
- Adel ELHAIBA (eadel)
- Damián Nohales (eagleoneraptor)

View File

@ -182,6 +182,11 @@ if (!file_exists("$PHPUNIT_DIR/$PHPUNIT_VERSION_DIR/phpunit") || $configurationH
}
}
$info += [
'versions' => [],
'requires' => ['php' => '*'],
];
if (1 === \count($info['versions'])) {
$passthruOrFail("$COMPOSER create-project --ignore-platform-reqs --no-install --prefer-dist --no-scripts --no-plugins --no-progress --ansi -s dev phpunit/phpunit $PHPUNIT_VERSION_DIR \"$PHPUNIT_VERSION.*\"");
} else {

View File

@ -131,13 +131,6 @@
removeClass(ajaxToolbarPanel, 'sf-ajax-request-loading');
removeClass(ajaxToolbarPanel, 'sf-toolbar-status-red');
}
addEventListener(document.querySelector('.sf-toolbar-ajax-clear'), 'click', function() {
requestStack = [];
renderAjaxRequests();
successStreak = 4;
document.querySelector('.sf-toolbar-ajax-request-list').innerHTML = '';
});
};
var startAjaxRequest = function(index) {
@ -506,6 +499,12 @@
setPreference('toolbar/displayState', 'block');
});
renderAjaxRequests();
addEventListener(document.querySelector('.sf-toolbar-ajax-clear'), 'click', function() {
requestStack = [];
renderAjaxRequests();
successStreak = 4;
document.querySelector('.sf-toolbar-ajax-request-list').innerHTML = '';
});
addEventListener(document.querySelector('.sf-toolbar-block-ajax'), 'mouseenter', function (event) {
var elem = document.querySelector('.sf-toolbar-block-ajax .sf-toolbar-info');
elem.scrollTop = elem.scrollHeight;

View File

@ -72,7 +72,6 @@ class FormValidator extends ConstraintValidator
if ($groups instanceof GroupSequence) {
// Validate the data, the form AND nested fields in sequence
$violationsCount = $this->context->getViolations()->count();
$fieldPropertyPath = \is_object($data) ? 'children[%s]' : 'children%s';
foreach ($groups->groups as $group) {
if ($validateDataGraph) {
@ -91,7 +90,7 @@ class FormValidator extends ConstraintValidator
// in different steps without breaking early enough
$this->resolvedGroups[$field] = (array) $group;
$fieldFormConstraint = new Form();
$validator->atPath(sprintf($fieldPropertyPath, $field->getPropertyPath()))->validate($field, $fieldFormConstraint);
$validator->atPath(sprintf('children[%s]', $field->getName()))->validate($field, $fieldFormConstraint);
}
}
@ -100,8 +99,6 @@ class FormValidator extends ConstraintValidator
}
}
} else {
$fieldPropertyPath = \is_object($data) ? 'children[%s]' : 'children%s';
if ($validateDataGraph) {
$validator->atPath('data')->validate($data, null, $groups);
}
@ -138,7 +135,7 @@ class FormValidator extends ConstraintValidator
if ($field->isSubmitted()) {
$this->resolvedGroups[$field] = $groups;
$fieldFormConstraint = new Form();
$validator->atPath(sprintf($fieldPropertyPath, $field->getPropertyPath()))->validate($field, $fieldFormConstraint);
$validator->atPath(sprintf('children[%s]', $field->getName()))->validate($field, $fieldFormConstraint);
}
}
}

View File

@ -18,6 +18,7 @@ use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper;
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator;
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormFactoryBuilder;
use Symfony\Component\Form\FormFactoryInterface;
@ -52,7 +53,9 @@ class FormValidatorTest extends ConstraintValidatorTestCase
protected function setUp(): void
{
$this->dispatcher = new EventDispatcher();
$this->factory = (new FormFactoryBuilder())->getFormFactory();
$this->factory = (new FormFactoryBuilder())
->addExtension(new ValidatorExtension(Validation::createValidator()))
->getFormFactory();
parent::setUp();
@ -836,6 +839,61 @@ class FormValidatorTest extends ConstraintValidatorTestCase
$this->assertSame('data[field1]', $context->getViolations()[0]->getPropertyPath());
}
public function testCascadeValidationToChildFormsUsingPropertyPaths()
{
$form = $this->getCompoundForm([], [
'validation_groups' => ['group1', 'group2'],
])
->add('field1', null, [
'constraints' => [new NotBlank(['groups' => 'group1'])],
'property_path' => '[foo]',
])
->add('field2', null, [
'constraints' => [new NotBlank(['groups' => 'group2'])],
'property_path' => '[bar]',
])
;
$form->submit([
'field1' => '',
'field2' => '',
]);
$context = new ExecutionContext(Validation::createValidator(), $form, new IdentityTranslator());
$this->validator->initialize($context);
$this->validator->validate($form, new Form());
$this->assertCount(2, $context->getViolations());
$this->assertSame('This value should not be blank.', $context->getViolations()[0]->getMessage());
$this->assertSame('children[field1].data', $context->getViolations()[0]->getPropertyPath());
$this->assertSame('This value should not be blank.', $context->getViolations()[1]->getMessage());
$this->assertSame('children[field2].data', $context->getViolations()[1]->getPropertyPath());
}
public function testCascadeValidationToChildFormsUsingPropertyPathsValidatedInSequence()
{
$form = $this->getCompoundForm([], [
'validation_groups' => new GroupSequence(['group1', 'group2']),
])
->add('field1', null, [
'constraints' => [new NotBlank(['groups' => 'group1'])],
'property_path' => '[foo]',
])
;
$form->submit([
'field1' => '',
]);
$context = new ExecutionContext(Validation::createValidator(), $form, new IdentityTranslator());
$this->validator->initialize($context);
$this->validator->validate($form, new Form());
$this->assertCount(1, $context->getViolations());
$this->assertSame('This value should not be blank.', $context->getViolations()[0]->getMessage());
$this->assertSame('children[field1].data', $context->getViolations()[0]->getPropertyPath());
}
protected function createValidator()
{
return new FormValidator();

View File

@ -28,8 +28,6 @@ final class NativeClientState extends ClientState
public $responseCount = 0;
/** @var string[] */
public $dnsCache = [];
/** @var resource[] */
public $handles = [];
/** @var bool */
public $sleep = false;

View File

@ -220,11 +220,6 @@ final class NativeResponse implements ResponseInterface
*/
private static function perform(ClientState $multi, array &$responses = null): void
{
// List of native handles for stream_select()
if (null !== $responses) {
$multi->handles = [];
}
foreach ($multi->openHandles as $i => [$h, $buffer, $onProgress]) {
$hasActivity = false;
$remaining = &$multi->openHandles[$i][3];
@ -291,8 +286,6 @@ final class NativeResponse implements ResponseInterface
$multi->handlesActivity[$i][] = $e;
unset($multi->openHandles[$i]);
$multi->sleep = false;
} elseif (null !== $responses) {
$multi->handles[] = $h;
}
}
@ -307,7 +300,7 @@ final class NativeResponse implements ResponseInterface
}
}
if (\count($multi->handles) >= $multi->maxHostConnections) {
if (\count($multi->openHandles) >= $multi->maxHostConnections) {
return;
}
@ -318,10 +311,6 @@ final class NativeResponse implements ResponseInterface
$multi->sleep = false;
self::perform($multi);
if (null !== $response->handle) {
$multi->handles[] = $response->handle;
}
break;
}
}
@ -335,7 +324,8 @@ final class NativeResponse implements ResponseInterface
private static function select(ClientState $multi, float $timeout): int
{
$_ = [];
$handles = array_column($multi->openHandles, 0);
return (!$multi->sleep = !$multi->sleep) ? -1 : stream_select($multi->handles, $_, $_, (int) $timeout, (int) (1E6 * ($timeout - (int) $timeout)));
return (!$multi->sleep = !$multi->sleep) ? -1 : stream_select($handles, $_, $_, (int) $timeout, (int) (1E6 * ($timeout - (int) $timeout)));
}
}

View File

@ -137,7 +137,7 @@ trait ResponseTrait
public function toArray(bool $throw = true): array
{
if ('' === $content = $this->getContent($throw)) {
throw new TransportException('Response body is empty.');
throw new JsonException('Response body is empty.');
}
if (null !== $this->jsonData) {
@ -316,7 +316,7 @@ trait ResponseTrait
}
$lastActivity = microtime(true);
$isTimeout = false;
$enlapsedTimeout = 0;
while (true) {
$hasActivity = false;
@ -338,7 +338,7 @@ trait ResponseTrait
} elseif (!isset($multi->openHandles[$j])) {
unset($responses[$j]);
continue;
} elseif ($isTimeout) {
} elseif ($enlapsedTimeout >= $timeoutMax) {
$multi->handlesActivity[$j] = [new ErrorChunk($response->offset, sprintf('Idle timeout reached for "%s".', $response->getInfo('url')))];
} else {
continue;
@ -346,7 +346,7 @@ trait ResponseTrait
while ($multi->handlesActivity[$j] ?? false) {
$hasActivity = true;
$isTimeout = false;
$enlapsedTimeout = 0;
if (\is_string($chunk = array_shift($multi->handlesActivity[$j]))) {
if (null !== $response->inflate && false === $chunk = @inflate_add($response->inflate, $chunk)) {
@ -379,7 +379,7 @@ trait ResponseTrait
}
} elseif ($chunk instanceof ErrorChunk) {
unset($responses[$j]);
$isTimeout = true;
$enlapsedTimeout = $timeoutMax;
} elseif ($chunk instanceof FirstChunk) {
if ($response->logger) {
$info = $response->getInfo();
@ -447,10 +447,11 @@ trait ResponseTrait
continue;
}
switch (self::select($multi, $timeoutMin)) {
case -1: usleep(min(500, 1E6 * $timeoutMin)); break;
case 0: $isTimeout = microtime(true) - $lastActivity > $timeoutMax; break;
if (-1 === self::select($multi, min($timeoutMin, $timeoutMax - $enlapsedTimeout))) {
usleep(min(500, 1E6 * $timeoutMin));
}
$enlapsedTimeout = microtime(true) - $lastActivity;
}
}
}

View File

@ -33,4 +33,13 @@ class CurlHttpClientTest extends HttpClientTestCase
return new CurlHttpClient(['verify_peer' => false, 'verify_host' => false]);
}
public function testTimeoutIsNotAFatalError()
{
if ('\\' === \DIRECTORY_SEPARATOR) {
$this->markTestSkipped('Too transient on Windows');
}
parent::testTimeoutIsNotAFatalError();
}
}

View File

@ -83,9 +83,9 @@ abstract class HttpClientTestCase extends BaseHttpClientTestCase
$this->assertSame($response, stream_get_meta_data($stream)['wrapper_data']->getResponse());
$this->assertSame(404, $response->getStatusCode());
$this->expectException(ClientException::class);
$response = $client->request('GET', 'http://localhost:8057/404');
$stream = $response->toStream();
$this->expectException(ClientException::class);
$response->toStream();
}
public function testNonBlockingStream()
@ -93,6 +93,7 @@ abstract class HttpClientTestCase extends BaseHttpClientTestCase
$client = $this->getHttpClient(__FUNCTION__);
$response = $client->request('GET', 'http://localhost:8057/timeout-body');
$stream = $response->toStream();
usleep(10000);
$this->assertTrue(stream_set_blocking($stream, false));
$this->assertSame('<1>', fread($stream, 8192));

View File

@ -190,6 +190,10 @@ class MockHttpClientTest extends HttpClientTestCase
$this->markTestSkipped("MockHttpClient doesn't unzip");
break;
case 'testTimeoutWithActiveConcurrentStream':
$this->markTestSkipped('Real transport required');
break;
case 'testDestruct':
$this->markTestSkipped("MockHttpClient doesn't timeout on destruct");
break;

View File

@ -35,6 +35,12 @@ class MockResponseTest extends TestCase
public function toArrayErrors()
{
yield [
'content' => '',
'responseHeaders' => [],
'message' => 'Response body is empty.',
];
yield [
'content' => '{}',
'responseHeaders' => ['content-type' => 'plain/text'],

View File

@ -24,11 +24,6 @@ final class SMimeSigner extends SMime
private $signOptions;
private $extraCerts;
/**
* @var string|null
*/
private $privateKeyPassphrase;
/**
* @param string $certificate The path of the file containing the signing certificate (in PEM format)
* @param string $privateKey The path of the file containing the private key (in PEM format)
@ -52,7 +47,6 @@ final class SMimeSigner extends SMime
$this->signOptions = $signOptions ?? PKCS7_DETACHED;
$this->extraCerts = $extraCerts ? realpath($extraCerts) : null;
$this->privateKeyPassphrase = $privateKeyPassphrase;
}
public function sign(Message $message): Message

View File

@ -21,6 +21,7 @@ use Symfony\Component\Serializer\Exception\InvalidArgumentException;
use Symfony\Component\Serializer\Exception\LogicException;
use Symfony\Component\Serializer\Exception\NotEncodableValueException;
use Symfony\Component\Serializer\Exception\NotNormalizableValueException;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\CacheableSupportsMethodInterface;
use Symfony\Component\Serializer\Normalizer\ContextAwareDenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
@ -158,7 +159,7 @@ class Serializer implements SerializerInterface, ContextAwareNormalizerInterface
}
if (\is_array($data) || $data instanceof \Traversable) {
if ($data instanceof \Countable && 0 === $data->count()) {
if (($context[AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS] ?? false) === true && $data instanceof \Countable && 0 === $data->count()) {
return $data;
}

View File

@ -492,6 +492,27 @@ class SerializerTest extends TestCase
(new Serializer())->normalize(tmpfile());
}
public function testNormalizeTransformEmptyArrayObjectToArray()
{
$serializer = new Serializer(
[
new PropertyNormalizer(),
new ObjectNormalizer(),
new ArrayDenormalizer(),
],
[
'json' => new JsonEncoder(),
]
);
$object = [];
$object['foo'] = new \ArrayObject();
$object['bar'] = new \ArrayObject(['notempty']);
$object['baz'] = new \ArrayObject(['nested' => new \ArrayObject()]);
$this->assertSame('{"foo":[],"bar":["notempty"],"baz":{"nested":[]}}', $serializer->serialize($object, 'json'));
}
public function testNormalizePreserveEmptyArrayObject()
{
$serializer = new Serializer(

View File

@ -92,7 +92,7 @@ class VarExporterTest extends TestCase
} elseif (\PHP_VERSION_ID < 70400) {
$fixtureFile = __DIR__.'/Fixtures/'.$testName.'-legacy.php';
} else {
$this->markAsSkipped('PHP >= 7.4.6 required.');
$this->markTestSkipped('PHP >= 7.4.6 required.');
}
$this->assertStringEqualsFile($fixtureFile, $dump);

View File

@ -811,6 +811,30 @@ abstract class HttpClientTestCase extends TestCase
}
}
public function testTimeoutWithActiveConcurrentStream()
{
$p1 = TestHttpServer::start(8067);
$p2 = TestHttpServer::start(8077);
$client = $this->getHttpClient(__FUNCTION__);
$streamingResponse = $client->request('GET', 'http://localhost:8067/max-duration');
$blockingResponse = $client->request('GET', 'http://localhost:8077/timeout-body', [
'timeout' => 0.25,
]);
$this->assertSame(200, $streamingResponse->getStatusCode());
$this->assertSame(200, $blockingResponse->getStatusCode());
$this->expectException(TransportExceptionInterface::class);
try {
$blockingResponse->getContent();
} finally {
$p1->stop();
$p2->stop();
}
}
public function testDestruct()
{
$client = $this->getHttpClient(__FUNCTION__);

View File

@ -16,23 +16,28 @@ use Symfony\Component\Process\Process;
class TestHttpServer
{
private static $process;
private static $process = [];
public static function start()
public static function start(int $port = 8057)
{
if (self::$process) {
self::$process->stop();
if (isset(self::$process[$port])) {
self::$process[$port]->stop();
} else {
register_shutdown_function(static function () use ($port) {
self::$process[$port]->stop();
});
}
$finder = new PhpExecutableFinder();
$process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', '127.0.0.1:8057']));
$process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', '127.0.0.1:'.$port]));
$process->setWorkingDirectory(__DIR__.'/Fixtures/web');
$process->start();
self::$process[$port] = $process;
do {
usleep(50000);
} while (!@fopen('http://127.0.0.1:8057/', 'r'));
} while (!@fopen('http://127.0.0.1:'.$port, 'r'));
self::$process = $process;
return $process;
}
}