Skip to content

Commit a237566

Browse files
committed
- revamps chunk uploader implementation to rely less on status codes as services have different behaviors
1 parent bd6989a commit a237566

File tree

2 files changed

+34
-19
lines changed

2 files changed

+34
-19
lines changed

src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResponseHandler.java

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@
2525
import java.io.BufferedInputStream;
2626
import java.io.IOException;
2727
import java.io.InputStream;
28+
import java.util.Map;
2829

30+
import com.microsoft.graph.core.Constants;
2931
import com.microsoft.graph.http.DefaultHttpProvider;
3032
import com.microsoft.graph.http.GraphServiceException;
3133
import com.microsoft.graph.http.HttpResponseCode;
34+
import com.microsoft.graph.http.HttpResponseHeadersHelper;
3235
import com.microsoft.graph.http.IConnection;
3336
import com.microsoft.graph.http.IHttpRequest;
3437
import com.microsoft.graph.http.IStatefulResponseHandler;
@@ -46,6 +49,8 @@
4649
*/
4750
public class ChunkedUploadResponseHandler<UploadType>
4851
implements IStatefulResponseHandler<ChunkedUploadResult<UploadType>, UploadType> {
52+
53+
private final static HttpResponseHeadersHelper responseHeadersHelper = new HttpResponseHeadersHelper();
4954
/**
5055
* The expected deserialized upload type
5156
*/
@@ -154,30 +159,35 @@ public ChunkedUploadResult<UploadType> generateResult(
154159
final ILogger logger) throws Exception {
155160
InputStream in = null;
156161
try {
157-
if (response.code() == HttpResponseCode.HTTP_ACCEPTED) {
158-
logger.logDebug("Chunk bytes has been accepted by the server.");
159-
in = new BufferedInputStream(response.body().byteStream());
160-
final UploadSession session = serializer.deserializeObject(
161-
DefaultHttpProvider.streamToString(in), UploadSession.class);
162-
163-
return new ChunkedUploadResult<UploadType>(session);
164-
165-
} else if (response.code() == HttpResponseCode.HTTP_CREATED
166-
|| response.code() == HttpResponseCode.HTTP_OK) {
167-
logger.logDebug("Upload session is completed, uploaded item returned.");
168-
in = new BufferedInputStream(response.body().byteStream());
169-
final String rawJson = DefaultHttpProvider.streamToString(in);
170-
final UploadType uploadedItem = serializer.deserializeObject(rawJson,
171-
this.deserializeTypeClass);
172-
173-
return new ChunkedUploadResult<UploadType>(uploadedItem);
174-
} else if (response.code() >= HttpResponseCode.HTTP_CLIENT_ERROR) {
162+
if (response.code() >= HttpResponseCode.HTTP_CLIENT_ERROR) {
175163
logger.logDebug("Receiving error during upload, see detail on result error");
176164

177165
return new ChunkedUploadResult<UploadType>(
178166
GraphServiceException.createFromConnection(request, null, serializer,
179167
response, logger));
180-
}
168+
} else if (response.code() >= HttpResponseCode.HTTP_OK
169+
&& response.code() < HttpResponseCode.HTTP_MULTIPLE_CHOICES) {
170+
final Map<String, String> headers = responseHeadersHelper.getResponseHeadersAsMapStringString(response);
171+
final String contentType = headers.get(Constants.CONTENT_TYPE_HEADER_NAME);
172+
final String location = headers.get("Location");
173+
if(contentType != null
174+
&& contentType.contains(Constants.JSON_CONTENT_TYPE)) {
175+
in = new BufferedInputStream(response.body().byteStream());
176+
final String rawJson = DefaultHttpProvider.streamToString(in);
177+
final UploadSession session = serializer.deserializeObject(rawJson, UploadSession.class);
178+
if(session == null) {
179+
logger.logDebug("Upload session is completed (ODSP), uploaded item returned.");
180+
final UploadType uploadedItem = serializer.deserializeObject(rawJson, this.deserializeTypeClass);
181+
return new ChunkedUploadResult<UploadType>(uploadedItem);
182+
} else {
183+
logger.logDebug("Chunk bytes has been accepted by the server.");
184+
return new ChunkedUploadResult<UploadType>(session);
185+
}
186+
} else if(location != null) {
187+
logger.logDebug("Upload session is completed (Outlook), uploaded item returned.");
188+
return new ChunkedUploadResult<UploadType>(this.deserializeTypeClass.getDeclaredConstructor().newInstance());
189+
}
190+
}
181191
} finally {
182192
if (in != null) {
183193
try{

src/main/java/com/microsoft/graph/http/HttpResponseCode.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public final class HttpResponseCode {
4747
*/
4848
public static final int HTTP_NOBODY = 204;
4949

50+
/**
51+
* HTTP response code for multiple choices
52+
*/
53+
public static final int HTTP_MULTIPLE_CHOICES = 300;
54+
5055
/**
5156
* HTTP response code for see other
5257
*/

0 commit comments

Comments
 (0)