00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #include "config.h"
00025
00026 #include <scalestack/kernel/module.h>
00027 #include <scalestack/kernel/option.h>
00028 #include <scalestack/proxy/client.h>
00029 #include <scalestack/proxy/server.h>
00030 #include <scalestack/proxy/server_service.h>
00031
00032 namespace scalestack
00033 {
00034 namespace proxy
00035 {
00036
00037
00038
00039
00040
00041 client::client(kernel::module& module, server_service& server_service):
00042 network::stream(module),
00043 _binding(),
00044 _shutdown(),
00045 _shutdown_write(),
00046 _size(),
00047 _buffer(),
00048 _server(),
00049 _server_service(server_service)
00050 {
00051 }
00052
00053 void client::shutdown(void)
00054 {
00055 _shutdown = true;
00056 if (_server == NULL)
00057 {
00058 if (_binding)
00059 {
00060 if (_server_service.remove_client(this))
00061 stop();
00062 else
00063 run_now();
00064 }
00065 else
00066 stop();
00067 }
00068 else
00069 run_now();
00070 }
00071
00072 void client::timer_expired(void)
00073 {
00074 shutdown();
00075 }
00076
00077 void client::run(void)
00078 {
00079 if (_server != NULL)
00080 _server->run_now();
00081 }
00082
00083 void client::connected(void)
00084 {
00085 _binding = true;
00086 _server_service.add_client(this);
00087 set_timer(_module.get_option("server_timeout").get_size_value() * 1000);
00088 }
00089
00090 void client::set_server(server* server)
00091 {
00092 set_timer(0);
00093 _server = server;
00094 if (_shutdown)
00095 run_now();
00096 else
00097 continue_write();
00098 }
00099
00100 size_t client::read(uint8_t* buffer, size_t size)
00101 {
00102 _size = size;
00103 _buffer = buffer;
00104 return _server_write();
00105 }
00106
00107 void client::read_eof(void)
00108 {
00109 if (!_shutdown)
00110 {
00111 if (_size == 0)
00112 _server->shutdown_write();
00113 else
00114 _shutdown_write = true;
00115 }
00116 }
00117
00118 void client::flush_write(void)
00119 {
00120 if (!_shutdown)
00121 _server->continue_write();
00122 }
00123
00124 void client::continue_write(void)
00125 {
00126 consume(_server_write());
00127 }
00128
00129
00130
00131
00132
00133 size_t client::_server_write(void)
00134 {
00135 if (_server == NULL || _shutdown)
00136 return 0;
00137
00138 size_t written = _server->write(_buffer, _size, true);
00139 _size -= written;
00140 _buffer += written;
00141
00142 if (_shutdown_write && _size == 0)
00143 _server->shutdown_write();
00144
00145 return written;
00146 }
00147
00148 }
00149 }