1313
1414module Html2rss
1515 module Web
16+ DEFAULT_HEADERS = {
17+ 'X-Content-Type-Options' => 'nosniff' ,
18+ 'X-XSS-Protection' => '1; mode=block' ,
19+ 'X-Frame-Options' => 'SAMEORIGIN' ,
20+ 'X-Permitted-Cross-Domain-Policies' => 'none' ,
21+ 'Referrer-Policy' => 'strict-origin-when-cross-origin' ,
22+ 'Permissions-Policy' => 'geolocation=(), microphone=(), camera=()' ,
23+ 'Strict-Transport-Security' => 'max-age=31536000; includeSubDomains; preload' ,
24+ 'Cross-Origin-Embedder-Policy' => 'require-corp' ,
25+ 'Cross-Origin-Opener-Policy' => 'same-origin' ,
26+ 'Cross-Origin-Resource-Policy' => 'same-origin' ,
27+ 'X-DNS-Prefetch-Control' => 'off' ,
28+ 'X-Download-Options' => 'noopen'
29+ } . freeze
30+
1631 ##
1732 # Roda app serving RSS feeds via html2rss
1833 class App < Roda
@@ -72,20 +87,7 @@ def development? = self.class.development?
7287 end
7388 # rubocop:enable Metrics/BlockLength
7489
75- plugin :default_headers , {
76- 'X-Content-Type-Options' => 'nosniff' ,
77- 'X-XSS-Protection' => '1; mode=block' ,
78- 'X-Frame-Options' => 'SAMEORIGIN' ,
79- 'X-Permitted-Cross-Domain-Policies' => 'none' ,
80- 'Referrer-Policy' => 'strict-origin-when-cross-origin' ,
81- 'Permissions-Policy' => 'geolocation=(), microphone=(), camera=()' ,
82- 'Strict-Transport-Security' => 'max-age=31536000; includeSubDomains; preload' ,
83- 'Cross-Origin-Embedder-Policy' => 'require-corp' ,
84- 'Cross-Origin-Opener-Policy' => 'same-origin' ,
85- 'Cross-Origin-Resource-Policy' => 'same-origin' ,
86- 'X-DNS-Prefetch-Control' => 'off' ,
87- 'X-Download-Options' => 'noopen'
88- }
90+ plugin :default_headers , DEFAULT_HEADERS
8991
9092 plugin :json_parser
9193 plugin :static ,
@@ -104,9 +106,20 @@ def development? = self.class.development?
104106
105107 route do |r |
106108 r . public
109+ r . root do
110+ if development?
111+ render_development_api_landing ( r )
112+ else
113+ render_index_page ( r )
114+ end
115+ end
107116
108117 Routes ::ApiV1 . call ( r ) ||
109- Routes ::FeedPages . call ( r , index_renderer : -> ( router_ctx ) { render_index_page ( router_ctx ) } )
118+ Routes ::FeedPages . call (
119+ r ,
120+ index_renderer : -> ( router_ctx ) { render_index_page ( router_ctx ) } ,
121+ serve_spa : !development?
122+ )
110123 end
111124
112125 private
@@ -115,6 +128,11 @@ def render_index_page(router)
115128 router . response [ 'Content-Type' ] = 'text/html'
116129 File . exist? ( FRONTEND_INDEX_PATH ) ? File . read ( FRONTEND_INDEX_PATH ) : FALLBACK_HTML
117130 end
131+
132+ def render_development_api_landing ( router )
133+ router . response [ 'Content-Type' ] = 'text/html'
134+ DevelopmentLandingPage ::HTML
135+ end
118136 end
119137 end
120138end
0 commit comments