@@ -164,7 +164,7 @@ var decorateItunes = function decorateItunes(json, channel) {
164
164
}
165
165
json . feed . itunes . owner = owner ;
166
166
}
167
-
167
+
168
168
PODCAST_TOP_FIELDS . forEach ( function ( f ) {
169
169
if ( channel [ 'itunes:' + f ] ) json . feed . itunes [ f ] = channel [ 'itunes:' + f ] [ 0 ] ;
170
170
} ) ;
@@ -197,7 +197,14 @@ Parser.parseString = function(xml, callback) {
197
197
} ) ;
198
198
}
199
199
200
- Parser . parseURL = function ( feedUrl , callback ) {
200
+ Parser . parseURL = function ( feedUrl , settings , callback ) {
201
+ if ( ! callback ) {
202
+ callback = settings ;
203
+ settings = { } ;
204
+ }
205
+ settings . __redirectCount = settings . __redirectCount || 0 ;
206
+ if ( settings . maxRedirects === undefined ) settings . maxRedirects = 1 ;
207
+
201
208
var xml = '' ;
202
209
var get = feedUrl . indexOf ( 'https' ) === 0 ? HTTPS . get : HTTP . get ;
203
210
var parsedUrl = url . parse ( feedUrl ) ;
@@ -207,7 +214,12 @@ Parser.parseURL = function(feedUrl, callback) {
207
214
path : parsedUrl . path ,
208
215
headers : { 'User-Agent' : 'rss-parser' }
209
216
} , function ( res ) {
210
- if ( res . statusCode >= 300 ) return callback ( new Error ( "Status code " + res . statusCode ) )
217
+ if ( res . statusCode >= 300 && res . statusCode < 400 && res . headers [ 'location' ] ) {
218
+ if ( settings . maxRedirects === 0 ) return callback ( new Error ( "Status code " + res . statusCode ) ) ;
219
+ if ( settings . __redirectCount === settings . maxRedirects ) return callback ( new Error ( "Too many redirects" ) ) ;
220
+ settings . __redirectCount ++ ;
221
+ return Parser . parseURL ( res . headers [ 'location' ] , settings , callback ) ;
222
+ }
211
223
res . setEncoding ( 'utf8' ) ;
212
224
res . on ( 'data' , function ( chunk ) {
213
225
xml += chunk ;
0 commit comments