Mein ursprünglicher Zweck war die HTTP Chunked Transfer zu verifizieren. Aber zufällig fand diese Inkonsistenz.Warum gibt Tomcat unterschiedliche Header für HEAD- und GET-Anfragen an meine RESTful-API zurück?
Die API wurde entwickelt, um eine Datei an den Client zurückzugeben. Ich benutze HEAD
und GET
Methoden dagegen. Verschiedene Header werden zurückgegeben.
Für GET
, erhalte ich diese Header: (Dies ist, was ich erwartet hatte.)
Für HEAD
ich diese Header erhalten:
Nach this thread , HEAD
und GET
SOLLTE geben identische Header zurück, aber nicht notwendigerweise.
Meine Frage ist:
Wenn Transfer-Encoding: chunked
verwendet wird weil die Datei dynamisch an den Client und Tomcat-Server zugeführt wird, kann nicht seine Größe vorher wissen, wie könnte Tomcat kennen die Content-Length
wenn HEAD
Methode ist benutzt? Ist Tomcat nur Dry-run der Handler und zählen alle Datei-Bytes? Warum gibt es nicht einfach den gleichen Transfer-Encoding: chunked
Header zurück?
Unten ist mein RESTful API implementiert mit Spring Web MVC:
@RestController
public class ChunkedTransferAPI {
@Autowired
ServletContext servletContext;
@RequestMapping(value = "bootfile.efi", method = { RequestMethod.GET, RequestMethod.HEAD })
public void doHttpBoot(HttpServletResponse response) {
String filename = "/bootfile.efi";
try {
ServletOutputStream output = response.getOutputStream();
InputStream input = servletContext.getResourceAsStream(filename);
BufferedInputStream bufferedInput = new BufferedInputStream(input);
int datum = bufferedInput.read();
while (datum != -1) {
output.write(datum);
datum = bufferedInput.read();
}
output.flush();
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ADD 1
In meinem Code habe ausdrücklich füge ich keine Header, muss es Tomcat dann sein Fügen Sie die Header Content-Length
und Transfer-Encoding
hinzu, wie es für richtig hält.
Also, was sind die Regeln für Tomcat zu entscheiden, welche Header zu senden?
ADD 2
Vielleicht ist es damit zusammen, wie Tomcat funktioniert. Ich hoffe, hier kann jemand etwas Licht werfen. Ansonsten werde ich in die Quelle von Tomcat 8 debuggen und das Ergebnis teilen. Aber das kann eine Weile dauern.
Verwandte: