1
1
import { print } from 'graphql' ;
2
- import { HttpClient } from '@angular/common/http' ;
2
+ import { HttpClient , HttpResponse , HttpEvent , HttpEventType } from '@angular/common/http' ;
3
3
import { Injectable } from '@angular/core' ;
4
4
import {
5
5
ApolloLink ,
6
6
FetchResult ,
7
7
Observable as LinkObservable ,
8
- Operation ,
8
+ Operation
9
9
} from '@apollo/client/core' ;
10
10
import { pick } from './http-batch-link' ;
11
- import { Body , Context , OperationPrinter , Options , Request } from './types' ;
11
+ import { Body , Context , HttpClientReturn , OperationPrinter , Options , Request } from './types' ;
12
12
import { createHeadersWithClientAwareness , fetch , mergeHeaders } from './utils' ;
13
13
14
14
// XXX find a better name for it
@@ -57,6 +57,9 @@ export class HttpLinkHandler extends ApolloLink {
57
57
withCredentials,
58
58
useMultipart,
59
59
headers : this . options . headers ,
60
+ observe : context . observe ,
61
+ reportProgress : context . reportProgress ,
62
+ responseType : context . responseType
60
63
} ,
61
64
} ;
62
65
@@ -73,9 +76,23 @@ export class HttpLinkHandler extends ApolloLink {
73
76
req . options . headers = mergeHeaders ( req . options . headers , headers ) ;
74
77
75
78
const sub = fetch ( req , this . httpClient , this . options . extractFiles ) . subscribe ( {
76
- next : response => {
79
+ next : ( response : HttpClientReturn ) => {
77
80
operation . setContext ( { response } ) ;
78
- observer . next ( response . body ) ;
81
+
82
+ if ( context . responseType === 'blob' ||
83
+ context . responseType === 'arraybuffer' ||
84
+ context . responseType === 'text' ) {
85
+ observer . next ( response ) ;
86
+ return ;
87
+ }
88
+
89
+ if ( response instanceof HttpResponse ) {
90
+ observer . next ( response . body ) ;
91
+ } else if ( this . isHttpEvent ( response ) ) {
92
+ this . handleHttpEvent ( response , observer ) ;
93
+ } else {
94
+ observer . next ( response ) ;
95
+ }
79
96
} ,
80
97
error : err => observer . error ( err ) ,
81
98
complete : ( ) => observer . complete ( ) ,
@@ -92,6 +109,42 @@ export class HttpLinkHandler extends ApolloLink {
92
109
public request ( op : Operation ) : LinkObservable < FetchResult > | null {
93
110
return this . requester ( op ) ;
94
111
}
112
+
113
+ private isHttpEvent ( response : HttpClientReturn ) : response is HttpEvent < any > {
114
+ return typeof response === 'object' && response !== null && 'type' in response ;
115
+ }
116
+
117
+ private handleHttpEvent ( event : HttpEvent < any > , observer : any ) {
118
+ switch ( event . type ) {
119
+ case HttpEventType . Response :
120
+ if ( event instanceof HttpResponse ) {
121
+ observer . next ( event . body ) ;
122
+ }
123
+ break ;
124
+ case HttpEventType . DownloadProgress :
125
+ case HttpEventType . UploadProgress :
126
+ observer . next ( {
127
+ data : null ,
128
+ extensions : {
129
+ httpEvent : {
130
+ type : event . type ,
131
+ loaded : 'loaded' in event ? event . loaded : undefined ,
132
+ total : 'total' in event ? event . total : undefined
133
+ }
134
+ }
135
+ } ) ;
136
+ break ;
137
+ default :
138
+ observer . next ( {
139
+ data : null ,
140
+ extensions : {
141
+ httpEvent : {
142
+ type : event . type
143
+ }
144
+ }
145
+ } ) ;
146
+ }
147
+ }
95
148
}
96
149
97
150
@Injectable ( {
0 commit comments