构建 HTTP 响应 Header

Building an HTTP Response Header

正在尝试从头开始构建 Web 服务器。它适用于 html 和其他纯文本文件。在 Firefox 和 Chrome 中测试。但是我很难让图像正确显示。返回状态 200,在 Firefox 中,我根据请求获得了附加图像。除了响应 header,我是否需要使用打印流以不同方式处理图像文件类型?

FileInputStream fileIn = new FileInputStream("test/" +
                file);

// split specified file path
String[] pathTokens = tokens[1].split("/|\.");
String fileExt = pathTokens[tokens.length - 1];

// build response
out.println("HTTP/1.1 200 OK");
if(fileExt.equals("jpg") || fileExt.equals("jpeg") ||fileExt.equals("png") || 
   fileExt.equals("ico"))
  out.println("Content type: image/" + fileExt);
else
  out.print("Content type: text/");
if(fileExt.equals("html"))
  out.println(fileExt);
else
  out.println("plain");

long size = fileIn.getChannel().size();

out.println("Content-Length: " + Long.toString(size));
out.println("Connect: Close");
out.println("");

int read = 0;
byte[] buffer = new byte[1024];

while ((read = fileIn.read(buffer)) != -1){
  out.write(buffer, 0, read);
}

如果需要任何进一步的信息,请索取。我非常愿意提供任何其他详细信息,或回答我能回答的任何问题。

编辑:经过进一步检查,我实际上在 Firefox 中得到了 404,我不太确定 Chrome 是什么,显示的页面是 "This site cannot be reached...",但看起来我是得到 200 返回。

我想我可以看到一个错误:

if(fileExt.equals("jpg") || fileExt.equals("jpeg") ||fileExt.equals("png") || 
   fileExt.equals("ico"))
  out.println("Content type: image/" + fileExt);
else
  out.print("Content type: text/");
if(fileExt.equals("html"))
  out.println(fileExt);
else
  out.println("plain");

如果我 re-indent 并在 Java 编译器认为应该插入的位置插入 {}。

if (fileExt.equals("jpg") || fileExt.equals("jpeg") || 
    fileExt.equals("png") || fileExt.equals("ico")) {
    out.println("Content type: image/" + fileExt);
} else {
    out.print("Content type: text/");
}
if (fileExt.equals("html")) {
    out.println(fileExt);
} else {
    out.println("plain");
}

看到问题了吗?如果扩展名是(比如)"jpg",您将在 header.

中添加一个虚假的 "plain" 行

我认为你实际上打算写这个:

if (fileExt.equals("jpg") || fileExt.equals("jpeg") || 
    fileExt.equals("png") || fileExt.equals("ico")) {
    out.println("Content type: image/" + fileExt);
} else {
    out.print("Content type: text/");
    if (fileExt.equals("html")) {
        out.println(fileExt);
    } else {
        out.println("plain");
    }
}

这说明:

  1. 让您的代码缩进与代码 实际 所说相符的重要性。 (提示:使用您的 IDE 的 auto-indentation 功能!)
  2. 您应该养成在所有控制结构中始终使用花括号块的习惯。
  3. 重新发明轮子不是一个好主意。除非你喜欢修理坏掉的轮子。