|  | ---- Licensed to the Apache Software Foundation (ASF) under one | 
|  | -- or more contributor license agreements. See the NOTICE file | 
|  | -- distributed with this work for additional information | 
|  | -- regarding copyright ownership. The ASF licenses this file | 
|  | -- to you under the Apache License, Version 2.0 (the | 
|  | -- "License"); you may not use this file except in compliance | 
|  | -- with the License. You may obtain a copy of the License at | 
|  | -- | 
|  | --   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | -- | 
|  | -- Unless required by applicable law or agreed to in writing, | 
|  | -- software distributed under the License is distributed on an | 
|  | -- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | -- KIND, either express or implied. See the License for the | 
|  | -- specific language governing permissions and limitations | 
|  | -- under the License. | 
|  | -- | 
|  |  | 
|  | require 'TTransport' | 
|  | require 'libluasocket' | 
|  |  | 
|  | -- TSocketBase | 
|  | TSocketBase = TTransportBase:new{ | 
|  | __type = 'TSocketBase', | 
|  | timeout = 1000, | 
|  | host = 'localhost', | 
|  | port = 9090, | 
|  | handle | 
|  | } | 
|  |  | 
|  | function TSocketBase:close() | 
|  | if self.handle then | 
|  | self.handle:destroy() | 
|  | self.handle = nil | 
|  | end | 
|  | end | 
|  |  | 
|  | -- Returns a table with the fields host and port | 
|  | function TSocketBase:getSocketInfo() | 
|  | if self.handle then | 
|  | return self.handle:getsockinfo() | 
|  | end | 
|  | terror(TTransportException:new{errorCode = TTransportException.NOT_OPEN}) | 
|  | end | 
|  |  | 
|  | function TSocketBase:setTimeout(timeout) | 
|  | if timeout and ttype(timeout) == 'number' then | 
|  | if self.handle then | 
|  | self.handle:settimeout(timeout) | 
|  | end | 
|  | self.timeout = timeout | 
|  | end | 
|  | end | 
|  |  | 
|  | -- TSocket | 
|  | TSocket = TSocketBase:new{ | 
|  | __type = 'TSocket', | 
|  | host = 'localhost', | 
|  | port = 9090 | 
|  | } | 
|  |  | 
|  | function TSocket:isOpen() | 
|  | if self.handle then | 
|  | return true | 
|  | end | 
|  | return false | 
|  | end | 
|  |  | 
|  | function TSocket:open() | 
|  | if self.handle then | 
|  | self:close() | 
|  | end | 
|  |  | 
|  | -- Create local handle | 
|  | local sock, err = luasocket.create_and_connect( | 
|  | self.host, self.port, self.timeout) | 
|  | if err == nil then | 
|  | self.handle = sock | 
|  | end | 
|  |  | 
|  | if err then | 
|  | terror(TTransportException:new{ | 
|  | message = 'Could not connect to ' .. self.host .. ':' .. self.port | 
|  | .. ' (' .. err .. ')' | 
|  | }) | 
|  | end | 
|  | end | 
|  |  | 
|  | function TSocket:read(len) | 
|  | local buf = self.handle:receive(self.handle, len) | 
|  | if not buf or string.len(buf) ~= len then | 
|  | terror(TTransportException:new{errorCode = TTransportException.UNKNOWN}) | 
|  | end | 
|  | return buf | 
|  | end | 
|  |  | 
|  | function TSocket:write(buf) | 
|  | self.handle:send(self.handle, buf) | 
|  | end | 
|  |  | 
|  | function TSocket:flush() | 
|  | end | 
|  |  | 
|  | -- TServerSocket | 
|  | TServerSocket = TSocketBase:new{ | 
|  | __type = 'TServerSocket', | 
|  | host = 'localhost', | 
|  | port = 9090 | 
|  | } | 
|  |  | 
|  | function TServerSocket:listen() | 
|  | if self.handle then | 
|  | self:close() | 
|  | end | 
|  |  | 
|  | local sock, err = luasocket.create(self.host, self.port) | 
|  | if not err then | 
|  | self.handle = sock | 
|  | else | 
|  | terror(err) | 
|  | end | 
|  | self.handle:settimeout(self.timeout) | 
|  | self.handle:listen() | 
|  | end | 
|  |  | 
|  | function TServerSocket:accept() | 
|  | local client, err = self.handle:accept() | 
|  | if err then | 
|  | terror(err) | 
|  | end | 
|  | return TSocket:new({handle = client}) | 
|  | end |