1 package de.juplo.facebook;
3 import java.io.ByteArrayInputStream;
4 import java.io.IOException;
5 import java.io.InputStream;
7 import org.springframework.http.HttpHeaders;
8 import org.springframework.http.HttpStatus;
9 import org.springframework.http.client.ClientHttpResponse;
10 import org.springframework.http.converter.HttpMessageConverter;
11 import org.springframework.http.converter.HttpMessageNotReadableException;
12 import org.springframework.security.oauth2.client.http.OAuth2ErrorHandler;
13 import org.springframework.util.FileCopyUtils;
14 import org.springframework.web.client.HttpMessageConverterExtractor;
15 import org.springframework.web.client.RestClientException;
16 import org.springframework.web.client.RestTemplate;
24 public class GraphApiErrorHandler extends OAuth2ErrorHandler
26 private final OAuth2ErrorHandler errorHandler;
27 private List<HttpMessageConverter<?>> messageConverters =
28 new RestTemplate().getMessageConverters();
31 public GraphApiErrorHandler(OAuth2ErrorHandler errorHandler)
34 this.errorHandler = errorHandler;
39 * @param messageConverters the messageConverters to set
42 public void setMessageConverters(
43 List<HttpMessageConverter<?>> messageConverters
46 this.messageConverters = messageConverters;
47 errorHandler.setMessageConverters(messageConverters);
51 public boolean hasError(ClientHttpResponse response) throws IOException
54 HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series())
55 || this.errorHandler.hasError(response);
59 public void handleError(final ClientHttpResponse response) throws IOException
61 if (!HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series()))
63 // We should only care about 400 level errors. Ex: A 500 server error shouldn't
64 // be an oauth related error.
65 errorHandler.handleError(response);
69 // Need to use buffered response because input stream may need to be consumed multiple times.
70 ClientHttpResponse bufferedResponse = new ClientHttpResponse()
72 private byte[] lazyBody;
75 public HttpStatus getStatusCode() throws IOException
77 return response.getStatusCode();
81 public synchronized InputStream getBody() throws IOException
83 if (lazyBody == null) {
84 InputStream bodyStream = response.getBody();
85 if (bodyStream != null) {
86 lazyBody = FileCopyUtils.copyToByteArray(bodyStream);
89 lazyBody = new byte[0];
92 return new ByteArrayInputStream(lazyBody);
96 public HttpHeaders getHeaders()
98 return response.getHeaders();
102 public String getStatusText() throws IOException
104 return response.getStatusText();
114 public int getRawStatusCode() throws IOException
116 return response.getRawStatusCode();
121 HttpMessageConverterExtractor<GraphApiException> extractor =
122 new HttpMessageConverterExtractor<>(
123 GraphApiException.class,
129 GraphApiException body = extractor.extractData(bufferedResponse);
132 // If we can get an OAuth2Exception already from the body, it is likely
133 // to have more information than the header does, so just re-throw it
135 body.setHttpErrorCode(response.getRawStatusCode());
139 catch (RestClientException|HttpMessageNotReadableException e)
144 errorHandler.handleError(bufferedResponse);