基本的Ruby http服务器在win7上没有向localhost显示.jpg?

时间:2016-09-22 10:25:47

标签: ruby http windows-7 localhost

这个http脚本在我的Unntu上的gnome-terminal(以及Mac上的Aleksey)上运行得很好,但是在win7上,一个小方块被加载到chrome浏览器中。我需要做什么才能通过本地主机发送JPEG,以便在win7浏览器中显示?根据Per Holger的评论,我需要解决内容编码问题,但到目前为止我所尝试的所有内容在win7上没有任何区别(并且在没有任何明确内容编码的情况下仍可在Ubuntu中正常加载)。 ?

PS C:\Users\user_name\Ruby\http_test> ls
basic_http.rb
lolcat.jpg
PS C:\Users\user_name\Ruby\http_test> ruby basic_http.rb

# very basic http server

require 'socket'

def send_200(socket, content)
  socket.puts "HTTP/1.1 200 OK\r\n\r\n#{content}" # <-- Correct? (Per Holger)
  socket.close
end

server = TCPServer.new 2016

loop do
  Thread.start(server.accept) do |client|
  request = client.gets
  if request.start_with?("GET")
      url = request.split(" ")[1]
      if url.start_with?("/images/")
        file = url.sub("/images/", "")
        picture = File.read(file)  # <-- initially Aleksey pointed out
        send_200(client, picture)  # <-- a variable name mismatch here
      else                         #     pictures/picture...      heh.
        send_200(client, "hello!")
      end
    end
  end
end

FWIW:Ruby 2.2,win7&amp;与此demo一起编码。

enter image description here

2 个答案:

答案 0 :(得分:1)

你的变量名只有一个拼写错误 您将文件读取到pictures

pictures = File.read(file)

但您将其发送为picture

send_200(client, picture)

所以你只需要编辑变量名。

将请求处理包装到begin块中可能是个好主意。

Thread.start(server.accept) do |client|
  begin
    ...
  rescue => ex
    puts ex
  end
end

通过这种方式,您可以查看是否出现问题。

答案 1 :(得分:0)

要在win7系统上将jpeg加载到浏览器中,File.read命令需要显式地解决二进制内容编码,例如: File.binread("foo.bar") 每个:
https://ruby-doc.org/core-2.1.0/IO.html#method-c-binread

  if url.start_with?("/images/")
    file = url.sub("/images/", "")
    picture = File.binread(file)    # <-- Thank you Holger & Aleksey!!!
    send_200(client, picture)

感谢Aleksey和Holger!