HTTP/1.1 header parser received no bytes

8u3631984

Bekanntes Mitglied
Hallo ich habe einen Spring Server "Server" der folgende Component beinhaltet :
Java:
    @GetMapping(value = "/matches", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<MatchData> getMatches() {
        var headers = new HttpHeaders();
        headers.add("Responded", "MyController");

        return ResponseEntity.accepted().headers(headers).body(MatchData.builder().build());
    }

Ich rufe die Daten über einen HTTP Client ab :
Java:
    public HttpResponse<String> getSamsMatchData() throws IOException, InterruptedException {
        HttpClient httpClient = createHTTPClient();

        String url = calendarServerURL + "/matches";
        log.info("{}", url);

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();

        return httpClient.send(request, HttpResponse.BodyHandlers.ofString());
    }

    private HttpClient createHTTPClient() {
        log.info("init http client");

        return HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)
                .connectTimeout(Duration.ofSeconds(10))
                .build();
    }

Ich bekomme nun aber immer folgenden Fehler :
HTTP/1.1 header parser received no bytes

Kann mir jemand auf die Sprünge helfen ?
 

8u3631984

Bekanntes Mitglied
curl liefert das :
Java:
 curl localhost:49170/matches
{"matchDateTime":null,"matchNumber":null,"associationName":null,"seasonStartYear":null,"seasonEndYear":null,"competitionName":null,"firstClubName":null,"firstTeamName":null,"secondClubName":null,"secondTeamName":null,"setPointsFirstTeam":null,"setPointsSecondTeam":null,"teamIndex":"NONE","clubName":null,"teamName":null}
 

8u3631984

Bekanntes Mitglied
curl -I localhost:49170/matches
HTTP/1.1 202
Responded: MyController
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 12 Jul 2021 10:56:48 GMT
 

8u3631984

Bekanntes Mitglied
Sieht schon mal gut aus. Funktioniert es, wenn Du

weglässt?
Das macht leider keinen Unterschied - auch wenn ich HTTP_1_1 verwende.
Ich habe nun versucht einen async zu verwenden . Aber wenn ich auf das Futurezugreifen will (Response ) kommt der gleiche Fehler :
Java:
    public CompletableFuture<HttpResponse<String>> getSamsMatchData() {
        HttpClient httpClient = createHTTPClient();

        String url = calendarServerURL + "/matches";
        log.info("{}", url);

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();

        return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());
    }

So greife ich auf das Ergebnis zu :
Java:
        Client client = new Client("http://localhost:" + calenderServer.getMappedPort(8080));
        CompletableFuture<HttpResponse<String>> response = client.getSamsMatchData();
        response.get();
 

mihe7

Top Contributor
Keine Ahnung, es kann auch sein, dass einfach ein Leerzeichen nach 202 kommt und damit der Grund einfach eine leere Zeichenfolge ist. Mir ist das vorhin nur aufgefallen.

Mal schauen, vielleicht kann ich das nachher mal kurz nachstellen.
 

mihe7

Top Contributor
Also, mal SpringBoot aufgesetzt (das Greeting-Beispiel).

Controller:
Java:
@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @GetMapping(value="/greeting", produces=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Greeting> greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        HttpHeaders headers = new HttpHeaders();
        headers.add("Responded", "GreetingController");

        return ResponseEntity.accepted().headers(headers).body(
            new Greeting(counter.incrementAndGet(), String.format(template, name))
        );
    }
}

Die Greeting-Klasse ist uninteressant, der Vollständigkeit halber:
Java:
package com.example.restservice;

public class Greeting {

    private final long id;
    private final String content;

    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }

Testklasse:
Java:
import java.net.*;
import java.net.http.*;

public class Test {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)
                .build();
        HttpRequest req = HttpRequest.newBuilder()
                .uri(URI.create("http://localhost:8080/greeting"))
                .build();
        System.out.println(client.send(req, HttpResponse.BodyHandlers.ofString()));
    }
}


Curl:
Code:
HTTP/1.1 202 
Responded: GreetingController
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 12 Jul 2021 15:08:15 GMT

{"id":2,"content":"Hello, World!"}

Ausführen der Testklasse:
Code:
(GET http://localhost:8080/greeting) 202

Also, alles wunderbar. SpringBoot 2.4.3, JDK 16.
 

8u3631984

Bekanntes Mitglied
Hallo und vielen Dank für deine Antwort.
Ich konnte das Problem eingrenzen. Ich starte den Server in einem Docker Container.
Dannn bekomme ich den Fehler.

Starte ich den Server lokal - also aus der IDE und rufe dann den Request ab funktioniert es
 

mihe7

Top Contributor
Der Container dürfte nicht das Problem darstellen. Die calendarServiceURL hast Du angepasst? Ich sehe oben im Code was von Port 8080, in curl 49170...
 

8u3631984

Bekanntes Mitglied
Ich habe den Fehler gefunden : Ich habe den Server Container ohne exposed Ports gestartet:

Java:
        return new GenericContainer("calendar-server:1.0.0-SNAPSHOT")
                .withNetwork(volleyballNetwork)
                .withExposedPorts(8080) // diese Zeile hat gefehlt

Danach geht es. Oh man vielen vielen Dank für die Unterstützung
 

Ähnliche Java Themen

Neue Themen


Oben