Skip to content
Snippets Groups Projects
Commit 0ef328d0 authored by Sander Østrem Fagernes's avatar Sander Østrem Fagernes
Browse files

Resolve "Fix nullpointer from http status code -1"

parent 7271a8e6
No related branches found
No related tags found
1 merge request!50Resolve "Fix nullpointer from http status code -1"
......@@ -2,14 +2,22 @@ package com.game.tankwars;
import com.badlogic.gdx.Net;
/**
* This interface defines two methods to handle the different responses from an HTTP request
*/
public interface Callback {
// This interface defines two methods to handle the different responses from an HTTP request
// Method to handle a successful response
// Takes a String parameter containing the response body
void onResult(Net.HttpResponse result);
/**
* Method to handle a successful response
* @param result the response body
* @return true if response was accepted
* false if the request should be resent
*/
boolean onResult(Net.HttpResponse result);
// Method to handle a failed response
// Takes a Throwable parameter containing the exception that caused the failure
/**
* Method to handle a failed response
* @param t Throwable containing the exception that caused the failure
*/
void onFailed(Throwable t);
}
\ No newline at end of file
......@@ -11,11 +11,6 @@ import com.badlogic.gdx.Net.HttpResponse;
* a few times with increasing backoff time between resends.
*/
public class HTTPRequestHandler implements Net.HttpResponseListener {
public static final String PROTOCOL = "http";
public static final String HOST = "localhost";
public static final int PORT = 3000;
private final Callback callback;
private final Net.HttpRequest request;
private int attempts = 0;
......@@ -34,6 +29,7 @@ public class HTTPRequestHandler implements Net.HttpResponseListener {
Gdx.net.sendHttpRequest(request, this);
}
/**
* Request was successful and response received. Passes response body
* to callback.
......@@ -41,7 +37,9 @@ public class HTTPRequestHandler implements Net.HttpResponseListener {
* @param httpResponse The {@link HttpResponse} with the HTTP response values.
*/
public void handleHttpResponse(HttpResponse httpResponse) {
callback.onResult(httpResponse);
if (!callback.onResult(httpResponse))
failed(new Throwable("Response returned with status code " +
httpResponse.getStatus().getStatusCode()));
}
/**
......@@ -57,12 +55,13 @@ public class HTTPRequestHandler implements Net.HttpResponseListener {
try {
Thread.sleep((long) attempts * BACKOFF_TIME);
sendRequest();
return;
} catch(InterruptedException e) {
System.err.println(e.getMessage());
}
} else {
callback.onFailed(t);
}
callback.onFailed(t);
}
/**
......
......@@ -199,7 +199,9 @@ public class FindGameController {
new HTTPRequestHandler(new Callback() {
@Override
public void onResult(Net.HttpResponse response) {
public boolean onResult(Net.HttpResponse response) {
if (response.getStatus().getStatusCode() == -1) return false;
HttpStatus status = response.getStatus();
if (status.getStatusCode() == HttpStatus.SC_CREATED ||
......@@ -211,10 +213,9 @@ public class FindGameController {
screen.showWaitingWindow();
checkLobbyStatus();
} else {
System.err.println("Join lobby request failed with status code " +
status.getStatusCode());
return true;
}
return false;
}
@Override
......@@ -241,23 +242,27 @@ public class FindGameController {
new HTTPRequestHandler(new Callback() {
@Override
public void onResult(Net.HttpResponse response) {
public boolean onResult(Net.HttpResponse response) {
if (response.getStatus().getStatusCode() == -1) return false;
HttpStatus status = response.getStatus();
if (status.getStatusCode() == HttpStatus.SC_OK && !response.getResultAsString().isEmpty()) {
CurrentUser.getCurrentUser().setGameId(response.getResultAsString());
Gdx.app.postRunnable(gameScreenTransition);
} else {
System.out.println("Awaiting opponent...");
try {
Thread.sleep(1500);
if (lobbyId != null) checkLobbyStatus();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
exitLobby();
}
return true;
}
System.out.println("Awaiting opponent...");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
if (lobbyId != null) checkLobbyStatus();
return true;
}
@Override
......@@ -282,22 +287,20 @@ public class FindGameController {
new HTTPRequestHandler(new Callback() {
@Override
public void onResult(Net.HttpResponse response) {
public boolean onResult(Net.HttpResponse response) {
if (response.getStatus().getStatusCode() == -1) return false;
removeWaitingWindowListeners();
setMainListeners();
lobbyId = null;
screen.hideWaitingWindow();
return true;
}
@Override
public void onFailed(Throwable t) {
System.err.println("Exit lobby request failed:\n" + t);
removeWaitingWindowListeners();
setMainListeners();
lobbyId = null;
screen.hideWaitingWindow();
}
}, new HttpRequestBuilder()
.newRequest()
......
......@@ -48,12 +48,15 @@ public class LeaderboardController {
new HTTPRequestHandler(
new Callback() {
@Override
public void onResult(Net.HttpResponse response) {
public boolean onResult(Net.HttpResponse response) {
if (response.getStatus().getStatusCode() == -1) return false;
Json json = new Json();
// Convert the response body to an Array of User objects using the Json instance
Array<User> leaderboardUsers = json.fromJson(Array.class, User.class, response.getResultAsString());
screen.setLeaderBoard(leaderboardUsers);
return true;
}
@Override
......
......@@ -60,7 +60,7 @@ public class LoginController {
loginButton.addListener(new InputListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
handleInput(usernameField.getText());
fetchUser(usernameField.getText());
return true;
}
});
......@@ -97,18 +97,17 @@ public class LoginController {
});
}
public void handleInput(String username) {
fetchUser(username);
}
public void fetchUser(final String username) {
new HTTPRequestHandler(new Callback() {
@Override
public void onResult(Net.HttpResponse response) {
public boolean onResult(Net.HttpResponse response) {
if (response.getStatus().getStatusCode() == -1) return false;
Json json = new Json();
User user = json.fromJson(User.class, response.getResultAsString());
currentUser.setUser(user);
Gdx.app.postRunnable(mainMenuScreenTransition);
return true;
}
@Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment