Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Unified Diff: components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java

Issue 2302253003: Improve error handling in JavaUrlRequest (Closed)
Patch Set: Remove errant comment change Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java
diff --git a/components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java b/components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java
index b07ad04843ce12ad2ca4caf26e19e84af86e2341..c5e3bd23a66c2ccdc87cbe5627406081fdd43138 100644
--- a/components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java
+++ b/components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java
@@ -290,7 +290,7 @@ final class JavaUrlRequest implements UrlRequest {
throw new IllegalStateException(
"Not expecting a read result, expecting: " + mSinkState.get());
}
- mExecutor.execute(errorSetting(State.STARTED, new CheckedRunnable() {
+ mExecutor.execute(errorSetting(new CheckedRunnable() {
@Override
public void run() throws Exception {
mBuffer.flip();
@@ -344,7 +344,7 @@ final class JavaUrlRequest implements UrlRequest {
}
void startRead() {
- mExecutor.execute(errorSetting(State.STARTED, new CheckedRunnable() {
+ mExecutor.execute(errorSetting(new CheckedRunnable() {
@Override
public void run() throws Exception {
if (mOutputChannel == null) {
@@ -432,30 +432,49 @@ final class JavaUrlRequest implements UrlRequest {
});
}
- private void enterErrorState(State previousState, final UrlRequestException error) {
- if (mState.compareAndSet(previousState, State.ERROR)) {
+ private void enterErrorState(final UrlRequestException error) {
+ if (setTerminalState(State.ERROR)) {
fireDisconnect();
fireCloseUploadDataProvider();
mCallbackAsync.onFailed(mUrlResponseInfo, error);
}
}
+ private boolean setTerminalState(State error) {
+ while (true) {
xunjieli 2016/09/02 21:05:01 I don't understand the need for a while-true loop.
Charles 2016/09/02 21:08:36 We're doing a compare-and-set continuously until w
xunjieli 2016/09/02 21:41:14 Acknowledged.
+ State oldState = mState.get();
+ switch (oldState) {
+ case NOT_STARTED:
+ throw new IllegalStateException("Can't enter error state before start");
+ case ERROR: // fallthrough
+ case COMPLETE: // fallthrough
+ case CANCELLED:
+ return false; // Already in a terminal state
+ default: {
+ if (mState.compareAndSet(oldState, error)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+
/** Ends the request with an error, caused by an exception thrown from user code. */
- private void enterUserErrorState(State previousState, final Throwable error) {
- enterErrorState(previousState,
+ private void enterUserErrorState(final Throwable error) {
+ enterErrorState(
new UrlRequestException("Exception received from UrlRequest.Callback", error));
}
/** Ends the request with an error, caused by an exception thrown from user code. */
private void enterUploadErrorState(final Throwable error) {
- enterErrorState(State.STARTED,
+ enterErrorState(
new UrlRequestException("Exception received from UploadDataProvider", error));
}
- private void enterCronetErrorState(State previousState, final Throwable error) {
+ private void enterCronetErrorState(final Throwable error) {
// TODO(clm) mapping from Java exception (UnknownHostException, for example) to net error
// code goes here.
- enterErrorState(previousState, new UrlRequestException("System error", error));
+ enterErrorState(new UrlRequestException("System error", error));
}
/**
@@ -490,7 +509,7 @@ final class JavaUrlRequest implements UrlRequest {
private void fireGetHeaders() {
mAdditionalStatusDetails = Status.WAITING_FOR_RESPONSE;
- mExecutor.execute(errorSetting(State.STARTED, new CheckedRunnable() {
+ mExecutor.execute(errorSetting(new CheckedRunnable() {
@Override
public void run() throws Exception {
HttpURLConnection connection = mCurrentUrlConnection.get();
@@ -569,7 +588,7 @@ final class JavaUrlRequest implements UrlRequest {
}
private void fireOpenConnection() {
- mExecutor.execute(errorSetting(State.STARTED, new CheckedRunnable() {
+ mExecutor.execute(errorSetting(new CheckedRunnable() {
@Override
public void run() throws Exception {
// If we're cancelled, then our old connection will be disconnected for us and
@@ -608,27 +627,27 @@ final class JavaUrlRequest implements UrlRequest {
}));
}
- private Runnable errorSetting(final State expectedState, final CheckedRunnable delegate) {
+ private Runnable errorSetting(final CheckedRunnable delegate) {
return new Runnable() {
@Override
public void run() {
try {
delegate.run();
} catch (Throwable t) {
- enterCronetErrorState(expectedState, t);
+ enterCronetErrorState(t);
}
}
};
}
- private Runnable userErrorSetting(final State expectedState, final CheckedRunnable delegate) {
+ private Runnable userErrorSetting(final CheckedRunnable delegate) {
return new Runnable() {
@Override
public void run() {
try {
delegate.run();
} catch (Throwable t) {
- enterUserErrorState(expectedState, t);
+ enterUserErrorState(t);
}
}
};
@@ -656,7 +675,7 @@ final class JavaUrlRequest implements UrlRequest {
transitionStates(State.AWAITING_READ, State.READING, new Runnable() {
@Override
public void run() {
- mExecutor.execute(errorSetting(State.READING, new CheckedRunnable() {
+ mExecutor.execute(errorSetting(new CheckedRunnable() {
@Override
public void run() throws Exception {
int read = mResponseChannel.read(buffer);
@@ -781,17 +800,16 @@ final class JavaUrlRequest implements UrlRequest {
});
}
- void execute(State currentState, CheckedRunnable runnable) {
+ void execute(CheckedRunnable runnable) {
try {
- mUserExecutor.execute(userErrorSetting(currentState, runnable));
+ mUserExecutor.execute(userErrorSetting(runnable));
} catch (RejectedExecutionException e) {
- enterErrorState(currentState,
- new UrlRequestException("Exception posting task to executor", e));
+ enterErrorState(new UrlRequestException("Exception posting task to executor", e));
}
}
void onRedirectReceived(final UrlResponseInfo info, final String newLocationUrl) {
- execute(State.AWAITING_FOLLOW_REDIRECT, new CheckedRunnable() {
+ execute(new CheckedRunnable() {
@Override
public void run() throws Exception {
mCallback.onRedirectReceived(JavaUrlRequest.this, info, newLocationUrl);
@@ -800,25 +818,25 @@ final class JavaUrlRequest implements UrlRequest {
}
void onResponseStarted(UrlResponseInfo info) {
- if (mState.compareAndSet(State.STARTED, State.AWAITING_READ)) {
- execute(State.AWAITING_READ, new CheckedRunnable() {
- @Override
- public void run() throws Exception {
+ execute(new CheckedRunnable() {
+ @Override
+ public void run() throws Exception {
+ if (mState.compareAndSet(State.STARTED, State.AWAITING_READ)) {
mCallback.onResponseStarted(JavaUrlRequest.this, mUrlResponseInfo);
}
- });
- }
+ }
+ });
}
void onReadCompleted(final UrlResponseInfo info, final ByteBuffer byteBuffer) {
- if (mState.compareAndSet(State.READING, State.AWAITING_READ)) {
- execute(State.AWAITING_READ, new CheckedRunnable() {
- @Override
- public void run() throws Exception {
+ execute(new CheckedRunnable() {
+ @Override
+ public void run() throws Exception {
+ if (mState.compareAndSet(State.READING, State.AWAITING_READ)) {
mCallback.onReadCompleted(JavaUrlRequest.this, info, byteBuffer);
}
- });
- }
+ }
+ });
}
void onCanceled(final UrlResponseInfo info) {
« no previous file with comments | « no previous file | components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698