@@ -8,11 +8,13 @@ import (
8
8
"errors"
9
9
"fmt"
10
10
"io"
11
- "log"
12
11
"net"
13
12
"net/url"
13
+ "reflect"
14
14
"strings"
15
15
"time"
16
+
17
+ "github.com/a-h/gemini/log"
16
18
)
17
19
18
20
// Handler of Gemini content.
@@ -114,10 +116,6 @@ type Server struct {
114
116
HandlerTimeout time.Duration
115
117
}
116
118
117
- func (srv * Server ) logf (format string , v ... interface {}) {
118
- log .Printf (format , v ... )
119
- }
120
-
121
119
// Set the server listening on the specified port.
122
120
func (srv * Server ) ListenAndServe () error {
123
121
// Don't start if the server is already closing down.
@@ -128,7 +126,7 @@ func (srv *Server) ListenAndServe() error {
128
126
if addr == "" {
129
127
addr = ":1965"
130
128
}
131
- srv . logf ("gemini: starting on %v" , addr )
129
+ log . Info ("gemini: starting" , log . String ( "addr" , addr ) )
132
130
ln , err := net .Listen ("tcp" , addr )
133
131
if err != nil {
134
132
return err
@@ -137,15 +135,15 @@ func (srv *Server) ListenAndServe() error {
137
135
if srv .Insecure {
138
136
err = srv .serveInsecure (ln )
139
137
if err != nil {
140
- srv . logf ("gemini: failure in serveInsecure" )
138
+ log . Error ("gemini: serveInsecure failure" , err , log . String ( "addr" , addr ) )
141
139
}
142
140
} else {
143
141
err = srv .serveTLS (ln )
144
142
if err != nil {
145
- srv . logf ("gemini: failure in serveTLS: %v " , err )
143
+ log . Error ("gemini: serveTLS failure " , err , log . String ( "addr" , addr ) )
146
144
}
147
145
}
148
- srv . logf ("gemini: stopped" )
146
+ log . Info ("gemini: stopped" )
149
147
return err
150
148
}
151
149
@@ -162,12 +160,12 @@ func (srv *Server) serveInsecure(l net.Listener) (err error) {
162
160
}
163
161
for {
164
162
if err = srv .Context .Err (); err != nil {
165
- srv . logf ("gemini: context caused shutdown: %v " , err )
163
+ log . Error ("gemini: context caused shutdown" , err )
166
164
return err
167
165
}
168
166
rw , err := l .Accept ()
169
167
if err != nil {
170
- srv . logf ("gemini: insecure listener error: %v " , err )
168
+ log . Error ("gemini: insecure listener error" , err )
171
169
continue
172
170
}
173
171
go func () {
@@ -196,12 +194,12 @@ func (srv *Server) serveTLS(l net.Listener) (err error) {
196
194
tlsListener := tls .NewListener (l , config )
197
195
for {
198
196
if err = srv .Context .Err (); err != nil {
199
- srv . logf ("gemini: context caused shutdown: %v " , err )
197
+ log . Error ("gemini: context caused shutdown" , err )
200
198
return err
201
199
}
202
200
conn , err := tlsListener .Accept ()
203
201
if err != nil {
204
- srv . logf ("gemini: tls listener error: %v " , err )
202
+ log . Error ("gemini: tls listener error" , err )
205
203
continue
206
204
}
207
205
tlsConn , ok := conn .(* tls.Conn )
@@ -215,7 +213,7 @@ func (srv *Server) serveTLS(l net.Listener) (err error) {
215
213
func (srv * Server ) handleTLS (conn * tls.Conn ) {
216
214
defer conn .Close ()
217
215
if err := conn .Handshake (); err != nil {
218
- srv . logf ("gemini: failed TLS handshake from %s: %v" , conn .RemoteAddr (), err )
216
+ log . Info ("gemini: failed TLS handshake" , log . String ( "remote" , conn .RemoteAddr (). String ()), log . String ( "reason" , err . Error ()) )
219
217
return
220
218
}
221
219
var certificate Certificate
@@ -235,7 +233,7 @@ func (srv *Server) handleTLS(conn *tls.Conn) {
235
233
serverName := conn .ConnectionState ().ServerName
236
234
dh , ok := srv .DomainToHandler [serverName ]
237
235
if ! ok {
238
- srv . logf ("gemini: failed to find domain handler for serverName: %q " , serverName )
236
+ log . Warn ("gemini: failed to find domain handler" , log . String ( " serverName" , serverName ) )
239
237
}
240
238
srv .handle (dh , certificate , conn )
241
239
}
@@ -246,11 +244,10 @@ func (srv *Server) handle(dh *DomainHandler, certificate Certificate, conn net.C
246
244
conn .SetReadDeadline (time .Now ().Add (srv .ReadTimeout ))
247
245
r , ok , err := srv .parseRequest (conn )
248
246
if err != nil {
249
- srv . logf ("gemini: failed to parse request: %v" , err )
247
+ log . Info ("gemini: failed to parse request" , log . String ( "reason" , err . Error ()) )
250
248
return
251
249
}
252
250
if ! ok {
253
- srv .logf ("gemini: could not parse request" )
254
251
return
255
252
}
256
253
r .Certificate = certificate
@@ -261,7 +258,7 @@ func (srv *Server) handle(dh *DomainHandler, certificate Certificate, conn net.C
261
258
w := NewWriter (conn )
262
259
defer func () {
263
260
if p := recover (); p != nil {
264
- srv . logf ("gemini: server error: %v: %v" , r .URL .Path , p )
261
+ log . Error ("gemini: server error" , nil , log . String ( "url" , r .URL .String ()), log . Interface ( "recover" , p ) )
265
262
w .SetHeader (CodeCGIError , "internal error" )
266
263
}
267
264
}()
@@ -271,10 +268,18 @@ func (srv *Server) handle(dh *DomainHandler, certificate Certificate, conn net.C
271
268
}
272
269
dh .Handler .ServeGemini (w , r )
273
270
if w .Code == "" {
274
- srv . logf ("gemini: handler for %q resulted in empty response, sending empty document" , r .URL .Path )
271
+ log . Error ("gemini: handler resulted in empty response" , nil , log . String ( "url" , r .URL .String ()), log . String ( "handlerType" , reflect . TypeOf ( dh . Handler ). PkgPath ()) )
275
272
w .SetHeader (CodeCGIError , "empty response" )
276
273
}
277
- srv .logf ("gemini: %v response: %v time: %v" , r .URL .Path , w .Code , time .Now ().Sub (start ))
274
+ duration := time .Now ().Sub (start )
275
+ log .Info ("gemini: response" ,
276
+ log .String ("url" , r .URL .String ()),
277
+ log .String ("path" , r .URL .Path ),
278
+ log .String ("code" , w .Code ),
279
+ log .String ("handlerType" , reflect .TypeOf (dh .Handler ).PkgPath ()),
280
+ log .Int64 ("ms" , duration .Milliseconds ()),
281
+ log .Int64 ("us" , int64 (duration .Microseconds ())),
282
+ )
278
283
}
279
284
280
285
func (srv * Server ) parseRequest (rw io.ReadWriter ) (r * Request , ok bool , err error ) {
@@ -284,17 +289,18 @@ func (srv *Server) parseRequest(rw io.ReadWriter) (r *Request, ok bool, err erro
284
289
return
285
290
}
286
291
if ! ok {
292
+ log .Info ("gemini: request too long or malformed" , log .String ("request" , string (request )))
287
293
writeHeaderToWriter (CodeBadRequest , "request too long or malformed" , rw )
288
294
return
289
295
}
290
296
ok = false
291
297
url , err := url .Parse (strings .TrimSpace (string (request )))
292
298
if err != nil {
293
- srv . logf ("gemini: malformed request: %q" , string (request ))
299
+ log . Info ("gemini: malformed request" , log . String ( "request" , string (request ) ))
294
300
writeHeaderToWriter (CodeBadRequest , "request malformed" , rw )
295
301
return
296
302
}
297
- srv . logf ("gemini: received request: %s" , url )
303
+ log . Info ("gemini: received request" , log . String ( "request" , url . String ()) )
298
304
r = & Request {
299
305
URL : url ,
300
306
}
0 commit comments