I did a few tests and this is what i did so far. It works, all as expected. But i will not accept it as answer yet but leave for some time for a community to review. If someone sees problems with this approach, please point them out in comments.
ErrorMessage is of simple format:
{ message:string }
Service:
getPDF() {
return this.http.get(`${environment.baseUrl}/api/v.1/reports/...`, { responseType: ResponseContentType.Blob })
.map((res) => {
return {
blob: new Blob([res.blob()], { type: 'application/pdf' }), filename: this.parseFilename(res)
}
})
.catch((res) => {
let fileAsTextObservable = new Observable<string>(observer => {
const reader = new FileReader();
reader.onload = (e) => {
let responseText = (<any>e.target).result;
observer.next(responseText);
observer.complete();
}
const errMsg = reader.readAsText(res.blob(), 'utf-8');
});
return fileAsTextObservable
.switchMap(errMsgJsonAsText => {
return Observable.throw(JSON.parse(errMsgJsonAsText));
})
});
}