mirror of
https://github.com/hanzoai/traces.git
synced 2026-10-30 18:20:41 +00:00
71 lines
2.2 KiB
Go
71 lines
2.2 KiB
Go
// Provenance-includes-location: https://github.com/weaveworks/common/blob/main/user/http.go
|
|
// Provenance-includes-license: Apache-2.0
|
|
// Provenance-includes-copyright: Weaveworks Ltd.
|
|
|
|
package user
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
)
|
|
|
|
const (
|
|
// 'Scope' in the below headers is a legacy from scope as a service.
|
|
|
|
// OrgIDHeaderName denotes the OrgID the request has been authenticated as
|
|
OrgIDHeaderName = "X-Scope-OrgID"
|
|
// UserIDHeaderName denotes the UserID the request has been authenticated as
|
|
UserIDHeaderName = "X-Scope-UserID"
|
|
|
|
// LowerOrgIDHeaderName as gRPC / HTTP2.0 headers are lowercased.
|
|
lowerOrgIDHeaderName = "x-scope-orgid"
|
|
)
|
|
|
|
// ExtractOrgIDFromHTTPRequest extracts the org ID from the request headers and returns
|
|
// the org ID and a context with the org ID embedded.
|
|
func ExtractOrgIDFromHTTPRequest(r *http.Request) (string, context.Context, error) {
|
|
orgID := r.Header.Get(OrgIDHeaderName)
|
|
if orgID == "" {
|
|
return "", r.Context(), ErrNoOrgID
|
|
}
|
|
return orgID, InjectOrgID(r.Context(), orgID), nil
|
|
}
|
|
|
|
// InjectOrgIDIntoHTTPRequest injects the orgID from the context into the request headers.
|
|
func InjectOrgIDIntoHTTPRequest(ctx context.Context, r *http.Request) error {
|
|
orgID, err := ExtractOrgID(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
existingID := r.Header.Get(OrgIDHeaderName)
|
|
if existingID != "" && existingID != orgID {
|
|
return ErrDifferentOrgIDPresent
|
|
}
|
|
r.Header.Set(OrgIDHeaderName, orgID)
|
|
return nil
|
|
}
|
|
|
|
// ExtractUserIDFromHTTPRequest extracts the org ID from the request headers and returns
|
|
// the org ID and a context with the org ID embedded.
|
|
func ExtractUserIDFromHTTPRequest(r *http.Request) (string, context.Context, error) {
|
|
userID := r.Header.Get(UserIDHeaderName)
|
|
if userID == "" {
|
|
return "", r.Context(), ErrNoUserID
|
|
}
|
|
return userID, InjectUserID(r.Context(), userID), nil
|
|
}
|
|
|
|
// InjectUserIDIntoHTTPRequest injects the userID from the context into the request headers.
|
|
func InjectUserIDIntoHTTPRequest(ctx context.Context, r *http.Request) error {
|
|
userID, err := ExtractUserID(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
existingID := r.Header.Get(UserIDHeaderName)
|
|
if existingID != "" && existingID != userID {
|
|
return ErrDifferentUserIDPresent
|
|
}
|
|
r.Header.Set(UserIDHeaderName, userID)
|
|
return nil
|
|
}
|