| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /*
- * 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.
- */
- package thrift
- import (
- "log"
- "runtime/debug"
- "sync"
- )
- // Simple, non-concurrent server for testing.
- type TSimpleServer struct {
- quit chan struct{}
- processorFactory TProcessorFactory
- serverTransport TServerTransport
- inputTransportFactory TTransportFactory
- outputTransportFactory TTransportFactory
- inputProtocolFactory TProtocolFactory
- outputProtocolFactory TProtocolFactory
- }
- func NewTSimpleServer2(processor TProcessor, serverTransport TServerTransport) *TSimpleServer {
- return NewTSimpleServerFactory2(NewTProcessorFactory(processor), serverTransport)
- }
- func NewTSimpleServer4(processor TProcessor, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory) *TSimpleServer {
- return NewTSimpleServerFactory4(NewTProcessorFactory(processor),
- serverTransport,
- transportFactory,
- protocolFactory,
- )
- }
- func NewTSimpleServer6(processor TProcessor, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory) *TSimpleServer {
- return NewTSimpleServerFactory6(NewTProcessorFactory(processor),
- serverTransport,
- inputTransportFactory,
- outputTransportFactory,
- inputProtocolFactory,
- outputProtocolFactory,
- )
- }
- func NewTSimpleServerFactory2(processorFactory TProcessorFactory, serverTransport TServerTransport) *TSimpleServer {
- return NewTSimpleServerFactory6(processorFactory,
- serverTransport,
- NewTTransportFactory(),
- NewTTransportFactory(),
- NewTBinaryProtocolFactoryDefault(),
- NewTBinaryProtocolFactoryDefault(),
- )
- }
- func NewTSimpleServerFactory4(processorFactory TProcessorFactory, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory) *TSimpleServer {
- return NewTSimpleServerFactory6(processorFactory,
- serverTransport,
- transportFactory,
- transportFactory,
- protocolFactory,
- protocolFactory,
- )
- }
- func NewTSimpleServerFactory6(processorFactory TProcessorFactory, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory) *TSimpleServer {
- return &TSimpleServer{
- processorFactory: processorFactory,
- serverTransport: serverTransport,
- inputTransportFactory: inputTransportFactory,
- outputTransportFactory: outputTransportFactory,
- inputProtocolFactory: inputProtocolFactory,
- outputProtocolFactory: outputProtocolFactory,
- quit: make(chan struct{}, 1),
- }
- }
- func (p *TSimpleServer) ProcessorFactory() TProcessorFactory {
- return p.processorFactory
- }
- func (p *TSimpleServer) ServerTransport() TServerTransport {
- return p.serverTransport
- }
- func (p *TSimpleServer) InputTransportFactory() TTransportFactory {
- return p.inputTransportFactory
- }
- func (p *TSimpleServer) OutputTransportFactory() TTransportFactory {
- return p.outputTransportFactory
- }
- func (p *TSimpleServer) InputProtocolFactory() TProtocolFactory {
- return p.inputProtocolFactory
- }
- func (p *TSimpleServer) OutputProtocolFactory() TProtocolFactory {
- return p.outputProtocolFactory
- }
- func (p *TSimpleServer) Listen() error {
- return p.serverTransport.Listen()
- }
- func (p *TSimpleServer) AcceptLoop() error {
- for {
- client, err := p.serverTransport.Accept()
- if err != nil {
- select {
- case <-p.quit:
- return nil
- default:
- }
- return err
- }
- if client != nil {
- go func() {
- if err := p.processRequests(client); err != nil {
- log.Println("error processing request:", err)
- }
- }()
- }
- }
- }
- func (p *TSimpleServer) Serve() error {
- err := p.Listen()
- if err != nil {
- return err
- }
- p.AcceptLoop()
- return nil
- }
- var once sync.Once
- func (p *TSimpleServer) Stop() error {
- q := func() {
- p.quit <- struct{}{}
- p.serverTransport.Interrupt()
- }
- once.Do(q)
- return nil
- }
- func (p *TSimpleServer) processRequests(client TTransport) error {
- processor := p.processorFactory.GetProcessor(client)
- inputTransport := p.inputTransportFactory.GetTransport(client)
- outputTransport := p.outputTransportFactory.GetTransport(client)
- inputProtocol := p.inputProtocolFactory.GetProtocol(inputTransport)
- outputProtocol := p.outputProtocolFactory.GetProtocol(outputTransport)
- defer func() {
- if e := recover(); e != nil {
- log.Printf("panic in processor: %s: %s", e, debug.Stack())
- }
- }()
- if inputTransport != nil {
- defer inputTransport.Close()
- }
- if outputTransport != nil {
- defer outputTransport.Close()
- }
- for {
- ok, err := processor.Process(inputProtocol, outputProtocol)
- if err, ok := err.(TTransportException); ok && err.TypeId() == END_OF_FILE {
- return nil
- } else if err != nil {
- log.Printf("error processing request: %s", err)
- return err
- }
- if err, ok := err.(TApplicationException); ok && err.TypeId() == UNKNOWN_METHOD {
- continue
- }
- if !ok {
- break
- }
- }
- return nil
- }
|