use of POGOProtos.Networking.Envelopes.ResponseEnvelopeOuterClass.ResponseEnvelope.PlatformResponse in project PokeGOAPI-Java by Grover-c13.
the class RequestHandler method sendInternal.
/**
* Sends an already built request envelope
*
* @param serverResponse the response to append to
* @param requests list of ServerRequests to be sent
* @param platformRequests list of ServerPlatformRequests to be sent
* @param builder the request envelope builder
* @throws RequestFailedException if this message fails to send
*/
private ServerResponse sendInternal(ServerResponse serverResponse, ServerRequest[] requests, ServerPlatformRequest[] platformRequests, RequestEnvelope.Builder builder) throws RequestFailedException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
RequestEnvelope request = builder.build();
try {
request.writeTo(stream);
} catch (IOException e) {
Log.wtf(TAG, "Failed to write request to bytearray ouput stream. This should never happen", e);
}
RequestBody body = RequestBody.create(null, stream.toByteArray());
okhttp3.Request httpRequest = new okhttp3.Request.Builder().url(apiEndpoint).post(body).build();
try (Response response = client.newCall(httpRequest).execute()) {
if (response.code() != 200) {
throw new RequestFailedException("Got a unexpected http code : " + response.code());
}
ResponseEnvelope responseEnvelop;
try (InputStream content = response.body().byteStream()) {
responseEnvelop = ResponseEnvelope.parseFrom(content);
} catch (IOException e) {
// retrieved garbage from the server
throw new RequestFailedException("Received malformed response : " + e);
}
if (responseEnvelop.getApiUrl() != null && responseEnvelop.getApiUrl().length() > 0) {
apiEndpoint = "https://" + responseEnvelop.getApiUrl() + "/rpc";
}
if (responseEnvelop.hasAuthTicket()) {
this.authTicket = responseEnvelop.getAuthTicket();
}
boolean empty = false;
StatusCode statusCode = responseEnvelop.getStatusCode();
if (statusCode != StatusCode.REDIRECT && statusCode != StatusCode.INVALID_AUTH_TOKEN) {
for (int i = 0; i < responseEnvelop.getReturnsCount(); i++) {
ByteString returned = responseEnvelop.getReturns(i);
ServerRequest serverRequest = requests[i];
if (returned != null) {
serverResponse.addResponse(serverRequest.getType(), returned);
if (serverRequest.getType() == RequestType.GET_PLAYER) {
if (GetPlayerResponse.parseFrom(returned).getBanned()) {
throw new BannedException("Cannot send request, your account has been banned!");
}
}
} else {
empty = true;
}
}
}
for (int i = 0; i < responseEnvelop.getPlatformReturnsCount(); i++) {
PlatformResponse platformResponse = responseEnvelop.getPlatformReturns(i);
ByteString returned = platformResponse.getResponse();
if (returned != null) {
serverResponse.addResponse(platformResponse.getType(), returned);
}
}
if (statusCode != StatusCode.OK && statusCode != StatusCode.OK_RPC_URL_IN_RESPONSE) {
if (statusCode == StatusCode.INVALID_AUTH_TOKEN) {
try {
authTicket = null;
api.getAuthInfo(true);
return sendInternal(serverResponse, requests, platformRequests);
} catch (LoginFailedException | InvalidCredentialsException e) {
throw new RequestFailedException("Failed to refresh auth token!", e);
} catch (RequestFailedException e) {
throw new RequestFailedException("Failed to send request with refreshed auth token!", e);
}
} else if (statusCode == StatusCode.REDIRECT) {
// API_ENDPOINT was not correctly set, should be at this point, though, so redo the request
return sendInternal(serverResponse, requests, platformRequests, builder);
} else if (statusCode == StatusCode.BAD_REQUEST) {
if (api.getPlayerProfile().isBanned()) {
throw new BannedException("Cannot send request, your account has been banned!");
} else {
throw new BadRequestException("A bad request was sent!");
}
} else {
throw new RequestFailedException("Failed to send request: " + statusCode);
}
}
if (empty) {
throw new RequestFailedException("Received empty response from server!");
}
} catch (IOException e) {
throw new RequestFailedException(e);
} catch (RequestFailedException e) {
throw e;
}
return serverResponse;
}
Aggregations