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  }