convert soft 404s to hard 404s in unfurler ssr
This commit is contained in:
		
							parent
							
								
									2f3e498906
								
							
						
					
					
						commit
						105cccf9b0
					
				| @ -47,6 +47,7 @@ export class BisqAddressComponent implements OnInit, OnDestroy { | ||||
|               catchError((err) => { | ||||
|                 this.isLoadingAddress = false; | ||||
|                 this.error = err; | ||||
|                 this.seoService.logSoft404(); | ||||
|                 console.log(err); | ||||
|                 return of(null); | ||||
|               }) | ||||
| @ -62,6 +63,7 @@ export class BisqAddressComponent implements OnInit, OnDestroy { | ||||
|       (error) => { | ||||
|         console.log(error); | ||||
|         this.error = error; | ||||
|         this.seoService.logSoft404(); | ||||
|         this.isLoadingAddress = false; | ||||
|       }); | ||||
|   } | ||||
|  | ||||
| @ -82,6 +82,7 @@ export class BisqBlockComponent implements OnInit, OnDestroy { | ||||
|       ) | ||||
|       .subscribe((block: BisqBlock) => { | ||||
|         if (!block) { | ||||
|           this.seoService.logSoft404(); | ||||
|           return; | ||||
|         } | ||||
|         this.isLoading = false; | ||||
| @ -97,6 +98,7 @@ export class BisqBlockComponent implements OnInit, OnDestroy { | ||||
| 
 | ||||
|   caughtHttpError(err: HttpErrorResponse){ | ||||
|     this.error = err; | ||||
|     this.seoService.logSoft404(); | ||||
|     return of(null); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -70,11 +70,13 @@ export class BisqTransactionComponent implements OnInit, OnDestroy { | ||||
|                     catchError((txError: HttpErrorResponse) => { | ||||
|                       console.log(txError); | ||||
|                       this.error = txError; | ||||
|                       this.seoService.logSoft404(); | ||||
|                       return of(null); | ||||
|                     }) | ||||
|                   ); | ||||
|               } | ||||
|               this.error = bisqTxError; | ||||
|               this.seoService.logSoft404(); | ||||
|               return of(null); | ||||
|             }) | ||||
|           ); | ||||
| @ -103,6 +105,7 @@ export class BisqTransactionComponent implements OnInit, OnDestroy { | ||||
|       this.isLoadingTx = false; | ||||
| 
 | ||||
|       if (!tx) { | ||||
|         this.seoService.logSoft404(); | ||||
|         return; | ||||
|       } | ||||
| 
 | ||||
|  | ||||
| @ -88,6 +88,7 @@ export class AddressComponent implements OnInit, OnDestroy { | ||||
|                 catchError((err) => { | ||||
|                   this.isLoadingAddress = false; | ||||
|                   this.error = err; | ||||
|                   this.seoService.logSoft404(); | ||||
|                   console.log(err); | ||||
|                   return of(null); | ||||
|                 }) | ||||
| @ -157,6 +158,7 @@ export class AddressComponent implements OnInit, OnDestroy { | ||||
|       (error) => { | ||||
|         console.log(error); | ||||
|         this.error = error; | ||||
|         this.seoService.logSoft404(); | ||||
|         this.isLoadingAddress = false; | ||||
|       }); | ||||
| 
 | ||||
|  | ||||
| @ -86,6 +86,7 @@ export class AssetComponent implements OnInit, OnDestroy { | ||||
|                   catchError((err) => { | ||||
|                     this.isLoadingAsset = false; | ||||
|                     this.error = err; | ||||
|                     this.seoService.logSoft404(); | ||||
|                     console.log(err); | ||||
|                     return of(null); | ||||
|                   }) | ||||
| @ -153,6 +154,7 @@ export class AssetComponent implements OnInit, OnDestroy { | ||||
|       (error) => { | ||||
|         console.log(error); | ||||
|         this.error = error; | ||||
|         this.seoService.logSoft404(); | ||||
|         this.isLoadingAsset = false; | ||||
|       }); | ||||
| 
 | ||||
|  | ||||
| @ -82,6 +82,7 @@ export class BlockPreviewComponent implements OnInit, OnDestroy { | ||||
|               }), | ||||
|               catchError((err) => { | ||||
|                 this.error = err; | ||||
|                 this.seoService.logSoft404(); | ||||
|                 this.openGraphService.fail('block-data-' + this.rawId); | ||||
|                 this.openGraphService.fail('block-viz-' + this.rawId); | ||||
|                 return of(null); | ||||
| @ -138,6 +139,7 @@ export class BlockPreviewComponent implements OnInit, OnDestroy { | ||||
|     (error) => { | ||||
|       this.error = error; | ||||
|       this.isLoadingOverview = false; | ||||
|       this.seoService.logSoft404(); | ||||
|       this.openGraphService.fail('block-viz-' + this.rawId); | ||||
|       this.openGraphService.fail('block-data-' + this.rawId); | ||||
|       if (this.blockGraph) { | ||||
|  | ||||
| @ -192,6 +192,7 @@ export class BlockComponent implements OnInit, OnDestroy { | ||||
|                       this.error = err; | ||||
|                       this.isLoadingBlock = false; | ||||
|                       this.isLoadingOverview = false; | ||||
|                       this.seoService.logSoft404(); | ||||
|                       return EMPTY; | ||||
|                     }) | ||||
|                   ); | ||||
| @ -200,6 +201,7 @@ export class BlockComponent implements OnInit, OnDestroy { | ||||
|                   this.error = err; | ||||
|                   this.isLoadingBlock = false; | ||||
|                   this.isLoadingOverview = false; | ||||
|                   this.seoService.logSoft404(); | ||||
|                   return EMPTY; | ||||
|                 }), | ||||
|               ); | ||||
| @ -215,6 +217,7 @@ export class BlockComponent implements OnInit, OnDestroy { | ||||
|               this.error = err; | ||||
|               this.isLoadingBlock = false; | ||||
|               this.isLoadingOverview = false; | ||||
|               this.seoService.logSoft404(); | ||||
|               return EMPTY; | ||||
|             }) | ||||
|           ); | ||||
|  | ||||
| @ -61,6 +61,7 @@ export class PoolPreviewComponent implements OnInit { | ||||
|               }), | ||||
|               catchError(() => { | ||||
|                 this.isLoading = false; | ||||
|                 this.seoService.logSoft404(); | ||||
|                 this.openGraphService.fail('pool-hash-' + this.slug); | ||||
|                 return of([slug]); | ||||
|               }) | ||||
| @ -70,6 +71,7 @@ export class PoolPreviewComponent implements OnInit { | ||||
|           return this.apiService.getPoolStats$(slug).pipe( | ||||
|             catchError(() => { | ||||
|               this.isLoading = false; | ||||
|               this.seoService.logSoft404(); | ||||
|               this.openGraphService.fail('pool-stats-' + this.slug); | ||||
|               return of(null); | ||||
|             }) | ||||
|  | ||||
| @ -1,8 +1,8 @@ | ||||
| import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | ||||
| import { ActivatedRoute } from '@angular/router'; | ||||
| import { EChartsOption, graphic } from 'echarts'; | ||||
| import { BehaviorSubject, Observable, timer } from 'rxjs'; | ||||
| import { distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators'; | ||||
| import { BehaviorSubject, Observable, of, timer } from 'rxjs'; | ||||
| import { catchError, distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators'; | ||||
| import { BlockExtended, PoolStat } from '../../interfaces/node-api.interface'; | ||||
| import { ApiService } from '../../services/api.service'; | ||||
| import { StateService } from '../../services/state.service'; | ||||
| @ -59,10 +59,21 @@ export class PoolComponent implements OnInit { | ||||
|                 this.prepareChartOptions(data.map(val => [val.timestamp * 1000, val.avgHashrate])); | ||||
|                 return [slug]; | ||||
|               }), | ||||
|               catchError(() => { | ||||
|                 this.isLoading = false; | ||||
|                 this.seoService.logSoft404(); | ||||
|                 return of([slug]); | ||||
|               }) | ||||
|             ); | ||||
|         }), | ||||
|         switchMap((slug) => { | ||||
|           return this.apiService.getPoolStats$(slug); | ||||
|           return this.apiService.getPoolStats$(slug).pipe( | ||||
|             catchError(() => { | ||||
|               this.isLoading = false; | ||||
|               this.seoService.logSoft404(); | ||||
|               return of(null); | ||||
|             }) | ||||
|           ); | ||||
|         }), | ||||
|         tap(() => { | ||||
|           this.loadMoreSubject.next(this.blocks[this.blocks.length - 1]?.height); | ||||
|  | ||||
| @ -133,6 +133,7 @@ export class TransactionPreviewComponent implements OnInit, OnDestroy { | ||||
|       ) | ||||
|       .subscribe((tx: Transaction) => { | ||||
|           if (!tx) { | ||||
|             this.seoService.logSoft404(); | ||||
|             this.openGraphService.fail('tx-data-' + this.txId); | ||||
|             return; | ||||
|           } | ||||
| @ -182,6 +183,7 @@ export class TransactionPreviewComponent implements OnInit, OnDestroy { | ||||
|           this.openGraphService.waitOver('tx-data-' + this.txId); | ||||
|         }, | ||||
|         (error) => { | ||||
|           this.seoService.logSoft404(); | ||||
|           this.openGraphService.fail('tx-data-' + this.txId); | ||||
|           this.error = error; | ||||
|           this.isLoadingTx = false; | ||||
|  | ||||
| @ -193,8 +193,10 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { | ||||
|       }) | ||||
|     ).subscribe((tx) => { | ||||
|       if (!tx) { | ||||
|         this.seoService.logSoft404(); | ||||
|         return; | ||||
|       } | ||||
|       this.seoService.clearSoft404(); | ||||
| 
 | ||||
|       this.tx = tx; | ||||
|       this.isCached = true; | ||||
| @ -286,9 +288,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { | ||||
|         }) | ||||
|       ) | ||||
|       .subscribe((tx: Transaction) => { | ||||
|           if (!tx) { | ||||
|             return; | ||||
|           } | ||||
|         if (!tx) { | ||||
|           this.seoService.logSoft404(); | ||||
|           return; | ||||
|         } | ||||
|         this.seoService.clearSoft404(); | ||||
| 
 | ||||
|           this.tx = tx; | ||||
|           this.isCached = false; | ||||
| @ -340,6 +344,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { | ||||
|         }, | ||||
|         (error) => { | ||||
|           this.error = error; | ||||
|           this.seoService.logSoft404(); | ||||
|           this.isLoadingTx = false; | ||||
|         } | ||||
|       ); | ||||
| @ -394,6 +399,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { | ||||
|       this.waitingForTransaction = true; | ||||
|     } | ||||
|     this.error = error; | ||||
|     this.seoService.logSoft404(); | ||||
|     this.isLoadingTx = false; | ||||
|     return of(false); | ||||
|   } | ||||
|  | ||||
| @ -54,6 +54,7 @@ export class ChannelPreviewComponent implements OnInit { | ||||
|               }), | ||||
|               catchError((err) => { | ||||
|                 this.error = err; | ||||
|                 this.seoService.logSoft404(); | ||||
|                 this.openGraphService.fail('channel-map-' + this.shortId); | ||||
|                 this.openGraphService.fail('channel-data-' + this.shortId); | ||||
|                 return of(null); | ||||
|  | ||||
| @ -38,6 +38,7 @@ export class ChannelComponent implements OnInit { | ||||
|               }), | ||||
|               catchError((err) => { | ||||
|                 this.error = err; | ||||
|                 this.seoService.logSoft404(); | ||||
|                 return [{ | ||||
|                   short_id: params.get('short_id') | ||||
|                 }]; | ||||
|  | ||||
| @ -50,6 +50,7 @@ export class GroupPreviewComponent implements OnInit { | ||||
|               name: this.slug.replace(/-/gi, ' '), | ||||
|               description: '', | ||||
|             }; | ||||
|             this.seoService.logSoft404(); | ||||
|             this.openGraphService.fail('ln-group-map-' + this.slug); | ||||
|             this.openGraphService.fail('ln-group-data-' + this.slug); | ||||
|             return of(null); | ||||
| @ -106,6 +107,7 @@ export class GroupPreviewComponent implements OnInit { | ||||
|           }; | ||||
|         }), | ||||
|         catchError(() => { | ||||
|           this.seoService.logSoft404(); | ||||
|           this.openGraphService.fail('ln-group-map-' + this.slug); | ||||
|           this.openGraphService.fail('ln-group-data-' + this.slug); | ||||
|           return of({ | ||||
|  | ||||
| @ -81,6 +81,7 @@ export class NodePreviewComponent implements OnInit { | ||||
|         }), | ||||
|         catchError(err => { | ||||
|           this.error = err; | ||||
|           this.seoService.logSoft404(); | ||||
|           this.openGraphService.fail('node-map-' + this.publicKey); | ||||
|           this.openGraphService.fail('node-data-' + this.publicKey); | ||||
|           return [{ | ||||
|  | ||||
| @ -121,6 +121,7 @@ export class NodeComponent implements OnInit { | ||||
|         }), | ||||
|         catchError(err => { | ||||
|           this.error = err; | ||||
|           this.seoService.logSoft404(); | ||||
|           return [{ | ||||
|             alias: this.publicKey, | ||||
|             public_key: this.publicKey, | ||||
|  | ||||
| @ -85,6 +85,7 @@ export class NodesPerISPPreview implements OnInit { | ||||
|         }), | ||||
|         catchError(err => { | ||||
|           this.error = err; | ||||
|           this.seoService.logSoft404(); | ||||
|           this.openGraphService.fail('isp-map-' + this.id); | ||||
|           this.openGraphService.fail('isp-data-' + this.id); | ||||
|           return of({ | ||||
|  | ||||
| @ -1,5 +1,7 @@ | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { Title, Meta } from '@angular/platform-browser'; | ||||
| import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; | ||||
| import { filter, map, switchMap } from 'rxjs'; | ||||
| import { StateService } from './state.service'; | ||||
| 
 | ||||
| @Injectable({ | ||||
| @ -13,8 +15,22 @@ export class SeoService { | ||||
|     private titleService: Title, | ||||
|     private metaService: Meta, | ||||
|     private stateService: StateService, | ||||
|     private router: Router, | ||||
|     private activatedRoute: ActivatedRoute, | ||||
|   ) { | ||||
|     this.stateService.networkChanged$.subscribe((network) => this.network = network); | ||||
|     this.router.events.pipe( | ||||
|       filter(event => event instanceof NavigationEnd), | ||||
|       map(() => this.activatedRoute), | ||||
|       map(route => { | ||||
|         while (route.firstChild) route = route.firstChild; | ||||
|         return route; | ||||
|       }), | ||||
|       filter(route => route.outlet === 'primary'), | ||||
|       switchMap(route => route.data), | ||||
|     ).subscribe((data) => { | ||||
|       this.clearSoft404(); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   setTitle(newTitle: string): void { | ||||
| @ -53,4 +69,14 @@ export class SeoService { | ||||
|   ucfirst(str: string) { | ||||
|     return str.charAt(0).toUpperCase() + str.slice(1); | ||||
|   } | ||||
| 
 | ||||
|   clearSoft404() { | ||||
|     window['soft404'] = false; | ||||
|     console.log('cleared soft 404'); | ||||
|   } | ||||
| 
 | ||||
|   logSoft404() { | ||||
|     window['soft404'] = true; | ||||
|     console.log('set soft 404'); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -179,8 +179,15 @@ class Server { | ||||
|       await page.waitForNetworkIdle({ | ||||
|         timeout: config.PUPPETEER.RENDER_TIMEOUT || 3000, | ||||
|       }); | ||||
|       let html = await page.content(); | ||||
|       return html; | ||||
|       const is404 = await page.evaluate(async () => { | ||||
|         return !!window['soft404']; | ||||
|       }); | ||||
|       if (is404) { | ||||
|         return '404'; | ||||
|       } else { | ||||
|         let html = await page.content(); | ||||
|         return html; | ||||
|       } | ||||
|     } catch (e) { | ||||
|       if (e instanceof TimeoutError) { | ||||
|         let html = await page.content(); | ||||
| @ -258,7 +265,11 @@ class Server { | ||||
|         result = await this.renderUnfurlMeta(rawPath); | ||||
|       } | ||||
|       if (result && result.length) { | ||||
|         res.send(result); | ||||
|         if (result === '404') { | ||||
|           res.status(404).send(); | ||||
|         } else { | ||||
|           res.send(result); | ||||
|         } | ||||
|       } else { | ||||
|         res.status(500).send(); | ||||
|       } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user