-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserve.go
91 lines (74 loc) · 1.93 KB
/
serve.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package finger
import (
"fmt"
"net"
"io"
)
// ServeHandler accepts incoming connections from 'listener',
// deals with parsing and validating the finger-protocol request,
// and hands off the connection to 'handler' to handle.
//
// var handler finger.Handler
//
// // ...
//
// err := finger.ServeHandler(listener, handler)
// if nil != err {
// return err
// }
func ServeHandler(listener net.Listener, handler Handler) error {
if nil == handler {
return errNilHandler
}
var fn func(ResponseWriter, Request) = handler.HandleFinger
return Serve(listener, fn)
}
// Serve accepts incoming connections from 'listener',
// deals with parsing and validating the finger-protocol request,
// and hands off the connection to 'handlerFunc' to handle.
//
// var handlerFunc func(ResponseWriter, Request)
//
// // ...
//
// err := finger.Serve(listener, handler)
// if nil != err {
// return err
// }
func Serve(listener net.Listener, handlerFunc func(ResponseWriter, Request)) error {
if nil == listener {
return errNilListener
}
defer listener.Close()
if nil == handlerFunc {
return errNilHandler
}
for {
conn, err := listener.Accept()
if nil != err {
return fmt.Errorf("finger-protocol server had problem accepting incoming connection: %w", err)
}
go handle(conn, handlerFunc)
}
return nil
}
func handle(conn net.Conn, handlerFunc func(ResponseWriter, Request)) error {
if nil == conn {
return errNilConnection
}
defer conn.Close()
var request Request
{
requestline, err := ReadRequestLine(conn)
if nil != err && io.EOF != err {
return fmt.Errorf("problem reading request-line when trying to handle new finger-request: %w", err)
}
request, err = ParseRequest(requestline)
if nil != err {
return fmt.Errorf("problem parsing request-line when trying to handle new finger-request: %w", err)
}
}
var responseWriter ResponseWriter = NewResponseWriter(conn)
handlerFunc(responseWriter, request)
return nil
}