From ad0135e21baa0d41cef2d80b093844153e8c3aea Mon Sep 17 00:00:00 2001 From: a <a@tuxpa.in> Date: Tue, 26 Dec 2023 00:44:43 -0600 Subject: [PATCH] delete this --- contrib/codecs/http/codec.go | 225 ----------------------------------- 1 file changed, 225 deletions(-) delete mode 100644 contrib/codecs/http/codec.go diff --git a/contrib/codecs/http/codec.go b/contrib/codecs/http/codec.go deleted file mode 100644 index 3941c55..0000000 --- a/contrib/codecs/http/codec.go +++ /dev/null @@ -1,225 +0,0 @@ -package http - -import ( - "bufio" - "context" - "encoding/base64" - "errors" - "fmt" - "io" - "mime" - "net/http" - "net/url" - "strings" - "sync" - - "gfx.cafe/open/jrpc/pkg/jsonrpc" - "gfx.cafe/open/jrpc/pkg/serverutil" -) - -var _ jsonrpc.ReaderWriter = (*Codec)(nil) - -// Reusable codec. use Reset() -type Codec struct { - ctx context.Context - cn func() - - r *http.Request - w http.ResponseWriter - wr *bufio.Writer - msgs chan *serverutil.Bundle - errCh chan httpError - - mu sync.Mutex - - i jsonrpc.PeerInfo -} - -type httpError struct { - code int - err error -} - -func (c *Codec) Reset(w http.ResponseWriter, r *http.Request) { - c.wr = bufio.NewWriter(w) - if w == nil { - c.wr = bufio.NewWriter(io.Discard) - } - c.r = r - c.w = w - c.msgs = make(chan *serverutil.Bundle, 1) - c.errCh = make(chan httpError, 1) - - ctx := c.r.Context() - c.ctx, c.cn = context.WithCancel(ctx) - c.doRead() - c.peerInfo() -} - -func (c *Codec) peerInfo() { - c.i.Transport = "http" - c.i.RemoteAddr = c.r.RemoteAddr - c.i.HTTP = c.r.Clone(c.r.Context()) -} - -// gets the peer info -func (c *Codec) PeerInfo() jsonrpc.PeerInfo { - return c.i -} - -func (r *Codec) doReadGet() (msg *serverutil.Bundle, err error) { - method_up := r.r.URL.Query().Get("method") - if method_up == "" { - method_up = strings.TrimPrefix(r.r.URL.Path, "/") - } - params, _ := url.QueryUnescape(r.r.URL.Query().Get("params")) - param := []byte(params) - if pb, err := base64.URLEncoding.DecodeString(params); err == nil { - param = pb - } - id := r.r.URL.Query().Get("id") - if id == "" { - id = "1" - } - return &serverutil.Bundle{ - Messages: []*jsonrpc.Message{{ - ID: jsonrpc.NewId(id), - Method: method_up, - Params: param, - }}, - Batch: false, - }, nil -} - -func (r *Codec) doReadRPC() (msg *serverutil.Bundle, err error) { - method_up := r.r.URL.Query().Get("method") - if method_up == "" { - method_up = strings.TrimPrefix(r.r.URL.Path, "/") - } - id := r.r.URL.Query().Get("id") - if id == "" { - id = "1" - } - data, err := io.ReadAll(r.r.Body) - if err != nil { - return nil, err - } - return &serverutil.Bundle{ - Messages: []*jsonrpc.Message{{ - ID: jsonrpc.NewId(id), - Method: method_up, - Params: data, - }}, - Batch: false, - }, nil -} - -func (r *Codec) doReadPost() (msg *serverutil.Bundle, err error) { - data, err := io.ReadAll(r.r.Body) - if err != nil { - return nil, err - } - return serverutil.ParseBundle(data), nil -} - -// validateRequest returns a non-zero response code and error message if the -// request is invalid. -func ValidateRequest(r *http.Request) (int, error) { - if r.Method == http.MethodPut || r.Method == http.MethodDelete { - return http.StatusMethodNotAllowed, errors.New("method not allowed") - } - if r.ContentLength > maxRequestContentLength { - err := fmt.Errorf("content length too large (%d>%d)", r.ContentLength, maxRequestContentLength) - return http.StatusRequestEntityTooLarge, err - } - // Allow OPTIONS (regardless of content-type) - if r.Method == http.MethodOptions { - return 0, nil - } - // Check content-type - if mt, _, err := mime.ParseMediaType(r.Header.Get("content-type")); err == nil { - for _, accepted := range acceptedContentTypes { - if accepted == mt { - return 0, nil - } - } - } - // Invalid content-type ignored for now - return 0, nil - //err := fmt.Errorf("invalid content type, only %s is supported", contentType) - //return http.StatusUnsupportedMediaType, err -} - -func (c *Codec) doRead() { - code, err := ValidateRequest(c.r) - if err != nil { - c.errCh <- httpError{ - code: code, - err: err, - } - return - } - go func() { - var data *serverutil.Bundle - // TODO: implement eventsource - switch strings.ToUpper(c.r.Method) { - case http.MethodGet: - data, err = c.doReadGet() - case "RPC": - data, err = c.doReadRPC() - case http.MethodPost: - data, err = c.doReadPost() - } - if err != nil { - c.errCh <- httpError{ - code: http.StatusInternalServerError, - err: err, - } - return - } - c.msgs <- data - }() -} - -func (c *Codec) ReadBatch(ctx context.Context) ([]*jsonrpc.Message, bool, error) { - select { - case ans := <-c.msgs: - return ans.Messages, ans.Batch, nil - case err := <-c.errCh: - http.Error(c.w, err.err.Error(), err.code) - return nil, false, err.err - case <-ctx.Done(): - return nil, false, ctx.Err() - case <-c.ctx.Done(): - return nil, false, c.ctx.Err() - } -} - -// closes the connection -func (c *Codec) Write(p []byte) (n int, err error) { - return c.wr.Write(p) -} - -func (c *Codec) Flush() error { - defer c.cn() - err := c.wr.Flush() - if err != nil { - return err - } - return nil -} - -func (c *Codec) Close() error { - c.cn() - return nil -} - -// Closed returns a channel which is closed when the connection is closed. -func (c *Codec) Closed() <-chan struct{} { - return c.ctx.Done() -} - -// RemoteAddr returns the peer address of the connection. -func (c *Codec) RemoteAddr() string { - return c.r.RemoteAddr -} -- GitLab