0

How do I wait for a my server to be updated? I am setting up my HttpServer and can get a response from my own status I pass in to the createContext handle with my GET method, but when I need to wait for the user (me) to click the Spotify auth link to redirect back to my server -

java.util.concurrent.ExecutionException: java.io.IOException: HTTP/1.1 header parser received no bytes

If I manually set the header String my GET will return the body fine. I've tried serverSocket and CompleteableFuture async(request, HttpResponse.BodyHandlers.ofString() ( from https://openjdk.java.net/groups/net/httpclient/recipes.html#asynchronousGet ) and still get the above exception.

In Chrome when I open http://localhost:8080 the Spotify code is there.

I'm thinking I need to loop the client.send(request, HttpResponse.BodyHandleers.ofString() until the server status code is updated, or set a wait time?

Here is the time I've been testing.

public static void startHttpServer() {
        try {

        server = HttpServer.create();
        server.bind(new InetSocketAddress(8080), 0);
        server.createContext("/", new HttpHandler() {
            @Override
            public void handle(HttpExchange exchange) throws IOException {
                String query = /*"hey buddy, this is a Java server, wouldn't you know"; */exchange.getRequestURI().getQuery();
                exchange.sendResponseHeaders(200, query.length());
                exchange.getResponseBody().write(query.getBytes());
                exchange.getResponseBody().close();
            }
        });
        server.start();
        System.out.println("*** Started server ***");
        System.out.println("Use this link to request the access code:");
        System.out.println("https://accounts.spotify.com/authorize?client_id=6edb9b1ac21042abacc6daaf0fbc4c4d&redirect_uri=http://localhost:8080&response_type=code");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

/*public static void getResponse() { // get the response from the server?!
    try {
        HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(15)).build();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("http://localhost:8080"))
                .GET()
                .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    } finally {
        server.stop(1);
    }
}*/

public static CompletableFuture<String> get() {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://localhost:8080"))
            .GET()
            .build();
    return client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::body);
}

I am following a Hyperskill.org project. This is how the code should behave when this stage is complete.

> new
Please, provide access for application.
> auth
use this link to request the access code:
https://accounts.spotify.com/authorize?client_id=a19ee7dbfda443b2a8150c9101bfd645&redirect_uri=http://localhost:8080&response_type=code
waiting for code...
code received
making http request for access_token...
response:
{"access_token":"BQBSZ0CA3KR0cf0LxmiNK_E87ZqnkJKDD89VOWAZ9f0QXJcsCiHtl5Om-EVhkIfwt1AZs5WeXgfEF69e4JxL3YX6IIW9zl9WegTmgLkb4xLXWwhryty488CLoL2SM9VIY6HaHgxYxdmRFGWSzrgH3dEqcvPoLpd26D8Y","token_type":"Bearer","expires_in":3600,"refresh_token":"AQCSmdQsvsvpneadsdq1brfKlbEWleTE3nprDwPbZgNSge5dVe_svYBG-RG-_PxIGxVvA7gSnehFJjDRAczLDbbdWPjW1yUq2gtKbbNrCQVAH5ZBtY8wAYskmOIW7zn3IEiBzg","scope":""}
---SUCCESS---
> new
---NEW RELEASES---
Mountains [Sia, Diplo, Labrinth]
Runaway [Lil Peep]
The Greatest Show [Panic! At The Disco]
All Out Life [Slipknot]
> exit
---GOODBYE!---
daniel
  • 2,665
  • 1
  • 8
  • 18
SimonA
  • 135
  • 2
  • 16
  • 1
    Make sure not to close the server until after the response has been received - that is until after the `CompletableFuture` returned by your method has completed. I can't say whether that's the issue but I have a suspicion. – daniel Apr 14 '20 at 14:33

1 Answers1

1

I have just passed this stage and was having the same error, the problem is the errors that can lead to this error message are not really that specific as it seems. For me it was because of null values coming from "exchange.getRequestURI().getQuery()" i was calling .startsWith("code'") over this potential null value resulting in never sending a response and then the "HTTP/1.1 header parser received no bytes". You might be expecting the program to crash and get a different error message at console, but the server run in a different thread from the main, so the server thread crashes not the main.