1
0
mirror of https://github.com/etesync/android synced 2025-01-23 14:10:54 +00:00

Cleanup and improve HttpExceptions.

This commit is contained in:
Tom Hacohen 2017-02-14 14:44:07 +00:00
parent ff5c5b5230
commit 44be896df7
4 changed files with 111 additions and 16 deletions

View File

@ -4,6 +4,7 @@ import org.apache.commons.codec.Charsets;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.logging.Level; import java.util.logging.Level;
import at.bitfire.davdroid.App; import at.bitfire.davdroid.App;
@ -36,10 +37,10 @@ abstract class BaseManager {
if (!response.isSuccessful()) { if (!response.isSuccessful()) {
switch (response.code()) { switch (response.code()) {
case 401: case HttpURLConnection.HTTP_UNAUTHORIZED:
throw new Exceptions.UnauthorizedException("Failed to connect"); throw new Exceptions.UnauthorizedException("Failed to connect");
default: default:
throw new Exceptions.HttpException("Error getting"); throw new Exceptions.HttpException(response);
} }
} }

View File

@ -1,5 +1,16 @@
package at.bitfire.davdroid.journalmanager; package at.bitfire.davdroid.journalmanager;
import java.io.IOException;
import java.io.Serializable;
import java.net.HttpURLConnection;
import at.bitfire.cert4android.Constants;
import okhttp3.Headers;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;
public class Exceptions { public class Exceptions {
public static class UnauthorizedException extends HttpException { public static class UnauthorizedException extends HttpException {
public UnauthorizedException(String message) { public UnauthorizedException(String message) {
@ -13,19 +24,103 @@ public class Exceptions {
} }
} }
public static class HttpException extends Exception {
public HttpException(String message) {
super(message);
}
public HttpException(int status, String message) {
super(status + " " + message);
}
}
public static class IntegrityException extends Exception { public static class IntegrityException extends Exception {
public IntegrityException(String message) { public IntegrityException(String message) {
super(message); super(message);
} }
} }
public static class HttpException extends Exception implements Serializable {
public final int status;
public final String message;
public final String request, response;
public HttpException(String message) {
super(message);
this.message = message;
this.status = -1;
this.request = this.response = null;
}
public HttpException(int status, String message) {
super(status + " " + message);
this.status = status;
this.message = message;
request = response = null;
}
public HttpException(Response response) {
super(response.code() + " " + response.message());
status = response.code();
message = response.message();
/* As we don't know the media type and character set of request and response body,
only printable ASCII characters will be shown in clear text. Other octets will
be shown as "[xx]" where xx is the hex value of the octet.
*/
// format request
Request request = response.request();
StringBuilder formatted = new StringBuilder();
formatted.append(request.method()).append(" ").append(request.url().encodedPath()).append("\n");
Headers headers = request.headers();
for (String name : headers.names()) {
for (String value : headers.values(name)) {
/* Redact authorization token. */
if (name.equals("Authorization")) {
formatted.append(name).append(": ").append("XXXXXX").append("\n");
} else {
formatted.append(name).append(": ").append(value).append("\n");
}
}
}
if (request.body() != null)
try {
formatted.append("\n");
Buffer buffer = new Buffer();
request.body().writeTo(buffer);
while (!buffer.exhausted())
appendByte(formatted, buffer.readByte());
} catch (IOException e) {
Constants.log.warning("Couldn't read request body");
}
this.request = formatted.toString();
// format response
formatted = new StringBuilder();
formatted.append(response.protocol()).append(" ").append(response.code()).append(" ").append(response.message()).append("\n");
headers = response.headers();
for (String name : headers.names())
for (String value : headers.values(name))
formatted.append(name).append(": ").append(value).append("\n");
if (response.body() != null) {
ResponseBody body = response.body();
try {
formatted.append("\n");
for (byte b : body.bytes())
appendByte(formatted, b);
} catch (IOException e) {
Constants.log.warning("Couldn't read response body");
}
body.close();
}
this.response = formatted.toString();
}
private static void appendByte(StringBuilder formatted, byte b) {
if (b == '\r')
formatted.append("[CR]");
else if (b == '\n')
formatted.append("[LF]\n");
else if (b >= 0x20 && b <= 0x7E) // printable ASCII
formatted.append((char) b);
else
formatted.append("[" + Integer.toHexString((int) b & 0xff) + "]");
}
}
} }

View File

@ -1,6 +1,7 @@
package at.bitfire.davdroid.journalmanager; package at.bitfire.davdroid.journalmanager;
import java.io.IOException; import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.logging.Level; import java.util.logging.Level;
import at.bitfire.davdroid.App; import at.bitfire.davdroid.App;
@ -44,10 +45,10 @@ public class JournalAuthenticator {
Response response = client.newCall(request).execute(); Response response = client.newCall(request).execute();
if (response.isSuccessful()) { if (response.isSuccessful()) {
return GsonHelper.gson.fromJson(response.body().charStream(), AuthResponse.class).token; return GsonHelper.gson.fromJson(response.body().charStream(), AuthResponse.class).token;
} else if (response.code() == 400) { } else if (response.code() == HttpURLConnection.HTTP_BAD_REQUEST) {
throw new Exceptions.UnauthorizedException("Username or password incorrect"); throw new Exceptions.UnauthorizedException("Username or password incorrect");
} else { } else {
throw new Exceptions.HttpException("Error authenticating"); throw new Exceptions.HttpException(response);
} }
} catch (IOException e) { } catch (IOException e) {
App.log.log(Level.SEVERE, "Couldn't download external resource", e); App.log.log(Level.SEVERE, "Couldn't download external resource", e);

View File

@ -181,13 +181,11 @@ public class DebugInfoActivity extends AppCompatActivity implements LoaderManage
report.append("Authority: ").append(authority).append("\n"); report.append("Authority: ").append(authority).append("\n");
if (throwable instanceof HttpException) { if (throwable instanceof HttpException) {
/* FIXME
HttpException http = (HttpException)throwable; HttpException http = (HttpException)throwable;
if (http.request != null) if (http.request != null)
report.append("\nHTTP REQUEST:\n").append(http.request).append("\n\n"); report.append("\nHTTP REQUEST:\n").append(http.request).append("\n\n");
if (http.response != null) if (http.response != null)
report.append("HTTP RESPONSE:\n").append(http.response).append("\n"); report.append("HTTP RESPONSE:\n").append(http.response).append("\n");
*/
} }
if (throwable != null) if (throwable != null)