Service worker bloque génération PDF

WRInaute accro
Bonjour,

Tout est dit dans le titre, je m'explique...
Voilà, je développe sur laravel 5.5 et j'utilise "dompdf". J'ai développé une pwa.
Le principe est standard, le service worker met en cache les pages de mon site à l'exception de certains services dont la partie PDF.
La génération de mes pdf se font à la volée. L'utilisateur clique sur un bouton et je lui génère son pdf. Pour cela j'utilise donc "dompdf".
Les urls générées sont du style:
Code:
monsite.com/interface/facture/QU5NZ4KGZD7HYURN27BDPS3KH
L'extrait du script du service worker permettant de mettre en cache:
Code:
function addToCache(request, response) {
                var copy = response.clone();
                caches.open(version).then(function (cache) {
                    if(!request.url.endsWith('connexion') &&
                            !request.url.match(/analytics/ig) &&
                            !request.url.match(/pinterest/ig) &&
                            !request.url.match(/inscription/ig) &&
                            !request.url.match(/facture/ig) &&
                            !request.url.match(/facebook/ig)){
                        cache.put(request, copy);
                    }
                });
            }
C'est bien le SW qui bloque car en le désactivant, mon pdf est bien généré sans aucun soucis.
Que je supprime ou non "!request.url.match(/facture/ig)" dans ma fonction SW, le résultat est le même... ça ne fonctionne pas. :(
Par contre autre chose... si je renseigne directement mon url (pdf) en navigation privée ou depuis un autre navigateur, mon pdf est généré sans prob. J'en conclus que c'est bien le SW qui pose problème.
Mais où ??
Que je filtre ou non l'ajout du pdf en cache, ça ne fonctionne pas.

Une idée ?
Merci
 
Dernière édition:
WRInaute accro
Pas sûr d'avoir compris, mais dans l'outil de développement de Chrome tu px voir les fichiers en cache du SW et voir si le PDF s'y est mis ?
Ou dans l'onglet réseau tu dois voir s'il y a eu un request vers le PDF via le SW et surtout son entête HTTP et sa réponse.

Edit: Laravel a un excellent système de logging, donc dans ton controller tu px très bien logger ce qu'il se passe.
 
Dernière édition:
WRInaute accro
Merci de ta réponse @spout
Oui biensur, j'ai regardé ce qu'il se passait sur chrome, je t'ai mis une capture:


Voilà le résultat actuel via le SW actif
 
WRInaute accro
Donc le fichier PDF est qd même mis en cache malgré la condition !request.url.match(/facture/ig), mais on voit que sa taille fait 0 (c'est bizarre l'écran gris).
Tente de faire un console.log(request.url) pour essayer de deviner pourquoi le request.url avec facture passe la condition.
 
WRInaute accro
Excuse-moi, j'ai dû mal m'exprimer.
Dans l'exemple que je t'ai mis en capture, le SW ne filtre pas l'ajout de l'url de la facture. Donc il a un comportement normal. J'ai retiré le filtre dans le SW. L'url est bien ajouté en cache.
C'est uniquement le visuel du pdf. J'ai bien un status 200 mais pas de données générées :(
 
WRInaute accro
Donc je pense que ça vient de Laravel et pas du SW.
Je ne pourrais pas t'aider plus sans voir ce qu'il se passe en live.
 
WRInaute accro
Je ne sais pas si ça joue mais j'ai remarqué ça.
Via mon site avec le SW, mon pdf est en protocole 1.1:

Accès direct au pdf en navigation privé protocole h2

Je n'ai pas non plus d'erreurs de log en mode "debug" pfffff quelle merde !
 
WRInaute accro
Dans le code que t'as montré, il y a une condition pour ne pas mettre les factures dans le SW, et dans ces screenshots on voit que le la facture est "from ServiceWorker"... donc vraiment sans voir en live je /surrender, good luck ;)
 
WRInaute accro
ok merci @spout pour le temps que tu m'as accordé ;)
T'es un chef.
oui, j'ai remis le filtre sur la partie facture dans le sw et au visu dans le cache chrome, les urls facture ne sont pas présentes donc de ce côté, c'est un comportement normal.
 
WRInaute accro
Bon, j'ai trouvé la cause mais pas trouvé la solution en dev donc pour faire au plus simple, j'ai contourné le problème ;)
Si ça peut t'aider @spout
Dans les captures que j'ai mis plus haut, j'ai eu un début de pistes...
Comme mon serveur est configuré en http/2 et bien, il sert du http/2 logique. Mais lorsque le SW s'active pour le pdf, il va chercher dans le cache donc passe en http/1 et là... conflit de protocle !
Il ne peut pas matcher !
Alors pourquoi le SW délivre du http1 uniquement pour le pdf pfffffffff j'en sais rien et m'en fous ! J'ai assez perdu de temps avec ça.
Alors j'ai trouvé une alternative. Au lieu d'ouvrir mon pdf en target="_blank", j'ai mis un lien html5.
Code:
<a href="" download>mon PDF</a>

Voilà, c'est une bidouille mais ça marche ;)
 
Discussions similaires
Haut