用户登录和接口鉴权
This commit is contained in:
42
vendor/github.com/gin-contrib/sse/README.md
generated
vendored
42
vendor/github.com/gin-contrib/sse/README.md
generated
vendored
@@ -1,7 +1,7 @@
|
||||
# Server-Sent Events
|
||||
|
||||
[](https://pkg.go.dev/github.com/gin-contrib/sse)
|
||||
[](https://github.com/gin-contrib/sse/actions/workflows/go.yml)
|
||||
[](https://godoc.org/github.com/gin-contrib/sse)
|
||||
[](https://travis-ci.org/gin-contrib/sse)
|
||||
[](https://codecov.io/gh/gin-contrib/sse)
|
||||
[](https://goreportcard.com/report/github.com/gin-contrib/sse)
|
||||
|
||||
@@ -16,33 +16,32 @@ Server-sent events (SSE) is a technology where a browser receives automatic upda
|
||||
import "github.com/gin-contrib/sse"
|
||||
|
||||
func httpHandler(w http.ResponseWriter, req *http.Request) {
|
||||
// data can be a primitive like a string, an integer or a float
|
||||
sse.Encode(w, sse.Event{
|
||||
Event: "message",
|
||||
Data: "some data\nmore data",
|
||||
})
|
||||
// data can be a primitive like a string, an integer or a float
|
||||
sse.Encode(w, sse.Event{
|
||||
Event: "message",
|
||||
Data: "some data\nmore data",
|
||||
})
|
||||
|
||||
// also a complex type, like a map, a struct or a slice
|
||||
sse.Encode(w, sse.Event{
|
||||
Id: "124",
|
||||
Event: "message",
|
||||
Data: map[string]interface{}{
|
||||
"user": "manu",
|
||||
"date": time.Now().Unix(),
|
||||
"content": "hi!",
|
||||
},
|
||||
})
|
||||
// also a complex type, like a map, a struct or a slice
|
||||
sse.Encode(w, sse.Event{
|
||||
Id: "124",
|
||||
Event: "message",
|
||||
Data: map[string]interface{}{
|
||||
"user": "manu",
|
||||
"date": time.Now().Unix(),
|
||||
"content": "hi!",
|
||||
},
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
```sh
|
||||
```
|
||||
event: message
|
||||
data: some data\\nmore data
|
||||
|
||||
id: 124
|
||||
event: message
|
||||
data: {"content":"hi!","date":1431540810,"user":"manu"}
|
||||
|
||||
|
||||
```
|
||||
|
||||
## Content-Type
|
||||
@@ -50,8 +49,7 @@ data: {"content":"hi!","date":1431540810,"user":"manu"}
|
||||
```go
|
||||
fmt.Println(sse.ContentType)
|
||||
```
|
||||
|
||||
```sh
|
||||
```
|
||||
text/event-stream
|
||||
```
|
||||
|
||||
|
||||
13
vendor/github.com/gin-contrib/sse/sse-decoder.go
generated
vendored
13
vendor/github.com/gin-contrib/sse/sse-decoder.go
generated
vendored
@@ -7,6 +7,7 @@ package sse
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
)
|
||||
|
||||
type decoder struct {
|
||||
@@ -21,8 +22,7 @@ func Decode(r io.Reader) ([]Event, error) {
|
||||
func (d *decoder) dispatchEvent(event Event, data string) {
|
||||
dataLength := len(data)
|
||||
if dataLength > 0 {
|
||||
// If the data buffer's last character is a U+000A LINE FEED (LF) character,
|
||||
// then remove the last character from the data buffer.
|
||||
//If the data buffer's last character is a U+000A LINE FEED (LF) character, then remove the last character from the data buffer.
|
||||
data = data[:dataLength-1]
|
||||
dataLength--
|
||||
}
|
||||
@@ -37,13 +37,13 @@ func (d *decoder) dispatchEvent(event Event, data string) {
|
||||
}
|
||||
|
||||
func (d *decoder) decode(r io.Reader) ([]Event, error) {
|
||||
buf, err := io.ReadAll(r)
|
||||
buf, err := ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var currentEvent Event
|
||||
dataBuffer := new(bytes.Buffer)
|
||||
var dataBuffer *bytes.Buffer = new(bytes.Buffer)
|
||||
// TODO (and unit tests)
|
||||
// Lines must be separated by either a U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair,
|
||||
// a single U+000A LINE FEED (LF) character,
|
||||
@@ -96,8 +96,7 @@ func (d *decoder) decode(r io.Reader) ([]Event, error) {
|
||||
currentEvent.Id = string(value)
|
||||
case "retry":
|
||||
// If the field value consists of only characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9),
|
||||
// then interpret the field value as an integer in base ten, and set the event stream's
|
||||
// reconnection time to that integer.
|
||||
// then interpret the field value as an integer in base ten, and set the event stream's reconnection time to that integer.
|
||||
// Otherwise, ignore the field.
|
||||
currentEvent.Id = string(value)
|
||||
case "data":
|
||||
@@ -106,7 +105,7 @@ func (d *decoder) decode(r io.Reader) ([]Event, error) {
|
||||
// then append a single U+000A LINE FEED (LF) character to the data buffer.
|
||||
dataBuffer.WriteString("\n")
|
||||
default:
|
||||
// Otherwise. The field is ignored.
|
||||
//Otherwise. The field is ignored.
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
44
vendor/github.com/gin-contrib/sse/sse-encoder.go
generated
vendored
44
vendor/github.com/gin-contrib/sse/sse-encoder.go
generated
vendored
@@ -18,12 +18,10 @@ import (
|
||||
// W3C Working Draft 29 October 2009
|
||||
// http://www.w3.org/TR/2009/WD-eventsource-20091029/
|
||||
|
||||
const ContentType = "text/event-stream;charset=utf-8"
|
||||
const ContentType = "text/event-stream"
|
||||
|
||||
var (
|
||||
contentType = []string{ContentType}
|
||||
noCache = []string{"no-cache"}
|
||||
)
|
||||
var contentType = []string{ContentType}
|
||||
var noCache = []string{"no-cache"}
|
||||
|
||||
var fieldReplacer = strings.NewReplacer(
|
||||
"\n", "\\n",
|
||||
@@ -50,48 +48,40 @@ func Encode(writer io.Writer, event Event) error {
|
||||
|
||||
func writeId(w stringWriter, id string) {
|
||||
if len(id) > 0 {
|
||||
_, _ = w.WriteString("id:")
|
||||
_, _ = fieldReplacer.WriteString(w, id)
|
||||
_, _ = w.WriteString("\n")
|
||||
w.WriteString("id:")
|
||||
fieldReplacer.WriteString(w, id)
|
||||
w.WriteString("\n")
|
||||
}
|
||||
}
|
||||
|
||||
func writeEvent(w stringWriter, event string) {
|
||||
if len(event) > 0 {
|
||||
_, _ = w.WriteString("event:")
|
||||
_, _ = fieldReplacer.WriteString(w, event)
|
||||
_, _ = w.WriteString("\n")
|
||||
w.WriteString("event:")
|
||||
fieldReplacer.WriteString(w, event)
|
||||
w.WriteString("\n")
|
||||
}
|
||||
}
|
||||
|
||||
func writeRetry(w stringWriter, retry uint) {
|
||||
if retry > 0 {
|
||||
_, _ = w.WriteString("retry:")
|
||||
_, _ = w.WriteString(strconv.FormatUint(uint64(retry), 10))
|
||||
_, _ = w.WriteString("\n")
|
||||
w.WriteString("retry:")
|
||||
w.WriteString(strconv.FormatUint(uint64(retry), 10))
|
||||
w.WriteString("\n")
|
||||
}
|
||||
}
|
||||
|
||||
func writeData(w stringWriter, data interface{}) error {
|
||||
_, _ = w.WriteString("data:")
|
||||
|
||||
bData, ok := data.([]byte)
|
||||
if ok {
|
||||
_, _ = dataReplacer.WriteString(w, string(bData))
|
||||
_, _ = w.WriteString("\n\n")
|
||||
return nil
|
||||
}
|
||||
|
||||
switch kindOfData(data) { //nolint:exhaustive
|
||||
w.WriteString("data:")
|
||||
switch kindOfData(data) {
|
||||
case reflect.Struct, reflect.Slice, reflect.Map:
|
||||
err := json.NewEncoder(w).Encode(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, _ = w.WriteString("\n")
|
||||
w.WriteString("\n")
|
||||
default:
|
||||
_, _ = dataReplacer.WriteString(w, fmt.Sprint(data))
|
||||
_, _ = w.WriteString("\n\n")
|
||||
dataReplacer.WriteString(w, fmt.Sprint(data))
|
||||
w.WriteString("\n\n")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
2
vendor/github.com/gin-contrib/sse/writer.go
generated
vendored
2
vendor/github.com/gin-contrib/sse/writer.go
generated
vendored
@@ -12,7 +12,7 @@ type stringWrapper struct {
|
||||
}
|
||||
|
||||
func (w stringWrapper) WriteString(str string) (int, error) {
|
||||
return w.Write([]byte(str))
|
||||
return w.Writer.Write([]byte(str))
|
||||
}
|
||||
|
||||
func checkWriter(writer io.Writer) stringWriter {
|
||||
|
||||
Reference in New Issue
Block a user