99 "path/filepath"
1010
1111 "github.com/projectdiscovery/gologger"
12+ "github.com/projectdiscovery/simplehttpserver/pkg/unit"
1213)
1314
1415// Convenience globals
@@ -17,10 +18,19 @@ var (
1718 EnableVerbose bool
1819)
1920
21+ func (t * HTTPServer ) shouldDumpBody (bodysize int64 ) bool {
22+ return t .options .MaxDumpBodySize > 0 && bodysize > t .options .MaxDumpBodySize
23+ }
24+
2025func (t * HTTPServer ) loglayer (handler http.Handler ) http.Handler {
2126 return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
22- fullRequest , _ := httputil .DumpRequest (r , true )
23- lrw := newLoggingResponseWriter (w )
27+ var fullRequest []byte
28+ if t .shouldDumpBody (r .ContentLength ) {
29+ fullRequest , _ = httputil .DumpRequest (r , false )
30+ } else {
31+ fullRequest , _ = httputil .DumpRequest (r , true )
32+ }
33+ lrw := newLoggingResponseWriter (w , t .options .MaxDumpBodySize )
2434 handler .ServeHTTP (lrw , r )
2535
2636 // Handles file write if enabled
@@ -52,7 +62,7 @@ func (t *HTTPServer) loglayer(handler http.Handler) http.Handler {
5262 err error
5363 )
5464 if t .options .Sandbox {
55- maxFileSize := toMb (t .options .MaxFileSize )
65+ maxFileSize := unit . ToMb (t .options .MaxFileSize )
5666 // check header content length
5767 if r .ContentLength > maxFileSize {
5868 gologger .Print ().Msg ("request too large" )
@@ -81,24 +91,29 @@ func (t *HTTPServer) loglayer(handler http.Handler) http.Handler {
8191 lrw .Header ().Write (headers ) //nolint
8292 gologger .Print ().Msgf ("\n Remote Address: %s\n %s\n %s %d %s\n %s\n %s\n " , r .RemoteAddr , string (fullRequest ), r .Proto , lrw .statusCode , http .StatusText (lrw .statusCode ), headers .String (), string (lrw .Data ))
8393 } else {
84- gologger .Print ().Msgf ("%s \" %s %s %s\" %d %d" , r .RemoteAddr , r .Method , r .URL , r .Proto , lrw .statusCode , len ( lrw .Data ) )
94+ gologger .Print ().Msgf ("%s \" %s %s %s\" %d %d" , r .RemoteAddr , r .Method , r .URL , r .Proto , lrw .statusCode , lrw .Size )
8595 }
8696 })
8797}
8898
8999type loggingResponseWriter struct {
90100 http.ResponseWriter
91- statusCode int
92- Data []byte
101+ statusCode int
102+ Data []byte
103+ Size int
104+ MaxDumpSize int64
93105}
94106
95- func newLoggingResponseWriter (w http.ResponseWriter ) * loggingResponseWriter {
96- return & loggingResponseWriter {w , http .StatusOK , []byte {}}
107+ func newLoggingResponseWriter (w http.ResponseWriter , maxSize int64 ) * loggingResponseWriter {
108+ return & loggingResponseWriter {w , http .StatusOK , []byte {}, 0 , maxSize }
97109}
98110
99111// Write the data
100112func (lrw * loggingResponseWriter ) Write (data []byte ) (int , error ) {
101- lrw .Data = append (lrw .Data , data ... )
113+ if len (lrw .Data ) < int (lrw .MaxDumpSize ) {
114+ lrw .Data = append (lrw .Data , data ... )
115+ }
116+ lrw .Size += len (data )
102117 return lrw .ResponseWriter .Write (data )
103118}
104119
0 commit comments