@@ -7,6 +7,11 @@ var jsReporter = require('jshint-stylish');
77var annotateAdfPlugin = require ( 'ng-annotate-adf-plugin' ) ;
88var pkg = require ( './package.json' ) ;
99
10+ var url = require ( 'url' ) ;
11+ var queryString = require ( 'query-string' ) ;
12+ var request = require ( 'request' ) ;
13+ var FeedParser = require ( 'feedparser' ) ;
14+
1015var annotateOptions = {
1116 plugin : [
1217 annotateAdfPlugin
@@ -63,10 +68,100 @@ gulp.task('watch', function(){
6368} ) ;
6469
6570gulp . task ( 'serve' , [ 'watch' , 'sample' ] , function ( ) {
71+ var feed = function ( req , resp , next ) {
72+ var rawUrl = req . originalUrl ;
73+ if ( rawUrl . indexOf ( "/feed" ) === 0 ) {
74+ var parsedUrl = url . parse ( rawUrl ) ;
75+ var queryParams = queryString . parse ( parsedUrl . query ) ;
76+
77+ var feedUrl = queryParams . url ;
78+
79+ var feedRequest = request ( feedUrl ) ;
80+
81+ var feedparser = new FeedParser ( ) ;
82+ var feedEntries = [ ] ;
83+ var feedDescription = '' ;
84+ var feedTitle = '' ;
85+ var feedLink = '' ;
86+ var feedError ;
87+
88+
89+ // error when server request failed
90+ feedRequest . on ( 'error' , function ( error ) {
91+ resp . writeHead ( 400 , error . toString ( ) ) ;
92+ resp . end ( ) ;
93+ } ) ;
94+
95+ // open a stream after a valid server response
96+ feedRequest . on ( 'response' , function ( ) {
97+ if ( resp . statusCode !== 200 ) {
98+ this . emit ( 'error' , new Error ( 'Bad status code' ) ) ;
99+ }
100+ var stream = this ; // `this` is `req`, which is a stream
101+ stream . pipe ( feedparser ) ;
102+ } ) ;
103+
104+ // error when feed url could not be parsed
105+ feedparser . on ( 'error' , function ( error ) {
106+ feedError = error ;
107+ } ) ;
108+
109+ // read all feed information and save them
110+ feedparser . on ( 'readable' , function ( ) {
111+ var stream = this ; // `this` is `feedparser`, which is a stream
112+ var item ;
113+ while ( item = stream . read ( ) ) {
114+ feedDescription = item . meta . description ;
115+ feedTitle = item . meta . title ;
116+ feedLink = item . meta . link ;
117+ feedEntries . push ( {
118+ title : item . title ,
119+ link : item . link ,
120+ contentSnippet : item . summary ,
121+ author : item . author ,
122+ pubDate : item . date
123+ } ) ;
124+ }
125+ } ) ;
126+
127+ // return feed information - number of Entries configured by request
128+ feedparser . on ( 'end' , function ( ) {
129+ if ( feedError ) {
130+ resp . writeHead ( 400 , error . toString ( ) ) ;
131+ resp . end ( ) ;
132+ } else {
133+ var numberOfEntries = queryParams . num ;
134+ feedEntries = feedEntries . slice ( 0 , numberOfEntries ) ;
135+
136+ var feed = { feed : { entries : feedEntries , title : feedTitle , description : feedDescription , link : feedLink } } ;
137+
138+ var callbackName = queryParams . callback ;
139+ if ( ! callbackName ) {
140+ callbackName = 'jsonp_callback' ;
141+ }
142+
143+ resp . writeHead ( 200 ) ;
144+ resp . write ( '/**/ typeof ' + callbackName + ' === "function" && ' ) ;
145+ resp . write ( callbackName + '(' ) ;
146+ resp . write ( JSON . stringify ( feed ) ) ;
147+ resp . write ( ');' ) ;
148+
149+ resp . end ( ) ;
150+ }
151+ } ) ;
152+
153+ } else {
154+ next ( ) ;
155+ }
156+ } ;
157+
66158 connect . server ( {
67159 root : [ '.tmp/dist' , '.' ] ,
68160 livereload : true ,
69- port : 9002
161+ port : 9002 ,
162+ middleware : function ( connect , opt ) {
163+ return [ feed ] ;
164+ }
70165 } ) ;
71166} ) ;
72167
0 commit comments