Created
June 28, 2017 10:56
-
-
Save shibukawa/a8490e72cb320b4fd13ad2605f390b4b to your computer and use it in GitHub Desktop.
tokyo node gakuen #26
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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) | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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