Skip to content

Commit

Permalink
Run Proxy Middleware tests in parallel. Add nil checks for potential …
Browse files Browse the repository at this point in the history
…issues pointed by nilaway
  • Loading branch information
gaby committed Mar 4, 2024
1 parent 5596887 commit 6f05d4b
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 37 deletions.
34 changes: 23 additions & 11 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -604,14 +604,24 @@ func (a *Agent) MultipartForm(args *Args) *Agent {
})
}

for _, ff := range a.formFiles {
w, err := a.mw.CreateFormFile(ff.Fieldname, ff.Name)
if err != nil {
a.errs = append(a.errs, err)
continue
}
if _, err = w.Write(ff.Content); err != nil {
a.errs = append(a.errs, err)
// Check if a.formFiles is not nil to avoid nil dereference
if a.formFiles != nil {
for _, ff := range a.formFiles {
// Additionally, check if ff is not nil to avoid nil dereference
if ff == nil {
continue // Skip this iteration if ff is nil
}
w, err := a.mw.CreateFormFile(ff.Fieldname, ff.Name)
if err != nil {
a.errs = append(a.errs, err)
continue
}
// Check if ff.Content is not nil before writing
if ff.Content != nil {
if _, err = w.Write(ff.Content); err != nil {
a.errs = append(a.errs, err)
}
}
}
}

Expand Down Expand Up @@ -854,10 +864,12 @@ func (a *Agent) reset() {
a.Name = ""
a.NoDefaultUserAgentHeader = false
for i, ff := range a.formFiles {
if ff.autoRelease {
ReleaseFormFile(ff)
if ff != nil {
if ff.autoRelease {
ReleaseFormFile(ff)
}
a.formFiles[i] = nil
}
a.formFiles[i] = nil
}
a.formFiles = a.formFiles[:0]
}
Expand Down
15 changes: 8 additions & 7 deletions listen.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,16 +268,17 @@ func (*App) createListener(addr string, tlsConfig *tls.Config, cfg ListenConfig)
listener, err = net.Listen(cfg.ListenerNetwork, addr)
}

if cfg.ListenerAddrFunc != nil {
cfg.ListenerAddrFunc(listener.Addr())
// Check for error before using the listener
if err != nil {
// Wrap the error from tls.Listen/net.Listen
return nil, fmt.Errorf("failed to listen: %w", err)
}

// Wrap error comes from tls.Listen/net.Listen
if err != nil {
err = fmt.Errorf("failed to listen: %w", err)
if cfg.ListenerAddrFunc != nil {
cfg.ListenerAddrFunc(listener.Addr())
}

return listener, err
return listener, nil
}

func (app *App) printMessages(cfg ListenConfig, ln net.Listener) {
Expand Down Expand Up @@ -378,7 +379,7 @@ func (app *App) startupMessage(addr string, isTLS bool, pids string, cfg ListenC

if cfg.EnablePrefork {
// Turn the `pids` variable (in the form ",a,b,c,d,e,f,etc") into a slice of PIDs
var pidSlice []string
pidSlice := make([]string, 0)
for _, v := range strings.Split(pids, ",") {
if v != "" {
pidSlice = append(pidSlice, v)
Expand Down
12 changes: 8 additions & 4 deletions middleware/logger/default_logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,15 @@ func appendInt(output Buffer, v int) (int, error) {

// writeLog writes a msg to w, printing a warning to stderr if the log fails.
func writeLog(w io.Writer, msg []byte) {
if w == nil {
fmt.Fprintf(os.Stderr, "writeLog: io.Writer is nil\n")
return
}
if _, err := w.Write(msg); err != nil {
// Write error to output
if _, err := w.Write([]byte(err.Error())); err != nil {
// There is something wrong with the given io.Writer
_, _ = fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
// Attempt to write the error message to the original writer, w
if _, err := w.Write([]byte("Failed to write log message: " + err.Error())); err != nil {
// If writing to w fails, fall back to stderr
fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
}
}
}
15 changes: 15 additions & 0 deletions middleware/logger/template_chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,24 @@ import (
func buildLogFuncChain(cfg *Config, tagFunctions map[string]LogFunc) ([][]byte, []LogFunc, error) {
// process flow is copied from the fasttemplate flow https://github.com/valyala/fasttemplate/blob/2a2d1afadadf9715bfa19683cdaeac8347e5d9f9/template.go#L23-L62
templateB := utils.UnsafeBytes(cfg.Format)
if templateB == nil {
return nil, nil, errors.New("template is nil")
}

startTagB := utils.UnsafeBytes(startTag)
if startTagB == nil {
return nil, nil, errors.New("startTag is nil")
}

endTagB := utils.UnsafeBytes(endTag)
if endTagB == nil {
return nil, nil, errors.New("endTag is nil")
}

paramSeparatorB := utils.UnsafeBytes(paramSeparator)
if paramSeparatorB == nil {
return nil, nil, errors.New("paramSeparator is nil")
}

var fixParts [][]byte
var funcChain []LogFunc
Expand Down
4 changes: 4 additions & 0 deletions middleware/proxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,10 @@ func doAction(
}

func getScheme(uri []byte) []byte {
if uri == nil {
return nil
}

i := bytes.IndexByte(uri, '/')
if i < 1 || uri[i-1] != ':' || i == len(uri)-1 || uri[i+1] != '/' {
return nil
Expand Down
Loading

0 comments on commit 6f05d4b

Please sign in to comment.