29 lines
760 B
Go
29 lines
760 B
Go
|
|
package server
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"net/http"
|
||
|
|
"strings"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
const sessionHeaderName = "X-Cursor-Session-ID"
|
||
|
|
const exposeHeadersName = "Access-Control-Expose-Headers"
|
||
|
|
|
||
|
|
func ensureSessionHeader(w http.ResponseWriter, r *http.Request) string {
|
||
|
|
sessionKey := strings.TrimSpace(r.Header.Get(sessionHeaderName))
|
||
|
|
if sessionKey == "" {
|
||
|
|
sessionKey = fmt.Sprintf("csess_%d", time.Now().UnixNano())
|
||
|
|
}
|
||
|
|
w.Header().Set(sessionHeaderName, sessionKey)
|
||
|
|
|
||
|
|
existing := w.Header().Get(exposeHeadersName)
|
||
|
|
if existing == "" {
|
||
|
|
w.Header().Set(exposeHeadersName, sessionHeaderName)
|
||
|
|
} else if !strings.Contains(strings.ToLower(existing), strings.ToLower(sessionHeaderName)) {
|
||
|
|
w.Header().Set(exposeHeadersName, existing+", "+sessionHeaderName)
|
||
|
|
}
|
||
|
|
|
||
|
|
return sessionKey
|
||
|
|
}
|