Skip to content

Commit

Permalink
remove grpc web
Browse files Browse the repository at this point in the history
  • Loading branch information
gernest committed Feb 8, 2024
1 parent 106ef56 commit 2faf4ee
Show file tree
Hide file tree
Showing 13 changed files with 304 additions and 1,460 deletions.
114 changes: 49 additions & 65 deletions api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,21 @@ import (
"strings"

"github.com/bufbuild/protovalidate-go"
grpc_protovalidate "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/protovalidate"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"github.com/improbable-eng/grpc-web/go/grpcweb"
v1 "github.com/vinceanalytics/vince/gen/go/staples/v1"
"github.com/vinceanalytics/vince/guard"
"github.com/vinceanalytics/vince/request"
"github.com/vinceanalytics/vince/session"
"github.com/vinceanalytics/vince/stats"
"github.com/vinceanalytics/vince/tracker"
"github.com/vinceanalytics/vince/version"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/reflection"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
)

type API struct {
v1.UnsafeStaplesServer
v1.UnsafeStatsServer
config *v1.Config
hand http.Handler
}

var _ v1.StaplesServer = (*API)(nil)

var trackerServer = http.FileServer(http.FS(tracker.JS))

func New(ctx context.Context, o *v1.Config) (*API, error) {
Expand All @@ -43,55 +31,52 @@ func New(ctx context.Context, o *v1.Config) (*API, error) {
if err != nil {
return nil, err
}
svr := grpc.NewServer(
grpc.StreamInterceptor(
grpc_protovalidate.StreamServerInterceptor(valid),
),
grpc.UnaryInterceptor(
grpc_protovalidate.UnaryServerInterceptor(valid),
),
)
v1.RegisterStaplesServer(svr, a)
v1.RegisterStatsServer(svr, a)
web := grpcweb.WrapServer(svr,
grpcweb.WithAllowNonRootResource(true),
grpcweb.WithOriginFunc(func(origin string) bool {
return true
}))
api := runtime.NewServeMux()
reflection.Register(svr)
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
err = v1.RegisterStaplesHandlerFromEndpoint(
ctx, api, o.Listen, opts,
)
if err != nil {
return nil, err
}
ctx = request.With(ctx, valid)
base := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/api/event":
ReceiveEvent(w, r)
return
default:
if strings.HasPrefix(r.URL.Path, "/api/v1/") {
api.ServeHTTP(w, r)
switch r.Method {
case http.MethodGet:
switch r.URL.Path {
case "/v1/version":
request.Write(r.Context(), w, &v1.Version{Version: version.VERSION})
return
case "/v1/domains":
o := make([]*v1.Domain, 0, len(a.config.Domains))
for _, n := range a.config.Domains {
o = append(o, &v1.Domain{Name: n})
}
request.Write(r.Context(), w, &v1.GetDomainResponse{Domains: o})
return
case "/v1/visitors":
stats.Realtime(w, r)
default:
if strings.HasPrefix(r.URL.Path, "/js/") {
trackerServer.ServeHTTP(w, r)
return
}
}
case http.MethodPost:
switch r.URL.Path {
case "/v1/event":
SendEvent(w, r)
return
case "/v1/aggregate":
stats.Aggregate(w, r)
case "/v1/timeseries":
stats.TimeSeries(w, r)
case "/api/event":
ReceiveEvent(w, r)
return
}
case http.MethodHead:
if strings.HasPrefix(r.URL.Path, "/js/") {
trackerServer.ServeHTTP(w, r)
return
}
}
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
})
root := h2c.NewHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.Header.Get("Content-Type"), "application/grpc") {
web.ServeHTTP(w, r)
return
}
base.ServeHTTP(w, r)
}), &http2.Server{})
a.hand = root

a.hand = base
return a, nil
}

Expand All @@ -105,22 +90,21 @@ func (a *API) GetVersion(_ context.Context, _ *emptypb.Empty) (*v1.Version, erro
}, nil
}

func (a *API) GetDomains(_ context.Context, _ *v1.GetDomainRequest) (*v1.GetDomainResponse, error) {
o := make([]*v1.Domain, 0, len(a.config.Domains))
for _, n := range a.config.Domains {
o = append(o, &v1.Domain{Name: n})
func SendEvent(w http.ResponseWriter, r *http.Request) {
var req v1.Event
if !request.Read(w, r, &req) {
return
}
return &v1.GetDomainResponse{Domains: o}, nil
}

func (a *API) SendEvent(ctx context.Context, req *v1.Event) (*v1.SendEventResponse, error) {
ctx := r.Context()
xg := guard.Get(ctx)
if !xg.Allow() {
return nil, status.Error(codes.Unavailable, "Limit exceeded")
request.Error(ctx, w, http.StatusTooManyRequests, "Limit exceeded")
return
}
if !xg.Accept(req.D) {
return &v1.SendEventResponse{Dropped: true}, nil
request.Write(ctx, w, &v1.SendEventResponse{Dropped: true})
return
}
session.Get(ctx).Queue(ctx, req)
return &v1.SendEventResponse{}, nil
session.Get(ctx).Queue(ctx, &req)
request.Write(ctx, w, &v1.SendEventResponse{Dropped: false})
}
23 changes: 0 additions & 23 deletions api/stats.go

This file was deleted.

Loading

0 comments on commit 2faf4ee

Please sign in to comment.