Inedo Community Forums Forums
    • Recent
    • Tags
    • Popular
    • Login

    Welcome to the Inedo Forums! Check out the Forums Guide for help getting started.

    If you are experiencing any issues with the forum software, please visit the Contact Form on our website and let us know!

    Assets do not return Last-Modified header (anymore?)

    Scheduled Pinned Locked Moved Support
    11 Posts 4 Posters 27 Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • atrippA Offline
      atripp inedo-engineer
      last edited by

      Hi @pfeigl ,

      The handler for asset file downloading hasn't changed recently.

      The last major changes were in ProGet 6.0, where (among other things), the ability to control client-side caching was added. The change you found (PG-2068) fixed a bug related to UTC/Local time differences in those cache headers.

      In ProGet 2022, we changed the overall platform (.NET Framework -> .NET6). The platform is what's responsible for reading/responding to cached/head requests.

      I'm not sure what the behavior was prior to ProGet 2022... but if you're finding that caching isn't working as expected, I would inspect the cache control headers and see if you can find what the underlying issue is. So far as we can tell/test, it's working as it's supposed to now.

      Cheers,
      Alana

      P 1 Reply Last reply Reply Quote 0
      • J Offline
        joerg.holle_8050
        last edited by

        Hi,

        seconding @pfeigl here:

        we also moved a system of ours from .NET Framework -> .NET6 recently and experienced some changes in header-properties behaviour, in this case Content-Length not being filled anymore by the FileStreamResultExecutor of .net6.0 even though the Stream which is passed into the FileStreamResult has a length defined.
        That field had been filled before with .Net Framework !
        In the end we filled Content-Length in these special cases in our WebApi within our code to ensure identical behaviour for our clients.

        I'm very convinced that ProGet's behaviour regarding Last-Modified was different before ProGet 2022 !

        So, while I understand your statement "The platform is what's responsible for reading/responding to cached/head requests." I would still very much appreciate Inedo working around this behaviour in the code or at least documenting this as breaking change.

        (The former I would prefer obviously ;-) because it would help our build process based on Jenkins as mentioned above.)

        1 Reply Last reply Reply Quote 0
        • P Offline
          pfeigl @atripp
          last edited by

          @atripp Thanks for your answer. I checked the caching options before posting here, but they don't really help in this case. Unfortunately Jenkins does not support the ETag header (and the other caching options). The whole implementation is based around the Last-Modified header.
          See the implementation here for reference:
          https://github.com/jenkinsci/jenkins/blob/5f7a4ee04e7a28bfb97805f2e5829ea0cd3f1c9c/core/src/main/java/hudson/FilePath.java#L980

          The conditional requests RFC (7232) also states

          An origin server SHOULD send Last-Modified for any selected
          representation for which a last modification date can be reasonably
          and consistently determined, ...

          I understand that the platform is responsible for responding to cache request headers. The Last-Modified header however is not something that is a response to a certain given request header but needs to simply be returned. Only the If-Modified-Since header is one, that the server has to actively responde to (and ProGet rightfully does so already).

          Anyways, I guess our question simply is: Is it reasonable for you to (re-)add this header in a future version? It feels like a simple change, as the asset UI already shows this exact field.

          (If it helps anything, we are actually a paying customer, just chose to use the forum instead of a support incident).

          Thanks,
          Philipp

          atrippA 1 Reply Last reply Reply Quote 0
          • atrippA Offline
            atripp inedo-engineer @pfeigl
            last edited by

            Thanks for the additional insight! To clarify... I know very little about how caching works, and I was just reporting what changed recently so we can track down where to look :)

            So just to confirm... you're saying that this used to work in ProGet 6.0, but it's not working after you upgraded to ProGet 2022? If that's the case, then it would very likely be the platform change.

            @pfeigl said in Assets do not return Last-Modified header (anymore?):

            Anyways, I guess our question simply is: Is it reasonable for you to (re-)add this header in a future version? It feels like a simple change, as the asset UI already shows this exact field.

            Yes, we just need to track down exactly what the issue is :)

            Our platform code does seem to look for an If-Modified-Since header, and then sends a 304 if the dates are within a minute of each other. So I guess that works.

            But then this code, when sending response headers, looks pretty suspicious to me.... I wonder if he should be setting the Last-Modified header instead of Date 🤔

            e21a4e2e-7ee9-435b-8ceb-f9fa8d637a1d-image.png

            1 Reply Last reply Reply Quote 0
            • P Offline
              pfeigl
              last edited by pfeigl

              This actually looks a little supsicious, but it's hard to tell without knowing what this.Cache actually is. Is this code kind of "general" to all requests in ProGet or is it specific to Assets? For assets I would have expected for the Last-Modified header to get it's value from the asset itself and not from any cache - but again, I don't know enough about your code base to really comment on this.

              The spec on Date however is pretty clear (https://www.rfc-editor.org/rfc/rfc9110.html#section-6.6.1) that this header is not related to the actual content but more about when the response was generated. This information is very rarely of much interest tbh.

              Last-Modified however is directly related to the date and time when the content of the requested document (file in this case) has changed.

              1 Reply Last reply Reply Quote 0
              • rhessingerR Offline
                rhessinger inedo-engineer
                last edited by

                Hi @pfeigl,

                I did some investigation and it does look to be related to our platform upgrade. We will have a fix ready to be released in ProGet v2022.20.

                Thanks,
                Rich

                Products Engineer, Inedo

                1 Reply Last reply Reply Quote 0
                • P Offline
                  pfeigl
                  last edited by

                  This is great news, thanks for the super good feedback and fast responses! Looking forward to the next release 👍

                  1 Reply Last reply Reply Quote 0
                  • rhessingerR Offline
                    rhessinger inedo-engineer
                    last edited by

                    Hi @pfeigl,

                    Always happy to help! The new release is scheduled to be available on Friday. After upgrading to it, please inform us if the issue you were experiencing has been resolved or not.

                    Thanks,
                    Rich

                    Products Engineer, Inedo

                    1 Reply Last reply Reply Quote 0
                    • P Offline
                      pfeigl
                      last edited by

                      Hi @rhessinger ,

                      we have finally found time to install the update and validate the fix you made.
                      We can confirm that everything is working as expected now.

                      Short remark which we realised while testing: HEAD requests still do not send the Last-Modified header, while GET requests do. This might be by intention, but I thought I'd share this.

                      Thanks for your help with this!

                      1 Reply Last reply Reply Quote 0
                      • rhessingerR Offline
                        rhessinger inedo-engineer
                        last edited by

                        Hi @pfeigl,

                        Thanks for letting us know. It looks like this is related to how HEAD requests were handled. I went and added that header to head requests also. This will be tracked in PG-2300 and will be released in ProGet 2022.25.

                        Thanks,
                        Rich

                        Products Engineer, Inedo

                        1 Reply Last reply Reply Quote 0

                        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                        With your input, this post could be even better 💗

                        Register Login
                        • 1 / 1
                        • First post
                          Last post
                        Inedo Website Home • Support Home • Code of Conduct • Forums Guide • Documentation