构建HTTP响应标头

时间:2017-05-28 00:05:07

标签: java http httpresponse printstream

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

enter image description here

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是什么,显示的页面是“这个网站无法到达......”,但似乎我得到了200返回。

1 个答案:

答案 0 :(得分:0)

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

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");

如果我重新缩进并插入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",你会得到一个假的"普通"行添加到标题中。

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

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的自动缩进功能!)
  2. 你应该养成总是使用带有所有控制结构的花括号块的习惯。
  3. 重新发明轮子并不是一个好主意。除非你喜欢固定破碎的轮子。