Skip to content

Instantly share code, notes, and snippets.

@rikuTanide
Created April 29, 2019 12:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rikuTanide/e2937b1e5eb3e76860e18d3b37668bbd to your computer and use it in GitHub Desktop.
Save rikuTanide/e2937b1e5eb3e76860e18d3b37668bbd to your computer and use it in GitHub Desktop.
二つのdefer scriptがあり、二個目のscriptタグが先に届く
#!/usr/bin/env ruby
require "socket"
require 'thwait'
server = TCPServer.open(3000)
htmlsoc = server.accept
threads = []
# htmlを返すソケット
threads << Thread.new do
while recv = htmlsoc.readline
p recv
break if recv == "\r\n"
end
body = <<EOS
<!DOCTYPE html>
<title>hello world</title>
<h1>hello</h1>
<script defer src=script1.js></script>
<script defer src=script2.js></script>
EOS
header = <<EOS
HTTP/1.1 200 OK\r
Content-Type: text/html; charset=utf-8\r
Content-Length: #{body.bytesize}\r
\r
EOS
p htmlsoc.write(header)
p htmlsoc.write(body)
htmlsoc.close
end
# jsリクエスト1
# 先にリクエストが届き、後からレスポンスする
defer1soc = server.accept
threads << Thread.new do
while recv = defer1soc.readline
p recv
break if recv == "\r\n"
end
sleep(2)
body = <<EOS
const div1 = document.createElement("div");
div1.textContent = "defer1.js";
document.body.append(div1);
EOS
header = <<EOS
HTTP/1.1 200 OK\r
Content-Type: application/javascript; charset=utf-8\r
Content-Length: #{body.bytesize}\r
\r
EOS
p defer1soc.write(header)
p defer1soc.write(body)
defer1soc.close
end
# jsリクエスト2
# 後からリクエストが来て、先にレスポンスする
defer2soc = server.accept
threads << Thread.new do
while recv = defer2soc.readline
p recv
break if recv == "\r\n"
end
body = <<EOS
const div2 = document.createElement("div");
div2.textContent = "defer2.js";
document.body.append(div2);
EOS
header = <<EOS
HTTP/1.1 200 OK\r
Content-Type: application/javascript; charset=utf-8\r
Content-Length: #{body.bytesize}\r
\r
EOS
p defer2soc.write(header)
p defer2soc.write(body)
defer2soc.close
end
thall = ThreadsWait.new(*threads)
thall.all_waits{|th|
printf("end %s\n", th.inspect)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment