2014-07-03 16 views
23

Expressjs invia automaticamente gli etags. Mi piacerebbe sapere come viene generato l'etag .. è basato sul contenuto che viene generato dinamicamente dalla routine get. o è così che posso ridistribuirlo, nemmeno passando attraverso il processo di generazione del contenuto (contenuto dinamico - da DB) e retrocedere etag come lo stesso.come funziona un etag in expressjs

può essere un middleware che inizia semplicemente controllando se è id di sessione valida e restituisce lo stesso etag che il client fornisce o potrebbe basarsi sull'URL + ID di sessione .. in che modo sarà unico. e termina la richiesta lì piuttosto passando attraverso l'intera chiamata db e tutte quelle cose. nel qual caso dovrei sapere che il cliente sta facendo una chiamata 304.

Potrei andare con il tag expires.but quando la sessione è finita. se qualcuno sta aprendo l'url non dovrebbe permetterlo. quindi penso che l'etag dovrebbe essere basato anche sull'ID di sessione. come funziona se modificato può funzionare in questo scenario di contenuto dinamico. può essere usato

+0

Potete per favore chiarire la seconda e terza paragrafi? Sarebbe bene avere maggiori dettagli sul tuo particolare problema. – stellarchariot

risposta

23

Al momento della stesura (8 luglio 2014), gli ETags deboli vengono generati utilizzando CRC32 (source) e gli ETags forti vengono generati utilizzando MD5 (source).

Based on what one of the contributors to Express says, è possibile specificare se si desidera utilizzare le ETags forti o deboli da:

app.enable('etag') // use strong etags 
app.set('etag', 'strong') // same 
app.set('etag', 'weak') // weak etags 

Sembra che è anche possibile specificare la propria funzione personalizzata per fare le ETags in questo modo:

app.set('etag', function(body, encoding){ /* return valid etag */ }); 

Anche il pacchetto NPM fresh è da considerare, poiché è utilizzato in Express per il controllo della freschezza (source1, source2).

Per quanto riguarda la tua applicazione, ricorda che puoi sostituire qualsiasi intestazione di risposta, ad es. res.set('etag', 'my-awesome-etag-value') prima di richiamare res.send() (o funzione simile). Ulteriori discussioni (compresi i vantaggi e gli svantaggi) si possono trovare qui: https://github.com/visionmedia/express/issues/2129#issue-34053148

+8

Mi piacerebbe precisare che secondo l'espresso 4.X [docs] (http://expressjs.com/api.html#app.set), il tipo etag predefinito è 'weak' quando si abilitano gli etags. Aggiornamento – bakavic

+2

: La generazione ETag viene eseguita dal modulo [jshttp/etag] (https://github.com/jshttp/etag). La versione 1.7 (2015-06-08) utilizza sempre MD5 anziché CRC32 poiché CRC32 è soggetto a collisione. La prossima versione utilizzerà sempre SHA1 anziché MD5 perché MD5 non è conforme a FIPS. Infine, l'unica cosa "debole" è impostare il prefisso "W /" su ETag. Mentre l'impostazione predefinita è "W /", è tecnicamente un forte ETag perché l'hash è calcolato sui byte del corpo rispetto al suo contenuto semantico. Se sei in grado di implementare calcoli ETag deboli per la tua app, si tratta di un potenziale potenziamento del perf potenziale. – ZachB

3

Dal 4.x espresso il tipo predefinito ETAG è debole

https://expressjs.com/en/api.html#etag.options.table

app.enable('etag') // use weak etags 
app.set('etag', 'weak') // use weak etags also 
app.set('etag', 'strong') // use strong etags 

// custom etag generation 
app.set('etag', function (body, encoding) { 
    return generateHash(body, encoding); // consider the function is defined 
});