Skip to content

Instantly share code, notes, and snippets.

@shibukawa
Created June 28, 2017 10:56
Show Gist options
  • Select an option

  • Save shibukawa/a8490e72cb320b4fd13ad2605f390b4b to your computer and use it in GitHub Desktop.

Select an option

Save shibukawa/a8490e72cb320b4fd13ad2605f390b4b to your computer and use it in GitHub Desktop.
tokyo node gakuen #26
package main
import (
"fmt"
"log"
"net/http"
"strings"
"time"
)
var indexHtmlHead = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="/sec2/sec2.js"></script>
<script src="/sec6/sec6.js"></script>
<script async src="/sec2/sec2_async.js"></script>
<script async src="/sec6/sec6_async.js"></script>
<script defer src="/sec2/sec2_defer.js"></script>
<script defer src="/sec6/sec6_defer.js"></script>
<link href="/sec2/sec2.css" rel="stylesheet">
<link href="/sec6/sec6.css" rel="stylesheet">
</head>
<body>
<div class="sec2">text1: (2秒後に読み込まれるCSSで装飾されるテキスト) </div>
<div class="sec6">text2: (6秒後に読み込まれるCSSで装飾されるテキスト) </div>
<div class="sec2_js">text3: (2秒後に読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_js">text4: (6秒後に読み込まれるJSで装飾されるテキスト) </div>
<div class="sec2_async_js">text5: (2秒後にasync読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_async_js">text6: (6秒後にasync読み込まれるJSで装飾されるテキスト) </div>
<div class="sec2_defer_js">text7: (2秒後にdefer読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_defer_js">text8: (6秒後にdefer読み込まれるJSで装飾されるテキスト) </div>
<div style="color: red;">続きのコンテンツは2秒後に送信されます。</div>
`
var indexHtmlTail = `
<div style="color: red;">続きのコンテンツ</div>
<div class="sec2">text1: (2秒後に読み込まれるCSSで装飾されるテキスト) </div>
<div class="sec6">text2: (6秒後に読み込まれるCSSで装飾されるテキスト) </div>
<div class="sec2_js">text3: (2秒後に読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_js">text4: (6秒後に読み込まれるJSで装飾されるテキスト) </div>
<div class="sec2_async_js">text5: (2秒後にasync読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_async_js">text6: (6秒後にasync読み込まれるJSで装飾されるテキスト) </div>
<div class="sec2_defer_js">text7: (2秒後にdefer読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_defer_js">text8: (6秒後にdefer読み込まれるJSで装飾されるテキスト) </div>
<div style="color: red;">読み込み完了</div>
</body>
</html>
`
var jsSource = `
console.log("script %s is loaded");
window.addEventListener('load', () => {
let elements = document.getElementsByClassName("%s_js");
for (let i = 0; i < elements.length; i++) {
elements[i].style.borderBottom = "dotted 3px orange";
}
});
`
var cssSource = `
.%s {
border-bottom: dotted 3px blue;
}
`
func handler(w http.ResponseWriter, r *http.Request) {
fragments := strings.Split(r.RequestURI, "/")
fileName := strings.Split(fragments[len(fragments)-1], ".")[0]
if strings.Contains(r.RequestURI, "/sec2") {
time.Sleep(2 * time.Second)
if strings.Contains(r.RequestURI, ".js") {
writeJavaScript(w, fileName)
} else {
writeStyleSheet(w, fileName)
}
} else if strings.Contains(r.RequestURI, "/sec6") {
time.Sleep(6 * time.Second)
if strings.HasSuffix(r.RequestURI, ".js") {
writeJavaScript(w, fileName)
} else {
writeStyleSheet(w, fileName)
}
} else {
writeHtml(w)
}
}
func writeHtml(w http.ResponseWriter) {
w.Header().Set("Content-Type", "text/html")
flusher, ok := w.(http.Flusher)
if !ok {
panic("can't get Flusher")
}
w.Write([]byte(indexHtmlHead))
flusher.Flush()
time.Sleep(4 * time.Second)
w.Write([]byte(indexHtmlTail))
flusher.Flush()
flusher.Flush()
}
func writeJavaScript(w http.ResponseWriter, fileName string) {
w.Header().Set("Content-Type", "application/javascript")
fmt.Fprintf(w, jsSource, fileName, fileName)
}
func writeStyleSheet(w http.ResponseWriter, fileName string) {
w.Header().Set("Content-Type", "text/css")
fmt.Fprintf(w, cssSource, fileName)
}
func main() {
http.HandleFunc("/", handler)
log.Println("start http listening :18443")
err := http.ListenAndServeTLS(":18443", "server.crt", "server.key", nil)
log.Println(err)
}
package main
import (
"fmt"
"log"
"net/http"
"strings"
"time"
)
var indexHtmlHead = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="/sec2/sec2.js"></script>
<script async src="/sec2/sec2_async.js"></script>
<script async src="/sec6/sec6_async.js"></script>
<script defer src="/sec2/sec2_defer.js"></script>
<script defer src="/sec6/sec6_defer.js"></script>
<link href="/sec2/sec2.css" rel="stylesheet">
</head>
<body>
<div class="sec2">text1: (2秒後に読み込まれるCSSで装飾されるテキスト) </div>
<div class="sec2_js">text3: (2秒後に読み込まれるJSで装飾されるテキスト) </div>
<div class="sec2_async_js">text5: (2秒後にasync読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_async_js">text6: (6秒後にasync読み込まれるJSで装飾されるテキスト) </div>
<div class="sec2_defer_js">text7: (2秒後にdefer読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_defer_js">text8: (6秒後にdefer読み込まれるJSで装飾されるテキスト) </div>
<div style="color: red;">続きのコンテンツは2秒後に送信されます。</div>
`
var indexHtmlTail = `
<div style="color: red;">続きのコンテンツ</div>
<div class="sec2">text1: (2秒後に読み込まれるCSSで装飾されるテキスト) </div>
<div class="sec2_js">text3: (2秒後に読み込まれるJSで装飾されるテキスト) </div>
<div class="sec2_async_js">text5: (2秒後にasync読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_async_js">text6: (6秒後にasync読み込まれるJSで装飾されるテキスト) </div>
<div class="sec2_defer_js">text7: (2秒後にdefer読み込まれるJSで装飾されるテキスト) </div>
<div class="sec6_defer_js">text8: (6秒後にdefer読み込まれるJSで装飾されるテキスト) </div>
<div style="color: red;">読み込み完了</div>
</body>
</html>
`
var jsSource = `
console.log("script %s is loaded");
window.addEventListener('load', () => {
let elements = document.getElementsByClassName("%s_js");
for (let i = 0; i < elements.length; i++) {
elements[i].style.borderBottom = "dotted 3px orange";
}
});
`
var cssSource = `
.%s {
border-bottom: dotted 3px blue;
}
`
func handler(w http.ResponseWriter, r *http.Request) {
fragments := strings.Split(r.RequestURI, "/")
fileName := strings.Split(fragments[len(fragments)-1], ".")[0]
if strings.Contains(r.RequestURI, "/sec2") {
time.Sleep(2 * time.Second)
if strings.Contains(r.RequestURI, ".js") {
writeJavaScript(w, fileName)
} else {
writeStyleSheet(w, fileName)
}
} else if strings.Contains(r.RequestURI, "/sec6") {
time.Sleep(6 * time.Second)
if strings.HasSuffix(r.RequestURI, ".js") {
writeJavaScript(w, fileName)
} else {
writeStyleSheet(w, fileName)
}
} else {
writeHtml(w)
}
}
func writeHtml(w http.ResponseWriter) {
w.Header().Set("Content-Type", "text/html")
flusher, ok := w.(http.Flusher)
if !ok {
panic("can't get Flusher")
}
w.Write([]byte(indexHtmlHead))
flusher.Flush()
time.Sleep(4 * time.Second)
w.Write([]byte(indexHtmlTail))
flusher.Flush()
flusher.Flush()
}
func writeJavaScript(w http.ResponseWriter, fileName string) {
w.Header().Set("Content-Type", "application/javascript")
fmt.Fprintf(w, jsSource, fileName, fileName)
}
func writeStyleSheet(w http.ResponseWriter, fileName string) {
w.Header().Set("Content-Type", "text/css")
fmt.Fprintf(w, cssSource, fileName)
}
func main() {
http.HandleFunc("/", handler)
log.Println("start http listening :18443")
err := http.ListenAndServeTLS(":18443", "server.crt", "server.key", nil)
log.Println(err)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment