@@ -128,6 +128,15 @@ type Client struct {
128
128
Device * Device
129
129
}
130
130
131
+ type parserConfig struct {
132
+ Mode int
133
+ UseSort bool
134
+ DebugMode bool
135
+ CacheSize int
136
+ MissesThreshold uint64
137
+ MatchIdxNotOk int
138
+ }
139
+
131
140
type Parser struct {
132
141
/* atomic operation are done on the following unit64.
133
142
* These must be 64bit aligned. On 32bit architectures
@@ -136,12 +145,10 @@ type Parser struct {
136
145
OsMisses uint64
137
146
DeviceMisses uint64
138
147
148
+ config * parserConfig
139
149
cache * cache
140
150
141
151
RegexesDefinitions
142
- Mode int
143
- UseSort bool
144
- debugMode bool
145
152
}
146
153
147
154
const (
@@ -152,11 +159,8 @@ const (
152
159
cDefaultMissesTreshold = 500000
153
160
cDefaultMatchIdxNotOk = 20
154
161
cDefaultSortOption = false
155
- )
156
-
157
- var (
158
- missesTreshold = uint64 (500000 )
159
- matchIdxNotOk = 20
162
+ cDefaultDebugMode = false
163
+ cDefaultCacheSize = 1024
160
164
)
161
165
162
166
func (parser * Parser ) mustCompile () { // until we can use yaml.UnmarshalYAML with embedded pointer struct
@@ -174,24 +178,46 @@ func (parser *Parser) mustCompile() { // until we can use yaml.UnmarshalYAML wit
174
178
}
175
179
}
176
180
177
- func NewWithOptions (regexFile string , mode , treshold , topCnt int , useSort , debugMode bool ) (* Parser , error ) {
178
- data , err := os .ReadFile (regexFile )
181
+ func defaultParserConfig () * parserConfig {
182
+ return & parserConfig {
183
+ Mode : EOsLookUpMode | EUserAgentLookUpMode | EDeviceLookUpMode ,
184
+ UseSort : cDefaultSortOption ,
185
+ DebugMode : cDefaultDebugMode ,
186
+ CacheSize : cDefaultCacheSize ,
187
+ MissesThreshold : cMinMissesTreshold ,
188
+ MatchIdxNotOk : cDefaultMatchIdxNotOk ,
189
+ }
190
+ }
191
+
192
+ func NewWithOptions (regexFile string , mode , treshold , topCnt int , useSort , debugMode bool , cacheSize int ) (* Parser , error ) {
193
+ data , err := ioutil .ReadFile (regexFile )
179
194
if nil != err {
180
195
return nil , err
181
196
}
197
+
198
+ cfg := & parserConfig {
199
+ Mode : mode ,
200
+ UseSort : useSort ,
201
+ DebugMode : debugMode ,
202
+ MatchIdxNotOk : cDefaultMatchIdxNotOk ,
203
+ MissesThreshold : cDefaultMissesTreshold ,
204
+ CacheSize : cDefaultCacheSize ,
205
+ }
206
+
182
207
if topCnt >= 0 {
183
- matchIdxNotOk = topCnt
208
+ cfg . MatchIdxNotOk = topCnt
184
209
}
185
210
if treshold > cMinMissesTreshold {
186
- missesTreshold = uint64 (treshold )
211
+ cfg .MissesThreshold = uint64 (treshold )
212
+ }
213
+ if cacheSize > 0 {
214
+ cfg .CacheSize = cacheSize
187
215
}
188
- parser , err := NewFromBytes (data )
216
+
217
+ parser , err := newFromBytes (data , cfg )
189
218
if err != nil {
190
219
return nil , err
191
220
}
192
- parser .Mode = mode
193
- parser .UseSort = useSort
194
- parser .debugMode = debugMode
195
221
return parser , nil
196
222
}
197
223
@@ -200,17 +226,15 @@ func New(regexFile string) (*Parser, error) {
200
226
if nil != err {
201
227
return nil , err
202
228
}
203
- matchIdxNotOk = cDefaultMatchIdxNotOk
204
- missesTreshold = cDefaultMissesTreshold
205
- parser , err := NewFromBytes (data )
229
+ parser , err := newFromBytes (data , defaultParserConfig ())
206
230
if err != nil {
207
231
return nil , err
208
232
}
209
233
return parser , nil
210
234
}
211
235
212
236
func NewFromSaved () * Parser {
213
- parser , err := NewFromBytes (DefinitionYaml )
237
+ parser , err := newFromBytes (DefinitionYaml , defaultParserConfig () )
214
238
if err != nil {
215
239
// if the YAML is malformed, it's a programmatic error inside what
216
240
// we've statically-compiled in our binary. Panic!
@@ -220,9 +244,13 @@ func NewFromSaved() *Parser {
220
244
}
221
245
222
246
func NewFromBytes (data []byte ) (* Parser , error ) {
247
+ return newFromBytes (data , defaultParserConfig ())
248
+ }
249
+
250
+ func newFromBytes (data []byte , config * parserConfig ) (* Parser , error ) {
223
251
parser := & Parser {
224
- Mode : EOsLookUpMode | EUserAgentLookUpMode | EDeviceLookUpMode ,
225
- cache : newCache (),
252
+ config : config ,
253
+ cache : newCache (config . CacheSize ),
226
254
}
227
255
if err := yaml .Unmarshal (data , & parser .RegexesDefinitions ); err != nil {
228
256
return nil , err
@@ -236,7 +264,7 @@ func NewFromBytes(data []byte) (*Parser, error) {
236
264
func (parser * Parser ) Parse (line string ) * Client {
237
265
cli := new (Client )
238
266
var wg sync.WaitGroup
239
- if EUserAgentLookUpMode & parser .Mode == EUserAgentLookUpMode {
267
+ if EUserAgentLookUpMode & parser .config . Mode == EUserAgentLookUpMode {
240
268
wg .Add (1 )
241
269
go func () {
242
270
defer wg .Done ()
@@ -245,7 +273,7 @@ func (parser *Parser) Parse(line string) *Client {
245
273
parser .RUnlock ()
246
274
}()
247
275
}
248
- if EOsLookUpMode & parser .Mode == EOsLookUpMode {
276
+ if EOsLookUpMode & parser .config . Mode == EOsLookUpMode {
249
277
wg .Add (1 )
250
278
go func () {
251
279
defer wg .Done ()
@@ -254,7 +282,7 @@ func (parser *Parser) Parse(line string) *Client {
254
282
parser .RUnlock ()
255
283
}()
256
284
}
257
- if EDeviceLookUpMode & parser .Mode == EDeviceLookUpMode {
285
+ if EDeviceLookUpMode & parser .config . Mode == EDeviceLookUpMode {
258
286
wg .Add (1 )
259
287
go func () {
260
288
defer wg .Done ()
@@ -264,7 +292,7 @@ func (parser *Parser) Parse(line string) *Client {
264
292
}()
265
293
}
266
294
wg .Wait ()
267
- if parser .UseSort {
295
+ if parser .config . UseSort {
268
296
checkAndSort (parser )
269
297
}
270
298
return cli
@@ -290,7 +318,7 @@ func (parser *Parser) ParseUserAgent(line string) *UserAgent {
290
318
if ! found {
291
319
ua .Family = "Other"
292
320
}
293
- if foundIdx > matchIdxNotOk {
321
+ if foundIdx > parser . config . MatchIdxNotOk {
294
322
atomic .AddUint64 (& parser .UserAgentMisses , 1 )
295
323
}
296
324
parser .cache .userAgent .Add (line , ua )
@@ -318,7 +346,7 @@ func (parser *Parser) ParseOs(line string) *Os {
318
346
if ! found {
319
347
os .Family = "Other"
320
348
}
321
- if foundIdx > matchIdxNotOk {
349
+ if foundIdx > parser . config . MatchIdxNotOk {
322
350
atomic .AddUint64 (& parser .OsMisses , 1 )
323
351
}
324
352
@@ -347,7 +375,7 @@ func (parser *Parser) ParseDevice(line string) *Device {
347
375
if ! found {
348
376
dvc .Family = "Other"
349
377
}
350
- if foundIdx > matchIdxNotOk {
378
+ if foundIdx > parser . config . MatchIdxNotOk {
351
379
atomic .AddUint64 (& parser .DeviceMisses , 1 )
352
380
}
353
381
@@ -357,26 +385,26 @@ func (parser *Parser) ParseDevice(line string) *Device {
357
385
358
386
func checkAndSort (parser * Parser ) {
359
387
parser .Lock ()
360
- if atomic .LoadUint64 (& parser .UserAgentMisses ) >= missesTreshold {
361
- if parser .debugMode {
388
+ if atomic .LoadUint64 (& parser .UserAgentMisses ) >= parser . config . MissesThreshold {
389
+ if parser .config . DebugMode {
362
390
fmt .Printf ("%s\t Sorting UserAgents slice\n " , time .Now ())
363
391
}
364
392
parser .UserAgentMisses = 0
365
393
sort .Sort (UserAgentSorter (parser .UA ))
366
394
}
367
395
parser .Unlock ()
368
396
parser .Lock ()
369
- if atomic .LoadUint64 (& parser .OsMisses ) >= missesTreshold {
370
- if parser .debugMode {
397
+ if atomic .LoadUint64 (& parser .OsMisses ) >= parser . config . MissesThreshold {
398
+ if parser .config . DebugMode {
371
399
fmt .Printf ("%s\t Sorting OS slice\n " , time .Now ())
372
400
}
373
401
parser .OsMisses = 0
374
402
sort .Sort (OsSorter (parser .OS ))
375
403
}
376
404
parser .Unlock ()
377
405
parser .Lock ()
378
- if atomic .LoadUint64 (& parser .DeviceMisses ) >= missesTreshold {
379
- if parser .debugMode {
406
+ if atomic .LoadUint64 (& parser .DeviceMisses ) >= parser . config . MissesThreshold {
407
+ if parser .config . DebugMode {
380
408
fmt .Printf ("%s\t Sorting Device slice\n " , time .Now ())
381
409
}
382
410
parser .DeviceMisses = 0
0 commit comments