@@ -26,6 +26,8 @@ class Parser {
26
26
if ( ! options . timeout ) options . timeout = DEFAULT_TIMEOUT ;
27
27
this . options = options ;
28
28
this . xmlParser = new xml2js . Parser ( this . options . xml2js ) ;
29
+ this . etags = { } ;
30
+ this . lastModified = { } ;
29
31
}
30
32
31
33
parseString ( xml , callback ) {
@@ -73,6 +75,12 @@ class Parser {
73
75
let get = feedUrl . indexOf ( 'https' ) === 0 ? https . get : http . get ;
74
76
let urlParts = url . parse ( feedUrl ) ;
75
77
let headers = Object . assign ( { } , DEFAULT_HEADERS , this . options . headers ) ;
78
+ if ( this . etags [ feedUrl ] ) {
79
+ headers [ 'If-None-Match' ] = this . etags [ feedUrl ] ;
80
+ }
81
+ if ( this . lastModified [ feedUrl ] ) {
82
+ headers [ 'If-Modified-Since' ] = this . lastModified [ feedUrl ] ;
83
+ }
76
84
let timeout = null ;
77
85
let prom = new Promise ( ( resolve , reject ) => {
78
86
const requestOpts = Object . assign ( { headers} , urlParts , this . options . requestOptions ) ;
@@ -84,9 +92,21 @@ class Parser {
84
92
const newLocation = url . resolve ( feedUrl , res . headers [ 'location' ] ) ;
85
93
return this . parseURL ( newLocation , null , redirectCount + 1 ) . then ( resolve , reject ) ;
86
94
}
87
- } else if ( res . statusCode >= 300 ) {
88
- return reject ( new Error ( "Status code " + res . statusCode ) )
95
+ } else if ( res . statusCode === 304 ) {
96
+ return resolve ( null ) ;
97
+ }
98
+ else if ( res . statusCode >= 300 ) {
99
+ return reject ( new Error ( "Status code " + res . statusCode ) ) ;
100
+ }
101
+
102
+ if ( res . headers [ 'etag' ] ) {
103
+ this . etags [ feedUrl ] = res . headers [ 'etag' ] ;
104
+ }
105
+
106
+ if ( res . headers [ 'last-modified' ] ) {
107
+ this . lastModified [ feedUrl ] = res . headers [ 'last-modified' ] ;
89
108
}
109
+
90
110
let encoding = utils . getEncodingFromContentType ( res . headers [ 'content-type' ] ) ;
91
111
res . setEncoding ( encoding ) ;
92
112
res . on ( 'data' , ( chunk ) => {
@@ -226,7 +246,7 @@ class Parser {
226
246
}
227
247
if ( xmlItem . category ) item . categories = xmlItem . category ;
228
248
229
- var mediaContent = xmlItem [ 'media:content' ] [ 0 ] . $ ;
249
+ var mediaContent = xmlItem [ 'media:content' ] ?. [ 0 ] ?. $ ?? null ;
230
250
if ( mediaContent ) item . mediaContent = mediaContent ;
231
251
232
252
this . setISODate ( item ) ;
0 commit comments