The cdn_file_url_alter function yields TypeError.
Following is the error,
TypeError: Argument 1 passed to Drupal\cdn\File\FileUrlGenerator::generate() must be of the type string, null given, called in /app/web/modules/contrib/cdn/cdn.module on line 59 in Drupal\cdn\File\FileUrlGenerator->generate() (line 102 of /app/web/modules/contrib/cdn/src/File/FileUrlGenerator.php)

Comments

rahul.shinde created an issue. See original summary.

rahul.shinde’s picture

Assigned: rahul.shinde » Unassigned
Status: Active » Needs review
StatusFileSize
new653 bytes
wim leers’s picture

Version: 8.x-3.x-dev » 8.x-3.4
Status: Needs review » Needs work
Issue tags: +Needs tests

Thanks for the report and the patch! You must have updated to version 3.4 which I tagged last week — thanks for doing that! 😀

  1. Which PHP version are you on?
  2. I'm surprised there was no test failure. Is our current test coverage inadequate?
rahul.shinde’s picture

@Wim Leers here are the details,

PHP version: 7.3.13
Web Server: Apache/2.4.25 (Debian)

About the test, I haven't checked.

wim leers’s picture

Status: Needs work » Postponed (maintainer needs more info)
Issue tags: -Needs tests

Ohhhh wait

 must be of the type string, null given

That is just a faulty call to file_create_url()! Can you look at the function call trace? Which code called file_create_url()?

rahul.shinde’s picture

Here is the trace log,

TypeError: Argument 1 passed to Drupal\cdn\File\FileUrlGenerator::generate() must be of the type string, null given, called in /app/web/modules/contrib/cdn/cdn.module on line 54 in Drupal\cdn\File\FileUrlGenerator->generate() (line 102 of /app/web/modules/contrib/cdn/src/File/FileUrlGenerator.php) 
#0 /app/web/modules/contrib/cdn/cdn.module(54): Drupal\cdn\File\FileUrlGenerator->generate(NULL)
#1 /app/web/core/lib/Drupal/Core/Extension/ModuleHandler.php(539): cdn_file_url_alter(NULL, NULL, NULL)
#2 /app/web/core/includes/file.inc(216): Drupal\Core\Extension\ModuleHandler->alter('file_url', NULL)
#3 /app/web/core/lib/Drupal/Core/Template/TwigExtension.php(147): file_create_url(NULL)
#4 /app/web/sites/default/files/php/twig/5e141b4da39b8_paragraph--testimonial--t_1A2vpvttHs17RxsxmIrTqIoq0/vSs5eYmzGjVosBvMM9uHsSkJ4N7d6QvhObeKS6lBAUI.php(70): Drupal\Core\Template\TwigExtension->Drupal\Core\Template\{closure}(NULL)
#5 /app/vendor/twig/twig/src/Template.php(455): __TwigTemplate_e52963d9943bbd1cdcd6a201160a4638046d7503b15ea26260f07d237a3a7fcb->doDisplay(Array, Array)
#6 /app/vendor/twig/twig/src/Template.php(422): Twig\Template->displayWithErrorHandling(Array, Array)
#7 /app/vendor/twig/twig/src/Template.php(434): Twig\Template->display(Array)
#8 /app/web/core/themes/engines/twig/twig.engine(64): Twig\Template->render(Array)
#9 /app/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('themes/custom/a...', Array)
#10 /app/web/core/lib/Drupal/Core/Render/Renderer.php(431): Drupal\Core\Theme\ThemeManager->render('paragraph', Array)
#11 /app/web/core/lib/Drupal/Core/Render/Renderer.php(200): Drupal\Core\Render\Renderer->doRender(Array, false)
#12 /app/web/core/lib/Drupal/Core/Template/TwigExtension.php(501): Drupal\Core\Render\Renderer->render(Array)
#13 /app/web/sites/default/files/php/twig/5e141b4da39b8_field--block-content--fie_gf7EOQ2k-x3t4eyl_YiRCmwW_/g0m-xFAWL9bhVBvHEo2Q1VNc_vH6MdqLI_xM1JoTpHY.php(91): Drupal\Core\Template\TwigExtension->escapeFilter(Object(Drupal\Core\Template\TwigEnvironment), Array, 'html', NULL, true)
#14 /app/vendor/twig/twig/src/Template.php(455): __TwigTemplate_673ff83ba71c6f94f1d58959851f7ae8310c5a6f8f3184cd1fa9bf56d029b29a->doDisplay(Array, Array)
#15 /app/vendor/twig/twig/src/Template.php(422): Twig\Template->displayWithErrorHandling(Array, Array)
#16 /app/vendor/twig/twig/src/Template.php(434): Twig\Template->display(Array)
#17 /app/web/core/themes/engines/twig/twig.engine(64): Twig\Template->render(Array)
#18 /app/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('themes/custom/a...', Array)
#19 /app/web/core/lib/Drupal/Core/Render/Renderer.php(431): Drupal\Core\Theme\ThemeManager->render('field', Array)
#20 /app/web/core/lib/Drupal/Core/Render/Renderer.php(444): Drupal\Core\Render\Renderer->doRender(Array)
#21 /app/web/core/lib/Drupal/Core/Render/Renderer.php(444): Drupal\Core\Render\Renderer->doRender(Array)
#22 /app/web/core/lib/Drupal/Core/Render/Renderer.php(200): Drupal\Core\Render\Renderer->doRender(Array, false)
#23 /app/web/core/lib/Drupal/Core/Template/TwigExtension.php(501): Drupal\Core\Render\Renderer->render(Array)
#24 /app/web/sites/default/files/php/twig/5e141b4da39b8_block.html.twig_6iHhQRBs5qOM1x64y4TEqDtII/R0cdLxvNeT23wUCMtoeiq0FGZLx5ustHQyMBu7HSCLo.php(95): Drupal\Core\Template\TwigExtension->escapeFilter(Object(Drupal\Core\Template\TwigEnvironment), Array, 'html', NULL, true)
#25 /app/vendor/twig/twig/src/Template.php(216): __TwigTemplate_94bf6f3ff15ff3d23b99f8555b23fd4d6b5a4825e8bf08e653bcddc5d36fe5b7->block_content(Array, Array)
#26 /app/web/sites/default/files/php/twig/5e141b4da39b8_block.html.twig_6iHhQRBs5qOM1x64y4TEqDtII/R0cdLxvNeT23wUCMtoeiq0FGZLx5ustHQyMBu7HSCLo.php(84): Twig\Template->displayBlock('content', Array, Array)
#27 /app/vendor/twig/twig/src/Template.php(455): __TwigTemplate_94bf6f3ff15ff3d23b99f8555b23fd4d6b5a4825e8bf08e653bcddc5d36fe5b7->doDisplay(Array, Array)
#28 /app/vendor/twig/twig/src/Template.php(422): Twig\Template->displayWithErrorHandling(Array, Array)
#29 /app/vendor/twig/twig/src/Template.php(434): Twig\Template->display(Array)
#30 /app/web/core/themes/engines/twig/twig.engine(64): Twig\Template->render(Array)
#31 /app/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('core/themes/cla...', Array)
#32 /app/web/core/lib/Drupal/Core/Render/Renderer.php(431): Drupal\Core\Theme\ThemeManager->render('block', Array)
#33 /app/web/core/lib/Drupal/Core/Render/Renderer.php(444): Drupal\Core\Render\Renderer->doRender(Array)
#34 /app/web/core/lib/Drupal/Core/Render/Renderer.php(200): Drupal\Core\Render\Renderer->doRender(Array, false)
#35 /app/web/core/lib/Drupal/Core/Template/TwigExtension.php(501): Drupal\Core\Render\Renderer->render(Array)
#36 /app/web/sites/default/files/php/twig/5e141b4da39b8_one-column-main.html.twig_OFbDO6ypyzpFstSdjn3-CIX7G/_nvSQ3B5LjFax264gfrB7PzQtT9kk3rbXT-ENkgOkGU.php(68): Drupal\Core\Template\TwigExtension->escapeFilter(Object(Drupal\Core\Template\TwigEnvironment), Array, 'html', NULL, true)
#37 /app/vendor/twig/twig/src/Template.php(455): __TwigTemplate_c126786644529a149b7bf9d8765c846d374a436caad83fe045ef81e5b67ee538->doDisplay(Array, Array)
#38 /app/vendor/twig/twig/src/Template.php(422): Twig\Template->displayWithErrorHandling(Array, Array)
#39 /app/vendor/twig/twig/src/Template.php(434): Twig\Template->display(Array)
#40 /app/web/core/themes/engines/twig/twig.engine(64): Twig\Template->render(Array)
#41 /app/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('themes/custom/a...', Array)
#42 /app/web/core/lib/Drupal/Core/Render/Renderer.php(431): Drupal\Core\Theme\ThemeManager->render('one_column_main', Array)
#43 /app/web/core/lib/Drupal/Core/Render/Renderer.php(444): Drupal\Core\Render\Renderer->doRender(Array)
#44 /app/web/core/lib/Drupal/Core/Render/Renderer.php(444): Drupal\Core\Render\Renderer->doRender(Array)
#45 /app/web/core/lib/Drupal/Core/Render/Renderer.php(200): Drupal\Core\Render\Renderer->doRender(Array, false)
#46 /app/web/core/lib/Drupal/Core/Template/TwigExtension.php(501): Drupal\Core\Render\Renderer->render(Array)
#47 /app/web/sites/default/files/php/twig/5e141b4da39b8_node.html.twig_W07fGrLqFR7m8llCVjSq1TBo0/iADMidJBrkm5ylGsoBWFTtYUWUGOL5BvH0jktIHnIY0.php(116): Drupal\Core\Template\TwigExtension->escapeFilter(Object(Drupal\Core\Template\TwigEnvironment), Array, 'html', NULL, true)
#48 /app/vendor/twig/twig/src/Template.php(455): __TwigTemplate_31da0f1e221a5866d1149d357da9ef3a80edf121bcca94306f9714e2587490d4->doDisplay(Array, Array)
#49 /app/vendor/twig/twig/src/Template.php(422): Twig\Template->displayWithErrorHandling(Array, Array)
#50 /app/vendor/twig/twig/src/Template.php(434): Twig\Template->display(Array)
#51 /app/web/core/themes/engines/twig/twig.engine(64): Twig\Template->render(Array)
#52 /app/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('themes/custom/a...', Array)
#53 /app/web/core/lib/Drupal/Core/Render/Renderer.php(431): Drupal\Core\Theme\ThemeManager->render('node', Array)
#54 /app/web/core/lib/Drupal/Core/Render/Renderer.php(200): Drupal\Core\Render\Renderer->doRender(Array, false)
#55 /app/web/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php(226): Drupal\Core\Render\Renderer->render(Array, false)
#56 /app/web/core/lib/Drupal/Core/Render/Renderer.php(573): Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}()
#57 /app/web/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php(227): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#58 /app/web/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php(117): Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object(Symfony\Component\HttpFoundation\Request), Object(Drupal\Core\Routing\CurrentRouteMatch))
#59 /app/web/core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php(90): Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object(Symfony\Component\HttpFoundation\Request), Object(Drupal\Core\Routing\CurrentRouteMatch))
#60 [internal function]: Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object(Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent), 'kernel.view', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#61 /app/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php(111): call_user_func(Array, Object(Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent), 'kernel.view', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#62 /app/vendor/symfony/http-kernel/HttpKernel.php(156): Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch('kernel.view', Object(Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent))
#63 /app/vendor/symfony/http-kernel/HttpKernel.php(68): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#64 /app/web/modules/contrib/simple_oauth/src/HttpMiddleware/BasicAuthSwap.php(67): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#65 /app/web/core/lib/Drupal/Core/StackMiddleware/Session.php(57): Drupal\simple_oauth\HttpMiddleware\BasicAuthSwap->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#66 /app/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(47): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#67 /app/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#68 /app/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#69 /app/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#70 /app/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#71 /app/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#72 /app/web/core/lib/Drupal/Core/DrupalKernel.php(694): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#73 /app/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#74 {main}.

After going throw the logs, there are function calls to file_url with empty argument. I have fixed those internally. And everything back to working.

The submitted patch is no longer needed.

wim leers’s picture

Category: Bug report » Support request
Status: Postponed (maintainer needs more info) » Fixed

Perfect :)

The call trace indeed shows that there is at least one Twig template which might call file_create_url() with NULL as an argument.

Glad we were able to sort that out quickly! And your code is now again slightly more robust too! 🤓🥳

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.

michele bertani’s picture

The patch #2 work as expected

There are downsides to stopping the hook?

renguer0’s picture

#2 working here in Php 7.4.5 in Nginx.

It have some sides effect? Maybe it can be comitted, I think that situation is critical (just broke all the URLs on the site).

Thanks for share this patch.

lpeabody’s picture

Wim, while I understand your position that someone should not be sending a NULL value into file_create_url, since core allows the propagation of a NULL value here, I think its fair to say that modules should expect this case, and thus it is a bug if not properly handled. If you're going to perform an operation on something, then you should always be validating what you need to perform said operation. CDN is clearly not doing that in some cases, as can be seen here.