kopia lustrzana https://github.com/ryukoposting/Signal-Android
Use AttachmentsV2 if the resumable upload link from V3 becomes corrupted.
rodzic
ade6f60e76
commit
3f233ed39f
|
@ -32,6 +32,8 @@ import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
import org.whispersystems.signalservice.api.SignalServiceMessageSender;
|
import org.whispersystems.signalservice.api.SignalServiceMessageSender;
|
||||||
import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
|
import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
|
||||||
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
|
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
|
||||||
|
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||||
|
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResumableUploadResponseCodeException;
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.ResumeLocationInvalidException;
|
import org.whispersystems.signalservice.api.push.exceptions.ResumeLocationInvalidException;
|
||||||
import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec;
|
import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec;
|
||||||
|
|
||||||
|
@ -56,6 +58,7 @@ public final class AttachmentUploadJob extends BaseJob {
|
||||||
|
|
||||||
private static final String KEY_ROW_ID = "row_id";
|
private static final String KEY_ROW_ID = "row_id";
|
||||||
private static final String KEY_UNIQUE_ID = "unique_id";
|
private static final String KEY_UNIQUE_ID = "unique_id";
|
||||||
|
private static final String KEY_FORCE_V2 = "force_v2";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Foreground notification shows while uploading attachments above this.
|
* Foreground notification shows while uploading attachments above this.
|
||||||
|
@ -64,24 +67,29 @@ public final class AttachmentUploadJob extends BaseJob {
|
||||||
|
|
||||||
private final AttachmentId attachmentId;
|
private final AttachmentId attachmentId;
|
||||||
|
|
||||||
|
private boolean forceV2;
|
||||||
|
|
||||||
public AttachmentUploadJob(AttachmentId attachmentId) {
|
public AttachmentUploadJob(AttachmentId attachmentId) {
|
||||||
this(new Job.Parameters.Builder()
|
this(new Job.Parameters.Builder()
|
||||||
.addConstraint(NetworkConstraint.KEY)
|
.addConstraint(NetworkConstraint.KEY)
|
||||||
.setLifespan(TimeUnit.DAYS.toMillis(1))
|
.setLifespan(TimeUnit.DAYS.toMillis(1))
|
||||||
.setMaxAttempts(Parameters.UNLIMITED)
|
.setMaxAttempts(Parameters.UNLIMITED)
|
||||||
.build(),
|
.build(),
|
||||||
attachmentId);
|
attachmentId,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private AttachmentUploadJob(@NonNull Job.Parameters parameters, @NonNull AttachmentId attachmentId) {
|
private AttachmentUploadJob(@NonNull Job.Parameters parameters, @NonNull AttachmentId attachmentId, boolean forceV2) {
|
||||||
super(parameters);
|
super(parameters);
|
||||||
this.attachmentId = attachmentId;
|
this.attachmentId = attachmentId;
|
||||||
|
this.forceV2 = forceV2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull Data serialize() {
|
public @NonNull Data serialize() {
|
||||||
return new Data.Builder().putLong(KEY_ROW_ID, attachmentId.getRowId())
|
return new Data.Builder().putLong(KEY_ROW_ID, attachmentId.getRowId())
|
||||||
.putLong(KEY_UNIQUE_ID, attachmentId.getUniqueId())
|
.putLong(KEY_UNIQUE_ID, attachmentId.getUniqueId())
|
||||||
|
.putBoolean(KEY_FORCE_V2, forceV2)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +113,10 @@ public final class AttachmentUploadJob extends BaseJob {
|
||||||
|
|
||||||
ResumableUploadSpec resumableUploadSpec;
|
ResumableUploadSpec resumableUploadSpec;
|
||||||
|
|
||||||
if (inputData != null && inputData.hasString(ResumableUploadSpecJob.KEY_RESUME_SPEC)) {
|
if (forceV2) {
|
||||||
|
Log.d(TAG, "Forcing utilization of V2");
|
||||||
|
resumableUploadSpec = null;
|
||||||
|
} else if (inputData != null && inputData.hasString(ResumableUploadSpecJob.KEY_RESUME_SPEC)) {
|
||||||
Log.d(TAG, "Using attachments V3");
|
Log.d(TAG, "Using attachments V3");
|
||||||
resumableUploadSpec = ResumableUploadSpec.deserialize(inputData.getString(ResumableUploadSpecJob.KEY_RESUME_SPEC));
|
resumableUploadSpec = ResumableUploadSpec.deserialize(inputData.getString(ResumableUploadSpecJob.KEY_RESUME_SPEC));
|
||||||
} else {
|
} else {
|
||||||
|
@ -137,6 +148,11 @@ public final class AttachmentUploadJob extends BaseJob {
|
||||||
Attachment attachment = PointerAttachment.forPointer(Optional.of(remoteAttachment), null, databaseAttachment.getFastPreflightId()).get();
|
Attachment attachment = PointerAttachment.forPointer(Optional.of(remoteAttachment), null, databaseAttachment.getFastPreflightId()).get();
|
||||||
|
|
||||||
database.updateAttachmentAfterUpload(databaseAttachment.getAttachmentId(), attachment, remoteAttachment.getUploadTimestamp());
|
database.updateAttachmentAfterUpload(databaseAttachment.getAttachmentId(), attachment, remoteAttachment.getUploadTimestamp());
|
||||||
|
} catch (NonSuccessfulResumableUploadResponseCodeException e) {
|
||||||
|
if (e.getCode() == 400) {
|
||||||
|
Log.w(TAG, "Failed to upload due to a 400 when getting resumable upload information. Downgrading to attachments v2", e);
|
||||||
|
forceV2 = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,7 +261,7 @@ public final class AttachmentUploadJob extends BaseJob {
|
||||||
public static final class Factory implements Job.Factory<AttachmentUploadJob> {
|
public static final class Factory implements Job.Factory<AttachmentUploadJob> {
|
||||||
@Override
|
@Override
|
||||||
public @NonNull AttachmentUploadJob create(@NonNull Parameters parameters, @NonNull org.thoughtcrime.securesms.jobmanager.Data data) {
|
public @NonNull AttachmentUploadJob create(@NonNull Parameters parameters, @NonNull org.thoughtcrime.securesms.jobmanager.Data data) {
|
||||||
return new AttachmentUploadJob(parameters, new AttachmentId(data.getLong(KEY_ROW_ID), data.getLong(KEY_UNIQUE_ID)));
|
return new AttachmentUploadJob(parameters, new AttachmentId(data.getLong(KEY_ROW_ID), data.getLong(KEY_UNIQUE_ID)), data.getBooleanOrDefault(KEY_FORCE_V2, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package org.whispersystems.signalservice.api.push.exceptions;
|
||||||
|
|
||||||
|
public class NonSuccessfulResumableUploadResponseCodeException extends NonSuccessfulResponseCodeException {
|
||||||
|
public NonSuccessfulResumableUploadResponseCodeException(int code, String s) {
|
||||||
|
super(code, s);
|
||||||
|
}
|
||||||
|
}
|
|
@ -59,6 +59,7 @@ import org.whispersystems.signalservice.api.push.exceptions.MalformedResponseExc
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException;
|
import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException;
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.NoContentException;
|
import org.whispersystems.signalservice.api.push.exceptions.NoContentException;
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||||
|
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResumableUploadResponseCodeException;
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.NotFoundException;
|
import org.whispersystems.signalservice.api.push.exceptions.NotFoundException;
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException;
|
import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException;
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
|
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
|
||||||
|
@ -1374,7 +1375,7 @@ public class PushServiceSocket {
|
||||||
} else if (response.code() == 404) {
|
} else if (response.code() == 404) {
|
||||||
throw new ResumeLocationInvalidException();
|
throw new ResumeLocationInvalidException();
|
||||||
} else {
|
} else {
|
||||||
throw new NonSuccessfulResponseCodeException(response.code(), "Response: " + response);
|
throw new NonSuccessfulResumableUploadResponseCodeException(response.code(), "Response: " + response);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
synchronized (connections) {
|
synchronized (connections) {
|
||||||
|
|
Ładowanie…
Reference in New Issue