14 Star 50 Fork 12

Hprose/hprose-go

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
filter.go 3.73 KB
一键复制 编辑 原始数据 按行查看 历史
/**********************************************************\
| |
| hprose |
| |
| Official WebSite: http://www.hprose.com/ |
| http://www.hprose.org/ |
| |
\**********************************************************/
/**********************************************************\
* *
* rpc/filter.go *
* *
* hprose filter interface for Go. *
* *
* LastModified: May 22, 2017 *
* Author: Ma Bingyao <andot@hprose.com> *
* *
\**********************************************************/
package rpc
import "sync"
// Filter is hprose filter
type Filter interface {
InputFilter(data []byte, context Context) []byte
OutputFilter(data []byte, context Context) []byte
}
// filterManager is the filter manager
type filterManager struct {
filters []Filter
fmLocker sync.RWMutex
}
// Filter return the first filter
func (fm *filterManager) Filter() Filter {
fm.fmLocker.RLock()
defer fm.fmLocker.RUnlock()
if len(fm.filters) == 0 {
return nil
}
return fm.filters[0]
}
// NumFilter return the filter count
func (fm *filterManager) NumFilter() int {
fm.fmLocker.RLock()
defer fm.fmLocker.RUnlock()
return len(fm.filters)
}
// FilterByIndex return the filter by index
func (fm *filterManager) FilterByIndex(index int) Filter {
fm.fmLocker.RLock()
defer fm.fmLocker.RUnlock()
n := len(fm.filters)
if index < 0 && index >= n {
return nil
}
return fm.filters[index]
}
// SetFilter will replace the current filter settings
func (fm *filterManager) SetFilter(filter ...Filter) {
fm.fmLocker.Lock()
fm.filters = make([]Filter, len(filter))
fm.AddFilter(filter...)
fm.fmLocker.Unlock()
}
// AddFilter add the filter to this FilterManager
func (fm *filterManager) AddFilter(filter ...Filter) {
fm.fmLocker.Lock()
if len(filter) > 0 {
fm.filters = append(fm.filters, filter...)
}
fm.fmLocker.Unlock()
}
// RemoveFilterByIndex remove the filter by the index
func (fm *filterManager) RemoveFilterByIndex(index int) {
fm.fmLocker.Lock()
n := len(fm.filters)
if index < 0 && index >= n {
fm.fmLocker.Unlock()
return
}
if index == n-1 {
fm.filters = fm.filters[:index]
} else {
fm.filters = append(fm.filters[:index], fm.filters[index+1:]...)
}
fm.fmLocker.Unlock()
}
func (fm *filterManager) removeFilter(filter Filter) {
for i := range fm.filters {
if fm.filters[i] == filter {
fm.RemoveFilterByIndex(i)
return
}
}
}
// RemoveFilter remove the filter from this FilterManager
func (fm *filterManager) RemoveFilter(filter ...Filter) {
for i := range filter {
fm.removeFilter(filter[i])
}
}
func (fm *filterManager) inputFilter(data []byte, context Context) (out []byte, err error) {
fm.fmLocker.RLock()
defer func() {
if e := recover(); e != nil {
err = NewPanicError(e)
}
fm.fmLocker.RUnlock()
}()
for i := len(fm.filters) - 1; i >= 0; i-- {
data = fm.filters[i].InputFilter(data, context)
}
out = data
return
}
func (fm *filterManager) outputFilter(data []byte, context Context) (out []byte, err error) {
fm.fmLocker.RLock()
defer func() {
if e := recover(); e != nil {
err = NewPanicError(e)
}
defer fm.fmLocker.RUnlock()
}()
for i := range fm.filters {
data = fm.filters[i].OutputFilter(data, context)
}
out = data
return
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/andot/hprose-go.git
git@gitee.com:andot/hprose-go.git
andot
hprose-go
hprose-go
v2.0.4

搜索帮助