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 }