github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/igm/sockjs-go.v2/sockjs/htmlfile.gon-place (about) 1 package sockjs 2 3 import ( 4 "fmt" 5 "io" 6 "net/http" 7 "strings" 8 ) 9 10 var iframeTemplate = `<!doctype html> 11 <html><head> 12 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 13 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 14 </head><body><h2>Don't panic!</h2> 15 <script> 16 document.domain = document.domain; 17 var c = parent.%s; 18 c.start(); 19 function p(d) {c.message(d);}; 20 window.onload = function() {c.stop();}; 21 </script> 22 ` 23 24 func init() { 25 iframeTemplate += strings.Repeat(" ", 1024-len(iframeTemplate)+14) 26 iframeTemplate += "\r\n\r\n" 27 } 28 29 func (h *handler) htmlFile(rw http.ResponseWriter, req *http.Request) { 30 rw.Header().Set("content-type", "text/html; charset=UTF-8") 31 32 req.ParseForm() 33 callback := req.Form.Get("c") 34 if callback == "" { 35 http.Error(rw, `"callback" parameter required`, http.StatusInternalServerError) 36 return 37 } 38 rw.WriteHeader(http.StatusOK) 39 fmt.Fprintf(rw, iframeTemplate, callback) 40 rw.(http.Flusher).Flush() 41 sess, _ := h.sessionByRequest(req) 42 recv := newHTTPReceiver(rw, h.options.ResponseLimit, new(htmlfileFrameWriter)) 43 if err := sess.attachReceiver(recv); err != nil { 44 recv.sendFrame(cFrame) 45 recv.close() 46 return 47 } 48 select { 49 case <-recv.doneNotify(): 50 case <-recv.interruptedNotify(): 51 } 52 } 53 54 type htmlfileFrameWriter struct{} 55 56 func (*htmlfileFrameWriter) write(w io.Writer, frame string) (int, error) { 57 return fmt.Fprintf(w, "<script>\np(%s);\n</script>\r\n", quote(frame)) 58 }