lint fixes #57
							
								
								
									
										13
									
								
								.github/stale.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/stale.sh
									
									
									
									
										vendored
									
									
								
							| @@ -1,13 +0,0 @@ | ||||
| #!/bin/bash -ex | ||||
|  | ||||
| export PATH=$PATH:$(pwd)/bin | ||||
| export GO111MODULE=on | ||||
| export GOBIN=$(pwd)/bin | ||||
|  | ||||
| #go get github.com/rvflash/goup@v0.4.1 | ||||
|  | ||||
| #goup -v ./... | ||||
| #go get github.com/psampaz/go-mod-outdated@v0.6.0 | ||||
| go list -u -m -mod=mod -json all | go-mod-outdated -update -direct -ci || true | ||||
|  | ||||
| #go list -u -m -json all | go-mod-outdated -update | ||||
							
								
								
									
										3
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -34,10 +34,9 @@ jobs: | ||||
|         uses: actions/checkout@v2 | ||||
|       - name: lint | ||||
|         uses: golangci/golangci-lint-action@v2 | ||||
|         continue-on-error: true | ||||
|         with: | ||||
|           # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. | ||||
|           version: v1.30 | ||||
|           version: v1.39 | ||||
|           # Optional: working directory, useful for monorepos | ||||
|           # working-directory: somedir | ||||
|           # Optional: golangci-lint command line arguments. | ||||
|   | ||||
							
								
								
									
										3
									
								
								.github/workflows/pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/pr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -34,10 +34,9 @@ jobs: | ||||
|         uses: actions/checkout@v2 | ||||
|       - name: lint | ||||
|         uses: golangci/golangci-lint-action@v2 | ||||
|         continue-on-error: true | ||||
|         with: | ||||
|           # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. | ||||
|           version: v1.30 | ||||
|           version: v1.39 | ||||
|           # Optional: working directory, useful for monorepos | ||||
|           # working-directory: somedir | ||||
|           # Optional: golangci-lint command line arguments. | ||||
|   | ||||
							
								
								
									
										44
									
								
								.golangci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.golangci.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| run: | ||||
|   concurrency: 4 | ||||
|   deadline: 5m | ||||
|   issues-exit-code: 1 | ||||
|   tests: true | ||||
|  | ||||
| linters-settings: | ||||
|   govet: | ||||
|     check-shadowing: true | ||||
|     enable: | ||||
|       - fieldalignment | ||||
|  | ||||
| linters: | ||||
|   enable: | ||||
|     - govet | ||||
|     - deadcode | ||||
|     - errcheck | ||||
|     - govet | ||||
|     - ineffassign | ||||
|     - staticcheck | ||||
|     - structcheck | ||||
|     - typecheck | ||||
|     - unused | ||||
|     - varcheck | ||||
|     - bodyclose | ||||
|     - gci | ||||
|     - goconst | ||||
|     - gocritic | ||||
|     - gosimple | ||||
|     - gofmt | ||||
|     - gofumpt | ||||
|     - goimports | ||||
|     - golint | ||||
|     - gosec | ||||
|     - makezero | ||||
|     - misspell | ||||
|     - nakedret | ||||
|     - nestif | ||||
|     - nilerr | ||||
|     - noctx | ||||
|     - prealloc | ||||
|     - unconvert | ||||
|     - unparam | ||||
|   disable-all: false | ||||
							
								
								
									
										36
									
								
								handler.go
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								handler.go
									
									
									
									
									
								
							| @@ -9,7 +9,6 @@ import ( | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/unistack-org/micro/v3/codec" | ||||
| 	"github.com/unistack-org/micro/v3/errors" | ||||
| 	"github.com/unistack-org/micro/v3/logger" | ||||
| 	"github.com/unistack-org/micro/v3/metadata" | ||||
| @@ -22,7 +21,9 @@ import ( | ||||
| var ( | ||||
| 	DefaultErrorHandler = func(ctx context.Context, s server.Handler, w http.ResponseWriter, r *http.Request, err error, status int) { | ||||
| 		w.WriteHeader(status) | ||||
| 		w.Write([]byte(err.Error())) | ||||
| 		if _, cerr := w.Write([]byte(err.Error())); cerr != nil { | ||||
| 			logger.DefaultLogger.Errorf(ctx, "write failed: %v", cerr) | ||||
| 		} | ||||
| 	} | ||||
| 	DefaultContentType = "application/json" | ||||
| ) | ||||
| @@ -44,20 +45,6 @@ type httpHandler struct { | ||||
| 	sync.RWMutex | ||||
| } | ||||
|  | ||||
| func (h *httpHandler) newCodec(ct string) (codec.Codec, error) { | ||||
| 	h.RLock() | ||||
| 	defer h.RUnlock() | ||||
|  | ||||
| 	if idx := strings.IndexRune(ct, ';'); idx >= 0 { | ||||
| 		ct = ct[:idx] | ||||
| 	} | ||||
|  | ||||
| 	if cf, ok := h.sopts.Codecs[ct]; ok { | ||||
| 		return cf, nil | ||||
| 	} | ||||
| 	return nil, codec.ErrUnknownContentType | ||||
| } | ||||
|  | ||||
| func (h *httpHandler) Name() string { | ||||
| 	return h.name | ||||
| } | ||||
| @@ -75,7 +62,6 @@ func (h *httpHandler) Options() server.HandlerOptions { | ||||
| } | ||||
|  | ||||
| func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
|  | ||||
| 	for exp, ph := range h.pathHandlers { | ||||
| 		if exp.MatchString(r.URL.String()) { | ||||
| 			ph(w, r) | ||||
| @@ -95,7 +81,7 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	ctx := metadata.NewContext(r.Context(), nil) | ||||
| 	ctx := metadata.NewIncomingContext(r.Context(), nil) | ||||
|  | ||||
| 	defer r.Body.Close() | ||||
|  | ||||
| @@ -132,8 +118,8 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
| 	for _, hpat := range h.handlers { | ||||
| 		handlertmp := hpat.(*httpHandler) | ||||
| 		for _, hldrtmp := range handlertmp.handlers[r.Method] { | ||||
| 			mp, err := hldrtmp.pat.Match(components, verb) | ||||
| 			if err == nil { | ||||
| 			mp, merr := hldrtmp.pat.Match(components, verb) | ||||
| 			if merr == nil { | ||||
| 				match = true | ||||
| 				for k, v := range mp { | ||||
| 					matches[k] = v | ||||
| @@ -161,9 +147,9 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
|  | ||||
| 	// get fields from url values | ||||
| 	if len(r.URL.RawQuery) > 0 { | ||||
| 		umd, err := rflutil.URLMap(r.URL.RawQuery) | ||||
| 		if err != nil { | ||||
| 			h.errorHandler(ctx, handler, w, r, err, http.StatusBadRequest) | ||||
| 		umd, cerr := rflutil.URLMap(r.URL.RawQuery) | ||||
| 		if cerr != nil { | ||||
| 			h.errorHandler(ctx, handler, w, r, cerr, http.StatusBadRequest) | ||||
| 			return | ||||
| 		} | ||||
| 		for k, v := range umd { | ||||
| @@ -284,5 +270,7 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
| 		// handler.sopts.Logger.Warn(handler.sopts.Context, "response code not set in handler via SetRspCode(ctx, http.StatusXXX)") | ||||
| 		w.WriteHeader(200) | ||||
| 	} | ||||
| 	w.Write(b) | ||||
| 	if _, cerr := w.Write(b); cerr != nil { | ||||
| 		logger.DefaultLogger.Errorf(ctx, "write failed: %v", cerr) | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										34
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								http.go
									
									
									
									
									
								
							| @@ -126,19 +126,23 @@ func (h *httpServer) Init(opts ...server.Option) error { | ||||
|  | ||||
| func (h *httpServer) Handle(handler server.Handler) error { | ||||
| 	h.Lock() | ||||
| 	if hdlr, ok := handler.(*httpHandler); ok { | ||||
| 	defer h.Unlock() | ||||
| 	hdlr, ok := handler.(*httpHandler) | ||||
| 	if !ok { | ||||
| 		h.hd = handler | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := hdlr.hd.(http.Handler); ok { | ||||
| 		h.hd = handler | ||||
| 		} else { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if h.handlers == nil { | ||||
| 		h.handlers = make(map[string]server.Handler) | ||||
| 	} | ||||
| 	h.handlers[handler.Name()] = handler | ||||
| 		} | ||||
| 	} else { | ||||
| 		h.hd = handler | ||||
| 	} | ||||
| 	h.Unlock() | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -279,7 +283,7 @@ func (h *httpServer) Register() error { | ||||
| 	service.Endpoints = eps | ||||
|  | ||||
| 	h.Lock() | ||||
| 	var subscriberList []*httpSubscriber | ||||
| 	subscriberList := make([]*httpSubscriber, 0, len(h.subscribers)) | ||||
| 	for e := range h.subscribers { | ||||
| 		// Only advertise non internal subscribers | ||||
| 		subscriberList = append(subscriberList, e) | ||||
| @@ -430,6 +434,7 @@ func (h *httpServer) Start() error { | ||||
| 	var handler http.Handler | ||||
| 	var srvFunc func(net.Listener) error | ||||
|  | ||||
| 	// nolint: nestif | ||||
| 	if h.opts.Context != nil { | ||||
| 		if hs, ok := h.opts.Context.Value(serverKey{}).(*http.Server); ok && hs != nil { | ||||
| 			if hs.Handler == nil && h.hd != nil { | ||||
| @@ -485,9 +490,17 @@ func (h *httpServer) Start() error { | ||||
| 	} | ||||
|  | ||||
| 	if srvFunc != nil { | ||||
| 		go srvFunc(ts) | ||||
| 		go func() { | ||||
| 			if cerr := srvFunc(ts); cerr != nil { | ||||
| 				h.opts.Logger.Error(h.opts.Context, cerr) | ||||
| 			} | ||||
| 		}() | ||||
| 	} else { | ||||
| 		go http.Serve(ts, fn) | ||||
| 		go func() { | ||||
| 			if cerr := http.Serve(ts, fn); cerr != nil { | ||||
| 				h.opts.Logger.Error(h.opts.Context, cerr) | ||||
| 			} | ||||
| 		}() | ||||
| 	} | ||||
|  | ||||
| 	go func() { | ||||
| @@ -511,6 +524,7 @@ func (h *httpServer) Start() error { | ||||
| 				registered := h.registered | ||||
| 				h.RUnlock() | ||||
| 				rerr := config.RegisterCheck(h.opts.Context) | ||||
| 				// nolint: nestif | ||||
| 				if rerr != nil && registered { | ||||
| 					if config.Logger.V(logger.ErrorLevel) { | ||||
| 						config.Logger.Errorf(config.Context, "Server %s-%s register check error: %s, deregister it", config.Name, config.Id, rerr) | ||||
|   | ||||
							
								
								
									
										24
									
								
								options.go
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								options.go
									
									
									
									
									
								
							| @@ -8,11 +8,6 @@ import ( | ||||
| 	"github.com/unistack-org/micro/v3/server" | ||||
| ) | ||||
|  | ||||
| type rspCodeKey struct{} | ||||
| type rspCodeVal struct { | ||||
| 	code int | ||||
| } | ||||
|  | ||||
| // SetError pass error to caller | ||||
| func SetError(err interface{}) error { | ||||
| 	return &Error{err: err} | ||||
| @@ -28,6 +23,13 @@ func (err *Error) Error() string { | ||||
| 	return fmt.Sprintf("%v", err.err) | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	rspCodeKey struct{} | ||||
| 	rspCodeVal struct { | ||||
| 		code int | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| // SetRspCode saves response code in context, must be used by handler to specify http code | ||||
| func SetRspCode(ctx context.Context, code int) { | ||||
| 	if rsp, ok := ctx.Value(rspCodeKey{}).(*rspCodeVal); ok { | ||||
| @@ -65,10 +67,12 @@ func ErrorHandler(fn func(ctx context.Context, s server.Handler, w http.Response | ||||
| 	return server.SetOption(errorHandlerKey{}, fn) | ||||
| } | ||||
|  | ||||
| type pathHandlerKey struct{} | ||||
| type pathHandlerVal struct { | ||||
| type ( | ||||
| 	pathHandlerKey struct{} | ||||
| 	pathHandlerVal struct { | ||||
| 		h map[string]http.HandlerFunc | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| // PathHandler specifies http handler for path regexp | ||||
| func PathHandler(path string, h http.HandlerFunc) server.Option { | ||||
| @@ -85,10 +89,12 @@ func PathHandler(path string, h http.HandlerFunc) server.Option { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type contentTypeHandlerKey struct{} | ||||
| type contentTypeHandlerVal struct { | ||||
| type ( | ||||
| 	contentTypeHandlerKey struct{} | ||||
| 	contentTypeHandlerVal struct { | ||||
| 		h map[string]http.HandlerFunc | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| // ContentTypeHandler specifies http handler for Content-Type | ||||
| func ContentTypeHandler(ct string, h http.HandlerFunc) server.Option { | ||||
|   | ||||
| @@ -5,6 +5,12 @@ import ( | ||||
|  | ||||
| 	"github.com/unistack-org/micro/v3/codec" | ||||
| 	"github.com/unistack-org/micro/v3/metadata" | ||||
| 	"github.com/unistack-org/micro/v3/server" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	_ server.Request = &rpcRequest{} | ||||
| 	_ server.Message = &rpcMessage{} | ||||
| ) | ||||
|  | ||||
| type rpcRequest struct { | ||||
| @@ -16,7 +22,6 @@ type rpcRequest struct { | ||||
| 	endpoint    string | ||||
| 	contentType string | ||||
| 	service     string | ||||
| 	target      string | ||||
| 	body        []byte | ||||
| 	stream      bool | ||||
| } | ||||
| @@ -43,7 +48,7 @@ func (r *rpcRequest) Method() string { | ||||
| } | ||||
|  | ||||
| func (r *rpcRequest) Endpoint() string { | ||||
| 	return r.method | ||||
| 	return r.endpoint | ||||
| } | ||||
|  | ||||
| func (r *rpcRequest) Codec() codec.Codec { | ||||
|   | ||||
| @@ -62,15 +62,14 @@ func prepareEndpoint(method reflect.Method) (*methodType, error) { | ||||
| 		return nil, fmt.Errorf("method %v of %v has wrong number of ins: %v", mname, mtype, mtype.NumIn()) | ||||
| 	} | ||||
|  | ||||
| 	if stream { | ||||
| 	switch stream { | ||||
| 	case true: | ||||
| 		// check stream type | ||||
| 		streamType := reflect.TypeOf((*server.Stream)(nil)).Elem() | ||||
| 		if !argType.Implements(streamType) { | ||||
| 			return nil, fmt.Errorf("%v argument does not implement Streamer interface: %v", mname, argType) | ||||
| 		} | ||||
| 	} else { | ||||
| 		// if not stream check the replyType | ||||
|  | ||||
| 	default: | ||||
| 		// First arg need not be a pointer. | ||||
| 		if !isExportedOrBuiltinType(argType) { | ||||
| 			return nil, fmt.Errorf("%v argument type not exported: %v", mname, argType) | ||||
|   | ||||
| @@ -14,10 +14,6 @@ import ( | ||||
| 	"github.com/unistack-org/micro/v3/server" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	subSig = "func(context.Context, interface{}) error" | ||||
| ) | ||||
|  | ||||
| var typeOfError = reflect.TypeOf((*error)(nil)).Elem() | ||||
|  | ||||
| type handler struct { | ||||
| @@ -116,7 +112,7 @@ func (s *httpServer) createSubHandler(sb *httpSubscriber, opts server.Options) b | ||||
|  | ||||
| 		hdr := metadata.Copy(msg.Header) | ||||
| 		delete(hdr, "Content-Type") | ||||
| 		ctx := metadata.NewContext(context.Background(), hdr) | ||||
| 		ctx := metadata.NewIncomingContext(context.Background(), hdr) | ||||
|  | ||||
| 		results := make(chan error, len(sb.handlers)) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user