1 /* 2 * Collie - An asynchronous event-driven network framework using Dlang development 3 * 4 * Copyright (C) 2015-2017 Shanghai Putao Technology Co., Ltd 5 * 6 * Developer: putao's Dlang team 7 * 8 * Licensed under the Apache-2.0 License. 9 * 10 */ 11 module collie.codec.http.session.sessiondown; 12 13 import collie.channel; 14 import collie.codec.http.session.httpsession; 15 import collie.net; 16 import collie.utils.memory; 17 import std.socket; 18 import kiss.net.TcpStream; 19 import kiss.event.task; 20 import kiss.logger; 21 22 @trusted class PipelineSessionDown : HandlerAdapter!(const(ubyte[]), StreamWriteBuffer),SessionDown 23 { 24 @property httpSession(){return _session;} 25 @property httpSession(HTTPSession session){_session = session;} 26 27 override void timeOut(Context ctx) { 28 if(_session) 29 _session.onTimeout(); 30 } 31 32 override void transportActive(Context ctx) { 33 TcpStream sock = cast(TcpStream)context.pipeline.transport; 34 _local = sock.localAddress; 35 _remote = sock.remoteAddress; 36 _loop = cast(EventLoop) sock.eventLoop(); 37 if(_session) 38 _session.onActive(); 39 } 40 41 override void transportInactive(Context ctx) { 42 if(_session) 43 _session.inActive(); 44 } 45 46 override void read(Context ctx,const(ubyte[]) msg) { 47 if(_session) 48 _session.onRead(cast(ubyte[])msg); 49 } 50 51 override void httpClose() { 52 close(context); 53 } 54 55 override void httpWrite(StreamWriteBuffer buffer) { 56 write(context,buffer,null); 57 } 58 59 override Address localAddress() { 60 return _local; 61 } 62 63 override Address remoteAddress() { 64 return _remote; 65 } 66 67 override void post(void delegate() call){ 68 _loop.postTask(newTask(call)); 69 } 70 71 private: 72 HTTPSession _session; 73 Address _local; 74 Address _remote; 75 EventLoop _loop; 76 } 77 78 79 import collie.net.server.tcpserver; 80 import collie.net.server.connection; 81 import std.exception; 82 83 @trusted class HTTPConnection : ServerConnection,SessionDown 84 { 85 this(TcpStream sock) 86 { 87 super(sock); 88 _loop = cast(EventLoop)sock.eventLoop(); 89 } 90 91 @property httpSession(){return _session;} 92 @property httpSession(HTTPSession session){_session = session;} 93 94 override void httpClose() { 95 close(); 96 } 97 override void httpWrite(StreamWriteBuffer data) { 98 write(data); 99 } 100 override Address localAddress() { 101 assert(tcpStream !is null); 102 return tcpStream.localAddress; 103 } 104 105 override Address remoteAddress() { 106 assert(tcpStream !is null); 107 return tcpStream.remoteAddress; 108 } 109 110 override void post(void delegate() call){ 111 _loop.postTask(newTask(call)); 112 } 113 protected: 114 override void onTimeOut() nothrow { 115 if(_session) { 116 try { 117 version(CollieDebugMode) warning("timeout"); 118 _session.onTimeout(); 119 } catch(Exception) {} 120 } 121 } 122 123 override void onClose() nothrow { 124 if(_session) 125 collectException(_session.inActive()); 126 // auto sock = tcpSocket(); 127 // if(sock) 128 // collectException(_loop.post!true(newTask!gcFree(sock))); 129 } 130 131 override void onActive() nothrow { 132 if(_session) 133 collectException(_session.onActive()); 134 } 135 136 override void onRead(in ubyte[] data) nothrow { 137 if(_session) 138 collectException(_session.onRead(cast(ubyte[])data)); 139 } 140 141 142 private: 143 HTTPSession _session; 144 EventLoop _loop; 145 }