354 readlist[ readlen ] = socket |
354 readlist[ readlen ] = socket |
355 |
355 |
356 return handler, socket |
356 return handler, socket |
357 end |
357 end |
358 |
358 |
|
359 wraptlsclient = function( listener, socket, ip, serverport, clientport, mode, sslctx ) -- this function wraps a tls cleint |
|
360 |
|
361 local dispatch, disconnect = listener.listener, listener.disconnect |
|
362 |
|
363 --// transform socket to ssl object //-- |
|
364 |
|
365 local err |
|
366 |
|
367 socket:settimeout( 0 ) |
|
368 |
|
369 --// private closures of the object //-- |
|
370 |
|
371 local writequeue = { } -- buffer for messages to send |
|
372 |
|
373 local eol -- end of buffer |
|
374 |
|
375 local sstat, rstat = 0, 0 |
|
376 |
|
377 --// local import of socket methods //-- |
|
378 |
|
379 local send = socket.send |
|
380 local receive = socket.receive |
|
381 local close = socket.close |
|
382 --local shutdown = socket.shutdown |
|
383 |
|
384 --// public methods of the object //-- |
|
385 |
|
386 local handler = { } |
|
387 |
|
388 handler.getstats = function( ) |
|
389 return rstat, sstat |
|
390 end |
|
391 |
|
392 handler.listener = function( data, err ) |
|
393 return listener( handler, data, err ) |
|
394 end |
|
395 handler.ssl = function( ) |
|
396 return false |
|
397 end |
|
398 handler.send = function( _, data, i, j ) |
|
399 return send( socket, data, i, j ) |
|
400 end |
|
401 handler.receive = function( pattern, prefix ) |
|
402 return receive( socket, pattern, prefix ) |
|
403 end |
|
404 handler.shutdown = function( pattern ) |
|
405 --return shutdown( socket, pattern ) |
|
406 end |
|
407 handler.close = function( closed ) |
|
408 close( socket ) |
|
409 writelen = ( eol and removesocket( writelist, socket, writelen ) ) or writelen |
|
410 readlen = removesocket( readlist, socket, readlen ) |
|
411 socketlist[ socket ] = nil |
|
412 out_put "server.lua: closed handler and removed socket from list" |
|
413 end |
|
414 handler.ip = function( ) |
|
415 return ip |
|
416 end |
|
417 handler.serverport = function( ) |
|
418 return serverport |
|
419 end |
|
420 handler.clientport = function( ) |
|
421 return clientport |
|
422 end |
|
423 |
|
424 handler.write = function( data ) |
|
425 if not eol then |
|
426 writelen = writelen + 1 |
|
427 writelist[ writelen ] = socket |
|
428 eol = 0 |
|
429 end |
|
430 eol = eol + 1 |
|
431 writequeue[ eol ] = data |
|
432 end |
|
433 handler.writequeue = function( ) |
|
434 return writequeue |
|
435 end |
|
436 handler.socket = function( ) |
|
437 return socket |
|
438 end |
|
439 handler.mode = function( ) |
|
440 return mode |
|
441 end |
|
442 handler._receivedata = function( ) |
|
443 local data, err, part = receive( socket, mode ) -- receive data in "mode" |
|
444 if not err or ( err == "timeout" or err == "wantread" ) then -- received something |
|
445 local data = data or part or "" |
|
446 local count = #data * STAT_UNIT |
|
447 rstat = rstat + count |
|
448 receivestat = receivestat + count |
|
449 out_put( "server.lua: read data '", data, "', error: ", err ) |
|
450 return dispatch( handler, data, err ) |
|
451 else -- connections was closed or fatal error |
|
452 out_put( "server.lua: client ", ip, ":", clientport, " error: ", err ) |
|
453 handler.close( ) |
|
454 disconnect( handler, err ) |
|
455 writequeue = nil |
|
456 handler = nil |
|
457 return false |
|
458 end |
|
459 end |
|
460 handler._dispatchdata = function( ) -- this function writes data to handlers |
|
461 local buffer = table_concat( writequeue, "", 1, eol ) |
|
462 local succ, err, byte = send( socket, buffer ) |
|
463 local count = ( succ or 0 ) * STAT_UNIT |
|
464 sstat = sstat + count |
|
465 sendstat = sendstat + count |
|
466 out_put( "server.lua: sended '", buffer, "', bytes: ", succ, ", error: ", err, ", part: ", byte, ", to: ", ip, ":", clientport ) |
|
467 if succ then -- sending succesful |
|
468 --writequeue = { } |
|
469 eol = nil |
|
470 writelen = removesocket( writelist, socket, writelen ) -- delete socket from writelist |
|
471 if handler.need_tls then |
|
472 out_put("server.lua: connection is ready for tls handshake"); |
|
473 handler.need_tls = not handler.starttls(true); |
|
474 end |
|
475 return true |
|
476 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write |
|
477 buffer = string_sub( buffer, byte + 1, -1 ) -- new buffer |
|
478 writequeue[ 1 ] = buffer -- insert new buffer in queue |
|
479 eol = 1 |
|
480 return true |
|
481 else -- connection was closed during sending or fatal error |
|
482 out_put( "server.lua: client ", ip, ":", clientport, " error: ", err ) |
|
483 handler.close( ) |
|
484 disconnect( handler, err ) |
|
485 writequeue = nil |
|
486 handler = nil |
|
487 return false |
|
488 end |
|
489 end |
|
490 |
|
491 handler.receivedata, handler.dispatchdata = handler._receivedata, handler._dispatchdata; |
|
492 -- // COMPAT // -- |
|
493 |
|
494 handler.getIp = handler.ip |
|
495 handler.getPort = handler.clientport |
|
496 |
|
497 --// handshake //-- |
|
498 |
|
499 local wrote, read |
|
500 |
|
501 handler.starttls = function (now) |
|
502 if not now then handler.need_tls = true; return; end |
|
503 out_put( "server.lua: attempting to start tls on "..tostring(socket) ) |
|
504 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket |
|
505 out_put("sslwrapped socket is "..tostring(socket)); |
|
506 if err then |
|
507 out_put( "server.lua: ssl error: ", err ) |
|
508 return nil, nil, err -- fatal error |
|
509 end |
|
510 socket:settimeout( 1 ) |
|
511 send = socket.send |
|
512 receive = socket.receive |
|
513 close = socket.close |
|
514 print(readlen, writelen) |
|
515 for _, s in ipairs(readlist) do print("R:", tostring(s)) end |
|
516 for _, s in ipairs(writelist) do print("W:", tostring(s)) end |
|
517 handler.ssl = function( ) |
|
518 return true |
|
519 end |
|
520 handler.send = function( _, data, i, j ) |
|
521 return send( socket, data, i, j ) |
|
522 end |
|
523 handler.receive = function( pattern, prefix ) |
|
524 return receive( socket, pattern, prefix ) |
|
525 end |
|
526 |
|
527 handler.handshake = function (conn) |
|
528 local succ, msg |
|
529 out_put("ssl handshaking on socket "..tostring(conn)) |
|
530 conn:settimeout() |
|
531 while not succ do |
|
532 succ, msg = conn:dohandshake() |
|
533 out_put("msg: "..tostring(msg)) |
|
534 if msg == 'wantread' then |
|
535 socket_select({conn}, nil) |
|
536 elseif msg == 'wantwrite' then |
|
537 socket_select(nil, {conn}) |
|
538 elseif not succ then |
|
539 -- other error |
|
540 _ = err ~= "closed" and close( socket ) |
|
541 handler.close( ) |
|
542 disconnect( handler, err ) |
|
543 writequeue = nil |
|
544 handler = nil |
|
545 out_error("server.lua: ssl handshake failed"); |
|
546 return false -- handshake failed |
|
547 end |
|
548 |
|
549 end |
|
550 out_put("server.lua: ssl handshake succeeded!"); |
|
551 handler.receivedata = handler._receivedata; |
|
552 handler.dispatchdata = handler._dispatchdata; |
|
553 return true; |
|
554 end |
|
555 |
|
556 handler.receivedata = handler.handshake |
|
557 handler.dispatchdata = handler.handshake |
|
558 |
|
559 return handler.handshake( socket ) -- do handshake |
|
560 end |
|
561 |
|
562 socketlist[ socket ] = handler |
|
563 readlen = readlen + 1 |
|
564 readlist[ readlen ] = socket |
|
565 |
|
566 return handler, socket |
|
567 end |
|
568 |
359 wraptcpclient = function( listener, socket, ip, serverport, clientport, mode ) -- this function wraps a socket |
569 wraptcpclient = function( listener, socket, ip, serverport, clientport, mode ) -- this function wraps a socket |
360 |
570 |
361 local dispatch, disconnect = listener.listener, listener.disconnect |
571 local dispatch, disconnect = listener.listener, listener.disconnect |
362 |
572 |
363 --// private closures of the object //-- |
573 --// private closures of the object //-- |