github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/igm/sockjs-go.v2/sockjs/jsonp.go (about) 1 package sockjs 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "net/http" 8 "strings" 9 ) 10 11 func (h *handler) jsonp(rw http.ResponseWriter, req *http.Request) { 12 rw.Header().Set("content-type", "application/javascript; charset=UTF-8") 13 14 req.ParseForm() 15 callback := req.Form.Get("c") 16 if callback == "" { 17 http.Error(rw, `"callback" parameter required`, http.StatusInternalServerError) 18 return 19 } 20 rw.WriteHeader(http.StatusOK) 21 rw.(http.Flusher).Flush() 22 23 sess, _ := h.sessionByRequest(req) 24 recv := newHTTPReceiver(rw, 1, &jsonpFrameWriter{callback}) 25 if err := sess.attachReceiver(recv); err != nil { 26 recv.sendFrame(cFrame) 27 recv.close() 28 return 29 } 30 select { 31 case <-recv.doneNotify(): 32 case <-recv.interruptedNotify(): 33 } 34 } 35 36 func (h *handler) jsonpSend(rw http.ResponseWriter, req *http.Request) { 37 req.ParseForm() 38 var data io.Reader 39 data = req.Body 40 41 formReader := strings.NewReader(req.PostFormValue("d")) 42 if formReader.Len() != 0 { 43 data = formReader 44 } 45 if data == nil { 46 http.Error(rw, "Payload expected.", http.StatusInternalServerError) 47 return 48 } 49 var messages []string 50 err := json.NewDecoder(data).Decode(&messages) 51 if err == io.EOF { 52 http.Error(rw, "Payload expected.", http.StatusInternalServerError) 53 return 54 } 55 if err != nil { 56 http.Error(rw, "Broken JSON encoding.", http.StatusInternalServerError) 57 return 58 } 59 sessionID, _ := h.parseSessionID(req.URL) 60 if sess, ok := h.sessions[sessionID]; !ok { 61 http.NotFound(rw, req) 62 } else { 63 _ = sess.accept(messages...) // TODO(igm) reponse with http.StatusInternalServerError in case of err? 64 rw.Header().Set("content-type", "text/plain; charset=UTF-8") 65 rw.Write([]byte("ok")) 66 } 67 } 68 69 type jsonpFrameWriter struct { 70 callback string 71 } 72 73 func (j *jsonpFrameWriter) write(w io.Writer, frame string) (int, error) { 74 return fmt.Fprintf(w, "%s(%s);\r\n", j.callback, quote(frame)) 75 }