Skip to content

Commit da0740f

Browse files
committed
[+] runner [+]
1 parent e4d3a29 commit da0740f

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

internal/runner/runner.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package runner
2+
3+
import (
4+
"github.com/krishpranav/httpserver/pkg/binder"
5+
"github.com/krishpranav/httpserver/pkg/httpserver"
6+
"github.com/krishpranav/httpserver/pkg/tcpserver"
7+
"github.com/projectdiscovery/gologger"
8+
)
9+
10+
type Runner struct {
11+
options *Options
12+
serverTCP *tcpserver.TCPServer
13+
httpServer *httpserver.HTTPServer
14+
}
15+
16+
// New instance of runner
17+
func New(options *Options) (*Runner, error) {
18+
r := Runner{options: options}
19+
// Check if the process can listen on the specified ip:port
20+
if !binder.CanListenOn(r.options.ListenAddress) {
21+
newListenAddress, err := binder.GetRandomListenAddress(r.options.ListenAddress)
22+
if err != nil {
23+
return nil, err
24+
}
25+
gologger.Print().Msgf("Can't listen on %s: %s - Using %s\n", r.options.ListenAddress, err, newListenAddress)
26+
r.options.ListenAddress = newListenAddress
27+
}
28+
29+
if r.options.EnableTCP {
30+
serverTCP, err := tcpserver.New(&tcpserver.Options{
31+
Listen: r.options.ListenAddress,
32+
TLS: r.options.TCPWithTLS,
33+
Domain: "local.host",
34+
Verbose: r.options.Verbose,
35+
})
36+
if err != nil {
37+
return nil, err
38+
}
39+
err = serverTCP.LoadTemplate(r.options.RulesFile)
40+
if err != nil {
41+
return nil, err
42+
}
43+
r.serverTCP = serverTCP
44+
return &r, nil
45+
}
46+
47+
httpServer, err := httpserver.New(&httpserver.Options{
48+
Folder: r.options.Folder,
49+
EnableUpload: r.options.EnableUpload,
50+
ListenAddress: r.options.ListenAddress,
51+
TLS: r.options.HTTPS,
52+
Certificate: r.options.TLSCertificate,
53+
CertificateKey: r.options.TLSKey,
54+
CertificateDomain: r.options.TLSDomain,
55+
BasicAuthUsername: r.options.username,
56+
BasicAuthPassword: r.options.password,
57+
BasicAuthReal: r.options.Realm,
58+
Verbose: r.options.Verbose,
59+
})
60+
if err != nil {
61+
return nil, err
62+
}
63+
r.httpServer = httpServer
64+
65+
return &r, nil
66+
}
67+
68+
// Run logic
69+
func (r *Runner) Run() error {
70+
if r.options.EnableTCP {
71+
gologger.Print().Msgf("Serving TCP rule based server on tcp://%s", r.options.ListenAddress)
72+
return r.serverTCP.ListenAndServe()
73+
}
74+
75+
if r.options.HTTPS {
76+
gologger.Print().Msgf("Serving %s on https://%s/", r.options.FolderAbsPath(), r.options.ListenAddress)
77+
return r.httpServer.ListenAndServeTLS()
78+
}
79+
80+
gologger.Print().Msgf("Serving %s on http://%s/", r.options.FolderAbsPath(), r.options.ListenAddress)
81+
return r.httpServer.ListenAndServe()
82+
}
83+
84+
func (r *Runner) Close() error {
85+
if r.serverTCP != nil {
86+
if err := r.serverTCP.Close(); err != nil {
87+
return err
88+
}
89+
}
90+
if r.httpServer != nil {
91+
if err := r.httpServer.Close(); err != nil {
92+
return err
93+
}
94+
}
95+
return nil
96+
}

0 commit comments

Comments
 (0)