[DigitalPoint] App for Cloudflare®

[DigitalPoint] App for Cloudflare® 1.8.2

No permission to download
Yeah, it's easier to serve them outside the "assets" directory structure and keep them out of the bucket. (Just tested it that way, and the errors are gone.)

I did try configuring CORS with my server URL but still got the errors. With the feature in beta, it might not be working at 100% just yet.
 
I haven't tried it myself, not sure how it could really mess it up. It's literally just slapping a single header on the request. You can also do it with a Transform rule on the response (just add the header you want). 🤷🏻‍♂️ If it's not working, I'd look at the HTTP header on the request for the font and see if the header is malformed or missing or something.

CORS is fairly straightforward, so shouldn't be too hard to pinpoint.
 
I'm three hours ahead of ya. I'll have to look at this in the morning after sleep, caffeine, etc., when things make a little more sense. 😁
 
Some errors to report ...

Code:
ErrorException: Cloudflare: Invalid response, code: 499 / src/XF/Error.php:77
Generated by: RS_Menace Feb 24, 2023 at 15:35
Stack trace
#0 src/XF.php(219): XF\Error->logError('Cloudflare: Inv...', false)
#1 src/addons/DigitalPoint/Cloudflare/Traits/XF.php(144): XF::logError('Cloudflare: Inv...')
#2 src/addons/DigitalPoint/Cloudflare/Api/Cloudflare.php(491): DigitalPoint\Cloudflare\Api\Cloudflare->logError('Cloudflare: Inv...')
#3 src/addons/DigitalPoint/Cloudflare/Api/Advanced.php(389): DigitalPoint\Cloudflare\Api\CloudflareAbstract->makeRequest('HEAD', 'attachments/389...', Array, true, 'netrider-intern...')
#4 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(195): DigitalPoint\Cloudflare\Api\Advanced->headR2Object('netrider-intern...', 'attachments/389...')
#5 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(83): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->getMetadata('attachments/389...')
#6 src/vendor/league/flysystem/src/Filesystem.php(57): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->has('attachments/389...')
#7 [internal function]: League\Flysystem\Filesystem->has('attachments/389...', Array)
#8 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('League\\Flysyste...', Array)
#9 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('has', Array)
#10 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(128): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('has', Array)
#11 src/vendor/league/flysystem/src/MountManager.php(313): League\Flysystem\EventableFilesystem\EventableFilesystem->has('attachments/389...')
#12 src/XF/Entity/AttachmentData.php(228): League\Flysystem\MountManager->has('attachments/389...')
#13 src/XF/ControllerPlugin/Attachment.php(9): XF\Entity\AttachmentData->isDataAvailable()
#14 src/XF/Pub/Controller/Attachment.php(45): XF\ControllerPlugin\Attachment->displayAttachment(Object(XF\Entity\Attachment))
#15 src/XF/Mvc/Dispatcher.php(352): XF\Pub\Controller\Attachment->actionIndex(Object(XF\Mvc\ParameterBag))
#16 src/XF/Mvc/Dispatcher.php(259): XF\Mvc\Dispatcher->dispatchClass('XF:Attachment', 'Index', Object(XF\Mvc\RouteMatch), Object(XF\Pub\Controller\Attachment), NULL)
#17 src/XF/Mvc/Dispatcher.php(115): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(XF\Pub\Controller\Attachment), NULL)
#18 src/XF/Mvc/Dispatcher.php(57): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#19 src/XF/App.php(2483): XF\Mvc\Dispatcher->run()
#20 src/XF.php(524): XF\App->run()
#21 index.php(20): XF::runApp('XF\\Pub\\App')
#22 {main}
Request state
array(4) {
  ["url"] => string(33) "/attachments/vincents-jpg.392705/"
  ["referrer"] => string(64) "/threads/who-remembers-when.280853/page-8"
  ["_GET"] => array(1) {
    ["/attachments/vincents-jpg_392705/"] => string(0) ""
  }
  ["_POST"] => array(0) {
  }
}

Code:
ErrorException: Cloudflare: String could not be parsed as XML / null src/XF/Error.php:77
Generated by: OldDave Feb 24, 2023 at 15:35
Stack trace
#0 src/XF.php(219): XF\Error->logError('Cloudflare: Str...', false)
#1 src/addons/DigitalPoint/Cloudflare/Traits/XF.php(144): XF::logError('Cloudflare: Str...')
#2 src/addons/DigitalPoint/Cloudflare/Api/Cloudflare.php(530): DigitalPoint\Cloudflare\Api\Cloudflare->logError('Cloudflare: Str...')
#3 src/addons/DigitalPoint/Cloudflare/Api/Advanced.php(389): DigitalPoint\Cloudflare\Api\CloudflareAbstract->makeRequest('HEAD', 'attachments/448...', Array, true, 'netrider-intern...')
#4 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(195): DigitalPoint\Cloudflare\Api\Advanced->headR2Object('netrider-intern...', 'attachments/448...')
#5 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(83): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->getMetadata('attachments/448...')
#6 src/vendor/league/flysystem/src/Filesystem.php(57): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->has('attachments/448...')
#7 [internal function]: League\Flysystem\Filesystem->has('attachments/448...', Array)
#8 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('League\\Flysyste...', Array)
#9 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('has', Array)
#10 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(128): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('has', Array)
#11 src/vendor/league/flysystem/src/MountManager.php(313): League\Flysystem\EventableFilesystem\EventableFilesystem->has('attachments/448...')
#12 src/XF/Entity/AttachmentData.php(228): League\Flysystem\MountManager->has('attachments/448...')
#13 src/XF/ControllerPlugin/Attachment.php(9): XF\Entity\AttachmentData->isDataAvailable()
#14 src/XF/Pub/Controller/Attachment.php(45): XF\ControllerPlugin\Attachment->displayAttachment(Object(XF\Entity\Attachment))
#15 src/XF/Mvc/Dispatcher.php(352): XF\Pub\Controller\Attachment->actionIndex(Object(XF\Mvc\ParameterBag))
#16 src/XF/Mvc/Dispatcher.php(259): XF\Mvc\Dispatcher->dispatchClass('XF:Attachment', 'Index', Object(XF\Mvc\RouteMatch), Object(XF\Pub\Controller\Attachment), NULL)
#17 src/XF/Mvc/Dispatcher.php(115): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(XF\Pub\Controller\Attachment), NULL)
#18 src/XF/Mvc/Dispatcher.php(57): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#19 src/XF/App.php(2483): XF\Mvc\Dispatcher->run()
#20 src/XF.php(524): XF\App->run()
#21 index.php(20): XF::runApp('XF\\Pub\\App')
#22 {main}
Request state
array(4) {
  ["url"] => string(38) "/attachments/1677212836580-png.451338/"
  ["referrer"] => string(75) "/threads/the-religious-ranting-thread.282693/page-28"
  ["_GET"] => array(1) {
    ["/attachments/1677212836580-png_451338/"] => string(0) ""
  }
  ["_POST"] => array(0) {
  }
}

Code:
Error: Call to a member function getBody() on array src/addons/DigitalPoint/Cloudflare/Traits/XF.php:132
Generated by: OldDave Feb 24, 2023 at 15:35
Stack trace
#0 src/addons/DigitalPoint/Cloudflare/Api/Cloudflare.php(538): DigitalPoint\Cloudflare\Api\Cloudflare->parseResponse(Array)
#1 src/addons/DigitalPoint/Cloudflare/Api/Advanced.php(389): DigitalPoint\Cloudflare\Api\CloudflareAbstract->makeRequest('HEAD', 'attachments/448...', Array, true, 'netrider-intern...')
#2 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(195): DigitalPoint\Cloudflare\Api\Advanced->headR2Object('netrider-intern...', 'attachments/448...')
#3 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(83): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->getMetadata('attachments/448...')
#4 src/vendor/league/flysystem/src/Filesystem.php(57): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->has('attachments/448...')
#5 [internal function]: League\Flysystem\Filesystem->has('attachments/448...', Array)
#6 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('League\\Flysyste...', Array)
#7 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('has', Array)
#8 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(128): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('has', Array)
#9 src/vendor/league/flysystem/src/MountManager.php(313): League\Flysystem\EventableFilesystem\EventableFilesystem->has('attachments/448...')
#10 src/XF/Entity/AttachmentData.php(228): League\Flysystem\MountManager->has('attachments/448...')
#11 src/XF/ControllerPlugin/Attachment.php(9): XF\Entity\AttachmentData->isDataAvailable()
#12 src/XF/Pub/Controller/Attachment.php(45): XF\ControllerPlugin\Attachment->displayAttachment(Object(XF\Entity\Attachment))
#13 src/XF/Mvc/Dispatcher.php(352): XF\Pub\Controller\Attachment->actionIndex(Object(XF\Mvc\ParameterBag))
#14 src/XF/Mvc/Dispatcher.php(259): XF\Mvc\Dispatcher->dispatchClass('XF:Attachment', 'Index', Object(XF\Mvc\RouteMatch), Object(XF\Pub\Controller\Attachment), NULL)
#15 src/XF/Mvc/Dispatcher.php(115): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(XF\Pub\Controller\Attachment), NULL)
#16 src/XF/Mvc/Dispatcher.php(57): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#17 src/XF/App.php(2483): XF\Mvc\Dispatcher->run()
#18 src/XF.php(524): XF\App->run()
#19 index.php(20): XF::runApp('XF\\Pub\\App')
#20 {main}
Request state
array(4) {
  ["url"] => string(38) "/attachments/1677212836580-png.451338/"
  ["referrer"] => string(75) "/threads/the-religious-ranting-thread.282693/page-28"
  ["_GET"] => array(1) {
    ["/attachments/1677212836580-png_451338/"] => string(0) ""
  }
  ["_POST"] => array(0) {
  }
}
 
HTTP 499 is a networking issue (a disconnect from the client specifically). Most likely a network issue with the server that (hopefully) fixed itself?
 
New to Cloudflare as of about 48 hours ago. I spent the majority of the last two days familiarizing myself with Cloudflare, this add-on and actually reading through this entire thread along with a few rabbit holes to other linked threads on the same or similar topics.

Just wanted to say thank you for what has developed into a very thorough and user friendly add-on/app. This will likely help rookie admins to pros for years to come. Likely helping the rookies in many ways they may not initially fully understand but will still be helped by.

As I said I just recently went through this entire thread and have a few comments, questions and a request - while it is still fresh in my mind. This may also be a good starting point for people just coming into this thread.
------------------------------------------------------------------------------------------

Comments:
1) Guest page caching still has some issue. This will also likely be made worse by upcoming changes in XF 2.3 related to GDPR consent. Much of it depending on in XF sticks with current way of hiding non-consented content or moves to JavaScript.

2) R2 storage works with /data (public access) and /internal-data/ (private). Use 2 separate buckets when setting it up to keep public and private separate and to avoid any path conflict issues. R2 storage also works with XFMG (if installed) but it still seems the best setup is to just use the same 2 buckets for storage as if you didn't have XFMG installed. Most issues come with human error in initial setup and using the same buckets eliminates some of the complexity and the only benefit to having additional buckets for XFMG is a few more statistics specific to XFMG that you think you may want but really the last thing you need as an admin is more statistics in your life. Before you even think about removing files from local storage after R2 is setup and running - MAKE A BACKUP of the local directories/files.

3) Ignore transient 500/499 errors. Cloudflare due to it's complexity will have occasional server/network errors for one reason or another. As long as the errors clear up in a short time and don't come back all is good. Find any current or recent Cloudflare system issues here: Cloudflare Status.

4) The majority of errors users of this add-on/app now see are related to missing or incorrect API token permissions. Double check, no triple check them before reporting any issues. There are currently 15 required permissions to set, they are written out and detailed in Setup - External Service Providers - Cloudflare authentication.

Question:
1) How to best move files to R2 storage? Seems like a standard cmd line transfer will work for most, and rclone or similar recommended for large transfers 10GB+. Could someone do a step-by-step directions. Directions to include sample command line instructions for getting the files into R2, turning on the app settings, verifying files are being served through R2, and then eventually backing up and removing local storage that is no longer needed. This may also be a qood FAQ to include inside the app.

Request:
1) Easy Config is a great idea for those who don't understand all the intricacies of the options but still want to get the most out of Cloudflare without first understanding it thoroughly. I didn't use it, but I find myself wondering every time I do look at my settings "What is different in my current settings than what would be set if I clicked this Easy config button?". It would be nice if there was some sort of indication next to each option that indicated somehow if the current setting was the same as "Easy config" button would set or is different. Maybe another column under the "Easy config" button showing which options would change and to what.

Thanks again for the great add-on/app. Looking forward to it's continued development and support.
 
Glad you made it to Cloudflare... it's a pretty incredible service (even at the free tier). It's so good in fact, I'd even argue that if people aren't using it these days, they are maybe doing it wrong. ;)

Question:
1) How to best move files to R2 storage? Seems like a standard cmd line transfer will work for most, and rclone or similar recommended for large transfers 10GB+. Could someone do a step-by-step directions. Directions to include sample command line instructions for getting the files into R2, turning on the app settings, verifying files are being served through R2, and then eventually backing up and removing local storage that is no longer needed. This may also be a qood FAQ to include inside the app.
I was able to move about 500MB of files per minute with the CLI option I made that comes with the add-on. I didn't try to tune it further because it seemed decent for something I slapped together. The CLI thing I made will never be as fast as rclone (since it was purpose built just for that). The biggest issue with the CLI one I made is that it has to work within the bounds/limitations of XenForo (and more specifically the Flysystem filesystem adapter it uses). The biggest issue is that there's no "paging" when getting a list of files, so you have to get all files in one go (which isn't particularly great for PHP memory when you have to store the info about every possible file). Not great when you have a ton of files.

Hopefully someone else can chime in about rclone (I've not used it firsthand, but I know it works really well).

When I moved 1.1GB (3,228 attachments), I used 32 concurrent processes to get that speed:

Screenshot 2023-01-05 at 8.28.48 AM.png

Request:
1) Easy Config is a great idea for those who don't understand all the intricacies of the options but still want to get the most out of Cloudflare without first understanding it thoroughly. I didn't use it, but I find myself wondering every time I do look at my settings "What is different in my current settings than what would be set if I clicked this Easy config button?". It would be nice if there was some sort of indication next to each option that indicated somehow if the current setting was the same as "Easy config" button would set or is different. Maybe another column under the "Easy config" button showing which options would change and to what.

Thanks again for the great add-on/app. Looking forward to it's continued development and support.
Ya, I've been thinking about that a little. The problem is how do you present what is a lot of data (what it's about to change, what it thinks should be changed)... but also keeping it "Easy"?

You can look in the Repository file (specifically the setEasyMode() method), you can see exactly what "easy mode" sets.
 
How to best move files to R2 storage? Seems like a standard cmd line transfer will work for most, and rclone or similar recommended for large transfers 10GB+. Could someone do a step-by-step directions. Directions to include sample command line instructions for getting the files into R2, turning on the app settings,
Rclone command line I used, whilst being within the internal_data/attachments/ directory;
rclone sync -P --transfers=20 --fast-list ./ CloudflareR2:<my R2 internal-data-attachments bucket name>/attachments/

It took a bit over 2 hours to sync 66Gb across just over 422,500 files.
 
Is it normal that it adds "//" to every file uploaded to the system?

Even on External service providers, it shows the R2 data domain as //data.domain.com (no https or anything)

And for
Icon URL (192x192) in PWA settings for example also shows //data.domian.com/assets/logo/apple-touch-icon.png


I'm asking since when I try to scrape my domain with

I get:
Warnings That Should Be Fixed
Invalid URL Provided
og:image URL, //data.domain.com/assets/logo/apple-touch-big-icon.png was not a valid URL.

But it works if "//" is removed and I can access this image through the buckets
 
It doesn't add // to any file uploaded. If you are seeing that, something is wrong/something else is going on. For external service providers, it does default the URL to //data.domain.com. Not having the protocol is a valid URL, and tells the browser to use whatever protocol the site is using (so the request will be for https if the site uses https and it will be http if the site is using http. It's the difference between a relative and absolute URL. You can change the external data URL to be an absolute URL if you want without any issues.

Removing // shouldn't fix anything because then you aren't even going to the data.domain.com server, instead you would be going to data.domain.com directory on your site.
 
Outside of this Cloudflare app, currently the only way to cache a text/html/php page within XenForo is to turn on Guest page caching through config.php edits. I assume the option for Cloudflare guest page caching somehow bypasses the need for config.php edits but runs in a similar fashion overriding XenForo's standard cache header? Does Cloudflare have a standard cache lifetime or are you hardcoding some cache options in the background?

XenForo's Standard cache control header:
Code:
cache-control: private, no-cache, max-age=0

It seems that XenForo's standard page caching header severely limits caching of pages that could be cached without causing problems (login, register, terms, privacy, help, etc.) basically any static content page. I was trying to do some testing but it appears even XenForo.com does not have guest page caching turned on, and your site iolabs.io seems to now have it turned off now (it appeared on earlier).

Many XenForo pages, and numerous add-ons could benefit from page caching but they would need to override XenForo's standard cache control header. Is there an easy way to do this? is it possibly to override per page for XenForo static content pages?

Then when the cache control header is overwritten for these additional pages and/or add-ons then Cloudflare will just automatically begin caching them, as they would go for guest pages with guest page caching turned on.
 
It’s enabled on iolabs.io (wasn’t turned off any time recently).

I can’t answer any questions about XenForo’s standard headers or their built-in guest page caching because I don’t use it (and never did or tried to).

As far as how long to cache guest pages with this addon, you pick how long you want to cache when you enable that function.
 
It’s enabled on iolabs.io (wasn’t turned off any time recently).

Hmmm, not sure what I was running into then. Seemed fine earlier this afternoon when I first was testing caching at iolabs, then when I came back later I wasn't able to get an cf-cache-status: expired or hit. Just tried again now and it still wasn't working till I logged in and then logged out again. Otherwise just going to a page while logged out (as guest) initially I was still getting cf-cache-status: DYNAMIC. Maybe a cookie not updating correctly?
 
The feature errs on the side of caution and won’t cache if the user (even as a guest) has triggered an action that causes a full XenForo session to be spun up on the backend. Things like registering and canceling or logging in and canceling can cause that when it starts to track things like attempted logins in the user’s session. Clear your cookies for the site to reset back to a generic guest user.
 
So I hate that I have to post this, but I need to me more clear on what I can/can't do as far as support. I'm fine doing support in this thread (which is the support thread for this add-on), for things that are directly related to this add-on. The problem I've been having lately is that I'm getting a ton of people contacting me privately (on this site, on my site, via Telegram, and even on Cloudflare's own Discord instance) because they use this add-on and they want help with something related to Cloudflare (but not related to this add-on). Individually, it's not a big deal... however if you spend 10 minutes a day helping 50 different people with random (individually small) things, the math works out to more than 8 hours a day doing that.

Cloudflare has a support community here: https://community.cloudflare.com/

They also have a great Discord instance (more intended for developers than end-users though): https://discord.com/invite/cloudflaredev

Again... if there's something related to this add-on, no problem. I can do my best to help people here.
 
R2 Storage Server Error Log ...

Code:
Server error log
DigitalPoint\Cloudflare\Api\Exception\Server: Server error: `GET https://<redacted>.r2.cloudflarestorage.com/<redacted (internal_data)>/attachments/301/301781-93536eb1a337b1e46f5fc6dc71f411d6.data` resulted in a `500 Internal Server Error` response: <?xml version="1.0" encoding="UTF-8"?><Error><Code>InternalError</Code><Message>We encountered an internal error. Please (truncated...) src/addons/DigitalPoint/Cloudflare/Traits/XF.php:82
Generated by: <username> Mar 7, 2023 at 22:00
Stack trace
#0 src/addons/DigitalPoint/Cloudflare/Api/Cloudflare.php(462): DigitalPoint\Cloudflare\Api\Cloudflare->request('GET', 'https://<redacted>', Array)
#1 src/addons/DigitalPoint/Cloudflare/Api/Advanced.php(381): DigitalPoint\Cloudflare\Api\CloudflareAbstract->makeRequest('GET', 'attachments/301...', Array, 0, 'netrider-intern...')
#2 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(128): DigitalPoint\Cloudflare\Api\Advanced->getR2Object('<redacted bucket>', 'attachments/301...')
#3 src/addons/DigitalPoint/Cloudflare/League/Flysystem/Adapter/R2.php(108): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->read('attachments/301...')
#4 src/vendor/league/flysystem/src/Filesystem.php(196): DigitalPoint\Cloudflare\League\Flysystem\Adapter\R2->readStream('attachments/301...')
#5 [internal function]: League\Flysystem\Filesystem->readStream('attachments/301...', Array)
#6 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(431): call_user_func_array('League\\Flysyste...', Array)
#7 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(395): League\Flysystem\EventableFilesystem\EventableFilesystem->callFilesystemMethod('readStream', Array)
#8 src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php(154): League\Flysystem\EventableFilesystem\EventableFilesystem->delegateMethodCall('readStream', Array)
#9 src/vendor/league/flysystem/src/MountManager.php(345): League\Flysystem\EventableFilesystem\EventableFilesystem->readStream('attachments/301...')
#10 src/XF/Pub/View/Attachment/View.php(25): League\Flysystem\MountManager->readStream('attachments/301...')
#11 src/XF/Mvc/Renderer/AbstractRenderer.php(91): XF\Pub\View\Attachment\View->renderRaw()
#12 src/XF/Mvc/Renderer/Raw.php(39): XF\Mvc\Renderer\AbstractRenderer->renderViewObject('XF:Attachment\\V...', '', Array)
#13 src/XF/Mvc/Dispatcher.php(460): XF\Mvc\Renderer\Raw->renderView('XF:Attachment\\V...', '', Array)
#14 src/XF/Mvc/Dispatcher.php(442): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Raw), Object(XF\Mvc\Reply\View))
#15 src/XF/Mvc/Dispatcher.php(402): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Raw), Object(XF\Mvc\Reply\View))
#16 src/XF/Mvc/Dispatcher.php(60): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'raw')
#17 src/XF/App.php(2483): XF\Mvc\Dispatcher->run()
#18 src/XF.php(524): XF\App->run()
#19 index.php(20): XF::runApp('XF\\Pub\\App')
#20 {main}
Request state
array(4) {
  ["url"] => string(68) "/attachments/screenshot_20200228-153831_samsung-internet-jpg.304495/"
  ["referrer"] => string(104) "https://<redacted>/threads/multistrada-appreciation-association-for-ducatisti-m-a-a-d.269815/page-5"
  ["_GET"] => array(1) {
    ["/attachments/screenshot_20200228-153831_samsung-internet-jpg_304495/"] => string(0) ""
  }
  ["_POST"] => array(0) {
  }
}

Because of the truncated 500 Internal Server Error response, I cannot see what the issue might/could be. If indeed it's anything I can diagnose/action.

These are repeating several times in the last few mins per min, for the last 15mins, for different pages and resources/attachments. I suspect it's a transient error on CF's side? Them not delivering R2 content to clients (XF server).
 
Last edited:
Ya, anything that is a 5xx error is going to be a server-side error (Cloudflare’s side) with nothing we can do on our side other than retry. The add-on already does one retry for any 5xx error, and usually that retry will be enough to get it through. An error making it to the server error means the first attempt failed and the retry also failed.
 
Top Bottom