1 package de.juplo.facebook.client;
3 import de.juplo.facebook.exceptions.GraphApiException;
4 import java.io.ByteArrayInputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
8 import org.springframework.http.HttpHeaders;
9 import org.springframework.http.HttpStatus;
10 import org.springframework.http.client.ClientHttpResponse;
11 import org.springframework.http.converter.HttpMessageConverter;
12 import org.springframework.http.converter.HttpMessageNotReadableException;
13 import org.springframework.security.oauth2.client.http.OAuth2ErrorHandler;
14 import org.springframework.util.FileCopyUtils;
15 import org.springframework.web.client.HttpMessageConverterExtractor;
16 import org.springframework.web.client.RestClientException;
17 import org.springframework.web.client.RestTemplate;
25 public class GraphApiErrorHandler extends OAuth2ErrorHandler
27 private final OAuth2ErrorHandler errorHandler;
28 private List<HttpMessageConverter<?>> messageConverters =
29 new RestTemplate().getMessageConverters();
32 public GraphApiErrorHandler(OAuth2ErrorHandler errorHandler)
35 this.errorHandler = errorHandler;
40 * @param messageConverters the messageConverters to set
43 public void setMessageConverters(
44 List<HttpMessageConverter<?>> messageConverters
47 this.messageConverters = messageConverters;
48 errorHandler.setMessageConverters(messageConverters);
52 public boolean hasError(ClientHttpResponse response) throws IOException
55 HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series())
56 || this.errorHandler.hasError(response);
60 public void handleError(final ClientHttpResponse response) throws IOException
62 if (!HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series()))
64 // We should only care about 400 level errors. Ex: A 500 server error shouldn't
65 // be an oauth related error.
66 errorHandler.handleError(response);
70 // Need to use buffered response because input stream may need to be consumed multiple times.
71 ClientHttpResponse bufferedResponse = new ClientHttpResponse()
73 private byte[] lazyBody;
76 public HttpStatus getStatusCode() throws IOException
78 return response.getStatusCode();
82 public synchronized InputStream getBody() throws IOException
84 if (lazyBody == null) {
85 InputStream bodyStream = response.getBody();
86 if (bodyStream != null) {
87 lazyBody = FileCopyUtils.copyToByteArray(bodyStream);
90 lazyBody = new byte[0];
93 return new ByteArrayInputStream(lazyBody);
97 public HttpHeaders getHeaders()
99 return response.getHeaders();
103 public String getStatusText() throws IOException
105 return response.getStatusText();
115 public int getRawStatusCode() throws IOException
117 return response.getRawStatusCode();
122 HttpMessageConverterExtractor<GraphApiException> extractor =
123 new HttpMessageConverterExtractor<>(
124 GraphApiException.class,
130 GraphApiException body = extractor.extractData(bufferedResponse);
133 // If we can get an OAuth2Exception already from the body, it is likely
134 // to have more information than the header does, so just re-throw it
136 body.setHttpErrorCode(response.getRawStatusCode());
140 catch (RestClientException|HttpMessageNotReadableException e)
145 errorHandler.handleError(bufferedResponse);