Skip to content

Commit 60ab138

Browse files
committed
Ensure that content is copied over correctly to the response as well as headers and status code - fixes empty body issue when request was retried.
1 parent 5d1e461 commit 60ab138

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

share-oauth/src/main/java/org/sharextras/webscripts/connector/HttpOAuth2Connector.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ public Response call(String uri, ConnectorContext context, HttpServletRequest re
113113
Response resp = null;
114114
boolean newlyLoaded = false;
115115

116+
context.setCommitResponseOnAuthenticationError(false);
117+
116118
try
117119
{
118120
if (!hasAccessToken())
@@ -127,7 +129,8 @@ public Response call(String uri, ConnectorContext context, HttpServletRequest re
127129
// First call
128130
if (logger.isDebugEnabled())
129131
logger.debug("Loading resource " + uri + " - first attempt");
130-
132+
133+
wrappedRes.reset();
131134
resp = callInternal(uri, context, req, wrappedRes);
132135

133136
if (logger.isDebugEnabled())
@@ -151,6 +154,7 @@ public Response call(String uri, ConnectorContext context, HttpServletRequest re
151154
{
152155
if (logger.isDebugEnabled())
153156
logger.debug("Token has been updated, retrying request for " + uri);
157+
wrappedRes.reset();
154158
resp = callInternal(uri, context, req, wrappedRes);
155159
if (logger.isDebugEnabled())
156160
logger.debug("Response status " + resp.getStatus().getCode() + " " + resp.getStatus().getCodeName());
@@ -197,6 +201,7 @@ public Response call(String uri, ConnectorContext context, HttpServletRequest re
197201
logger.debug("Got new access token " + newToken + " - retrying request for " + uri);
198202
connectorSession.setParameter(OAuth2Authenticator.CS_PARAM_ACCESS_TOKEN, newToken);
199203
saveTokens(endpointId, req);
204+
wrappedRes.reset();
200205
resp = callInternal(uri, context, req, wrappedRes);
201206
}
202207
else
@@ -213,7 +218,7 @@ public Response call(String uri, ConnectorContext context, HttpServletRequest re
213218
}
214219
}
215220

216-
copyResponseContent(wrappedRes, res, true);
221+
copyResponseContent(resp, wrappedRes, res, true);
217222
}
218223
catch (CredentialVaultProviderException e)
219224
{
@@ -332,16 +337,31 @@ protected void saveTokens(String endpointId, HttpServletRequest request) throws
332337
}
333338
}
334339

335-
private void copyResponseContent(FakeHttpServletResponse source, HttpServletResponse dest, boolean flush) throws IOException
340+
private void copyResponseContent(Response resp, FakeHttpServletResponse source, HttpServletResponse dest, boolean flush) throws IOException
336341
{
337-
dest.setStatus(source.getStatus());
342+
byte[] bytes = source.getContentAsByteArray();
343+
source.flushBuffer();
344+
if (logger.isDebugEnabled())
345+
{
346+
logger.debug("Setting status " + resp.getStatus().getCode());
347+
logger.debug("Setting encoding " + source.getCharacterEncoding());
348+
}
349+
dest.setStatus(resp.getStatus().getCode());
338350
dest.setCharacterEncoding(source.getCharacterEncoding());
339351
// Copy headers over
340-
for (Object hdrname : source.getHeaderNames())
352+
for (Map.Entry<String, String> header : resp.getStatus().getHeaders().entrySet())
353+
{
354+
dest.setHeader(header.getKey(), header.getValue());
355+
if (logger.isDebugEnabled())
356+
{
357+
logger.debug("Add header " + header.getKey() + ": " + header.getValue());
358+
}
359+
}
360+
if (logger.isDebugEnabled())
341361
{
342-
dest.setHeader((String) hdrname, (String) source.getHeader((String) hdrname));
362+
logger.debug("Add bytes " + bytes.length);
343363
}
344-
dest.getOutputStream().write(source.getContentAsByteArray());
364+
dest.getOutputStream().write(bytes);
345365
if (flush)
346366
{
347367
dest.flushBuffer();

0 commit comments

Comments
 (0)