device_detector 1.0.0 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +58 -4
  3. data/README.md +57 -21
  4. data/lib/device_detector/bot.rb +2 -2
  5. data/lib/device_detector/browser.rb +691 -0
  6. data/lib/device_detector/client.rb +11 -2
  7. data/lib/device_detector/client_hint.rb +249 -0
  8. data/lib/device_detector/device.rb +1954 -23
  9. data/lib/device_detector/memory_cache.rb +26 -19
  10. data/lib/device_detector/metadata_extractor.rb +7 -8
  11. data/lib/device_detector/model_extractor.rb +3 -3
  12. data/lib/device_detector/name_extractor.rb +2 -2
  13. data/lib/device_detector/os.rb +289 -112
  14. data/lib/device_detector/parser.rb +49 -13
  15. data/lib/device_detector/vendor_fragment.rb +25 -0
  16. data/lib/device_detector/version.rb +3 -1
  17. data/lib/device_detector/version_extractor.rb +29 -2
  18. data/lib/device_detector.rb +192 -44
  19. data/regexes/bots.yml +3399 -91
  20. data/regexes/client/browser_engine.yml +28 -4
  21. data/regexes/client/browsers.yml +2697 -408
  22. data/regexes/client/feed_readers.yml +60 -22
  23. data/regexes/client/hints/apps.yml +150 -0
  24. data/regexes/client/hints/browsers.yml +292 -0
  25. data/regexes/client/libraries.yml +598 -4
  26. data/regexes/client/mediaplayers.yml +110 -5
  27. data/regexes/client/mobile_apps.yml +2451 -14
  28. data/regexes/client/pim.yml +128 -3
  29. data/regexes/device/cameras.yml +6 -6
  30. data/regexes/device/car_browsers.yml +39 -3
  31. data/regexes/device/consoles.yml +40 -6
  32. data/regexes/device/mobiles.yml +38844 -2907
  33. data/regexes/device/notebooks.yml +127 -0
  34. data/regexes/device/portable_media_player.yml +75 -12
  35. data/regexes/device/shell_tv.yml +145 -0
  36. data/regexes/device/televisions.yml +981 -40
  37. data/regexes/oss.yml +1560 -311
  38. data/regexes/vendorfragments.yml +6 -2
  39. metadata +31 -105
  40. data/.gitignore +0 -14
  41. data/.travis.yml +0 -18
  42. data/Gemfile +0 -8
  43. data/Rakefile +0 -79
  44. data/device_detector.gemspec +0 -26
  45. data/spec/device_detector/bot_fixtures_spec.rb +0 -30
  46. data/spec/device_detector/client_fixtures_spec.rb +0 -31
  47. data/spec/device_detector/concrete_user_agent_spec.rb +0 -136
  48. data/spec/device_detector/detector_fixtures_spec.rb +0 -60
  49. data/spec/device_detector/device_fixtures_spec.rb +0 -36
  50. data/spec/device_detector/device_spec.rb +0 -151
  51. data/spec/device_detector/memory_cache_spec.rb +0 -116
  52. data/spec/device_detector/model_extractor_spec.rb +0 -63
  53. data/spec/device_detector/os_fixtures_spec.rb +0 -26
  54. data/spec/device_detector/version_extractor_spec.rb +0 -80
  55. data/spec/device_detector_spec.rb +0 -198
  56. data/spec/fixtures/client/browser.yml +0 -1313
  57. data/spec/fixtures/client/feed_reader.yml +0 -187
  58. data/spec/fixtures/client/library.yml +0 -84
  59. data/spec/fixtures/client/mediaplayer.yml +0 -168
  60. data/spec/fixtures/client/mobile_app.yml +0 -30
  61. data/spec/fixtures/client/pim.yml +0 -96
  62. data/spec/fixtures/detector/bots.yml +0 -2418
  63. data/spec/fixtures/detector/camera.yml +0 -115
  64. data/spec/fixtures/detector/car_browser.yml +0 -20
  65. data/spec/fixtures/detector/console.yml +0 -267
  66. data/spec/fixtures/detector/desktop.yml +0 -4828
  67. data/spec/fixtures/detector/feature_phone.yml +0 -782
  68. data/spec/fixtures/detector/feed_reader.yml +0 -486
  69. data/spec/fixtures/detector/mediaplayer.yml +0 -179
  70. data/spec/fixtures/detector/mobile_apps.yml +0 -149
  71. data/spec/fixtures/detector/phablet.yml +0 -2140
  72. data/spec/fixtures/detector/portable_media_player.yml +0 -153
  73. data/spec/fixtures/detector/smart_display.yml +0 -58
  74. data/spec/fixtures/detector/smartphone-1.yml +0 -9469
  75. data/spec/fixtures/detector/smartphone-2.yml +0 -9414
  76. data/spec/fixtures/detector/smartphone-3.yml +0 -9396
  77. data/spec/fixtures/detector/smartphone-4.yml +0 -5742
  78. data/spec/fixtures/detector/smartphone.yml +0 -9411
  79. data/spec/fixtures/detector/tablet-1.yml +0 -9495
  80. data/spec/fixtures/detector/tablet-2.yml +0 -248
  81. data/spec/fixtures/detector/tablet.yml +0 -9484
  82. data/spec/fixtures/detector/tv.yml +0 -2582
  83. data/spec/fixtures/detector/unknown.yml +0 -3196
  84. data/spec/fixtures/device/camera.yml +0 -18
  85. data/spec/fixtures/device/car_browser.yml +0 -6
  86. data/spec/fixtures/device/console.yml +0 -78
  87. data/spec/fixtures/parser/oss.yml +0 -800
  88. data/spec/fixtures/parser/vendorfragments.yml +0 -162
  89. data/spec/spec_helper.rb +0 -9
@@ -1,18 +1,142 @@
1
1
  ###############
2
2
  # Device Detector - The Universal Device Detection library for parsing User Agents
3
3
  #
4
- # @link http://piwik.org
4
+ # @link https://matomo.org
5
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
6
  ###############
7
7
 
8
+ - regex: 'IPinfoClient/.*/(\d+[\.\d]+)'
9
+ name: 'IPinfo'
10
+ version: '$1'
11
+ url: 'https://github.com/ipinfo'
12
+
13
+ - regex: 'kiwi-tcms/(\d+[\.\d]+)'
14
+ name: 'Kiwi TCMS'
15
+ version: '$1'
16
+ url: 'https://kiwitcms.org'
17
+
18
+ - regex: 'tcms-api/(\d+[\.\d]+)'
19
+ name: 'Kiwi TCMS API'
20
+ version: '$1'
21
+ url: 'https://kiwitcms.org'
22
+
23
+ - regex: 'Fuzz Faster U Fool v(\d+[\.\d]+)'
24
+ name: 'FFUF'
25
+ version: '$1'
26
+ url: 'https://github.com/ffuf/ffuf'
27
+
28
+ - regex: 'Slim Framework'
29
+ name: 'Slim Framework'
30
+ version: ''
31
+ url: 'https://www.slimframework.com/'
32
+
33
+ - regex: 'msray-plus'
34
+ name: 'Msray-Plus'
35
+ version: ''
36
+ url: 'https://github.com/super-l/msray'
37
+
38
+ - regex: 'HTMLParser(?:/(\d+[\.\d]+))?'
39
+ name: 'HTML Parser'
40
+ version: '$1'
41
+ url: 'https://htmlparser.sourceforge.net/'
42
+
43
+ # got - a nodejs library
44
+ - regex: '^got(?:/(\d+\.[.\d]+))? \('
45
+ name: 'got'
46
+ version: '$1'
47
+ url: 'https://github.com/sindresorhus/got'
48
+
49
+ # Typhoeus
50
+ - regex: 'Typhoeus'
51
+ name: 'Typhoeus'
52
+ version: ''
53
+ url: 'https://github.com/typhoeus/typhoeus'
54
+
55
+ # req
56
+ - regex: 'req/v([\.\d]+)'
57
+ name: 'req'
58
+ version: '$1'
59
+ url: 'https://github.com/imroc/req'
60
+
61
+ # quic-go
62
+ - regex: 'quic-go-HTTP/3'
63
+ name: 'quic-go'
64
+ version: ''
65
+ url: 'https://github.com/lucas-clemente/quic-go'
66
+
67
+ # Azure Data Factory
68
+ - regex: 'azure-data-factory(?:/(\d+[\.\d]+))?'
69
+ name: 'Azure Data Factory'
70
+ version: '$1'
71
+ url: 'https://azure.microsoft.com/en-us/products/data-factory/'
72
+
73
+ # Dart
74
+ - regex: 'Dart(?:/(\d+[\.\d]+))?'
75
+ name: 'Dart'
76
+ version: '$1'
77
+ url: 'https://dart.dev/'
78
+
79
+ # r-curl
80
+ - regex: 'r-curl(?:/(\d+[\.\d]+))?'
81
+ name: 'r-curl'
82
+ version: '$1'
83
+ url: 'https://github.com/jeroen/curl'
84
+
85
+ # HTTPX
86
+ - regex: 'python-httpx(?:/(\d+[\.\d]+))?'
87
+ name: 'HTTPX'
88
+ version: '$1'
89
+ url: 'https://www.python-httpx.org/'
90
+
91
+ # fasthttp
92
+ - regex: 'fasthttp(?:/(\d+[\.\d]+))?'
93
+ name: 'fasthttp'
94
+ version: '$1'
95
+ url: 'https://github.com/valyala/fasthttp'
96
+
97
+ # GeoIP Update
98
+ - regex: 'geoipupdate(?:/(\d+[\.\d]+))?'
99
+ name: 'GeoIP Update'
100
+ version: '$1'
101
+ url: 'https://github.com/maxmind/geoipupdate'
102
+
103
+ # PHP cURL Class
104
+ - regex: 'PHP-Curl-Class(?:/(\d+[\.\d]+))?'
105
+ name: 'PHP cURL Class'
106
+ version: '$1'
107
+ url: 'https://github.com/php-curl-class/php-curl-class'
108
+
109
+ # cPanel HTTP Client
110
+ - regex: 'Cpanel-HTTP-Client(?:/(\d+[\.\d]+))?'
111
+ name: 'cPanel HTTP Client'
112
+ version: '$1'
113
+ url: 'https://www.cpanel.net/'
114
+
115
+ # AnyEvent HTTP
116
+ - regex: 'AnyEvent-HTTP(?:/(\d+[\.\d]+))?'
117
+ name: 'AnyEvent HTTP'
118
+ version: '$1'
119
+ url: 'http://software.schmorp.de/pkg/AnyEvent'
120
+
121
+ # SlimerJS
122
+ - regex: 'SlimerJS/(\d+[\.\d]+)'
123
+ name: 'SlimerJS'
124
+ version: '$1'
125
+ url: 'https://www.slimerjs.org/'
126
+
8
127
  - regex: 'Wget(?:/(\d+[\.\d]+))?'
9
128
  name: 'Wget'
10
129
  version: '$1'
11
130
 
12
- - regex: 'Guzzle(?:/(\d+[\.\d]+))?'
131
+ - regex: 'Guzzle(?:Http)?(?:/(\d+[\.\d]+))?'
13
132
  name: 'Guzzle (PHP HTTP Client)'
14
133
  version: '$1'
15
134
 
135
+ # symphony php http client
136
+ - regex: '^Symfony HttpClient/'
137
+ name: 'Symfony'
138
+ version: '$1'
139
+
16
140
  - regex: '(?:lib)?curl(?:/(\d+[\.\d]+))?'
17
141
  name: 'curl'
18
142
  version: '$1'
@@ -21,14 +145,484 @@
21
145
  name: 'Python Requests'
22
146
  version: '$1'
23
147
 
24
- - regex: 'Python-urllib(?:/?(\d+[\.\d]+))?'
148
+ - regex: 'Python-httplib2(?:/(\d+[\.\d]+))?'
149
+ name: 'httplib2'
150
+ version: '$1'
151
+ url: 'https://pypi.org/project/httplib2/'
152
+
153
+ - regex: 'Python-urllib3?(?:/?(\d+[\.\d]+))?'
25
154
  name: 'Python urllib'
26
155
  version: '$1'
27
156
 
157
+ - regex: 'Apache-HttpClient(?:/?(\d+[\.\d]+))?'
158
+ name: 'Apache HTTP Client'
159
+ version: '$1'
160
+
161
+ - regex: 'Java-http-client(?:/?(\d+[\.\d]+))?'
162
+ name: 'Java HTTP Client'
163
+ version: '$1'
164
+
28
165
  - regex: 'Java(?:/?(\d+[\.\d]+))?'
29
166
  name: 'Java'
30
167
  version: '$1'
31
168
 
32
169
  - regex: '(?:perlclient|libwww-perl)(?:/?(\d+[\.\d]+))?'
33
170
  name: 'Perl'
34
- version: '$1'
171
+ version: '$1'
172
+
173
+ - regex: 'grpc-java-okhttp/([\d\.]+)'
174
+ name: 'gRPC-Java'
175
+ version: '$1'
176
+ url: 'https://github.com/grpc/grpc-java'
177
+
178
+ # java library
179
+ - regex: '(?:okhttp|network-okhttp3)/([\d\.]+)'
180
+ name: 'OkHttp'
181
+ version: '$1'
182
+
183
+ - regex: 'okhttp3-([\d\.]+)'
184
+ name: 'OkHttp'
185
+ version: '$1'
186
+
187
+ - regex: 'HTTP_Request2(?:/(\d+[\.\d]+))?'
188
+ name: 'HTTP_Request2'
189
+ version: '$1'
190
+
191
+ - regex: 'HTTP_Request2(?:/(\d+[\.\d]+))?'
192
+ name: 'HTTP_Request2'
193
+ version: '$1'
194
+ url: 'https://pear.php.net/package/http_request2'
195
+
196
+ - regex: 'Mechanize(?:/(\d+[\.\d]+))?'
197
+ name: 'Mechanize'
198
+ version: '$1'
199
+ url: 'https://github.com/sparklemotion/mechanize'
200
+
201
+ - regex: 'aiohttp(?:/(\d+[\.\d]+))?'
202
+ name: 'aiohttp'
203
+ version: '$1'
204
+
205
+ - regex: 'Google-HTTP-Java-Client(?:/(\d+[\.\w-]+))?'
206
+ name: 'Google HTTP Java Client'
207
+ version: '$1'
208
+
209
+ - regex: 'WWW-Mechanize(?:/(\d+[\.\d]+))?'
210
+ name: 'WWW-Mechanize'
211
+ version: '$1'
212
+
213
+ - regex: 'Faraday(?: v(\d+[\.\d]+))?'
214
+ name: 'Faraday'
215
+ version: '$1'
216
+ url: 'https://github.com/lostisland/faraday'
217
+
218
+ - regex: '(?:Go-http-client|Go )/?(?:(\d+[\.\d]+))?(?: package http)?'
219
+ name: 'Go-http-client'
220
+ version: '$1'
221
+
222
+ - regex: 'urlgrabber(?:/(\d+[\.\d]+))?'
223
+ name: 'urlgrabber (yum)'
224
+ version: '$1'
225
+
226
+ - regex: 'libdnf(?:/(\d+[\.\d]+))?'
227
+ name: 'libdnf'
228
+ version: '$1'
229
+
230
+ - regex: 'HTTPie(?:/(\d+[\.\d]+))?'
231
+ name: 'HTTPie'
232
+ version: '$1'
233
+
234
+ - regex: 'rest-client/(\d+\.[\.\d]+) .*ruby'
235
+ name: 'REST Client for Ruby'
236
+ version: '$1'
237
+
238
+ - regex: 'RestSharp/(\d+[\.\d]+)'
239
+ name: 'RestSharp'
240
+ version: '$1'
241
+ url: 'https://github.com/restsharp/RestSharp'
242
+
243
+ - regex: 'scalaj-http/(\d+[\.\d]+)'
244
+ name: 'ScalaJ HTTP'
245
+ version: '$1'
246
+ url: 'https://github.com/scalaj/scalaj-http'
247
+
248
+ - regex: 'REST::Client/(\d+)'
249
+ name: 'Perl REST::Client'
250
+ version: '$1'
251
+ url: 'https://metacpan.org/pod/REST::Client'
252
+
253
+ - regex: 'node-fetch/?(\d+[\.\d]+)?'
254
+ name: 'Node Fetch'
255
+ version: '$1'
256
+ url: 'https://github.com/node-fetch/node-fetch'
257
+
258
+ - regex: 'electron-fetch/?(\d+[\.\d]+)?'
259
+ name: 'Electron Fetch'
260
+ version: '$1'
261
+ url: 'https://github.com/arantes555/electron-fetch'
262
+
263
+ - regex: 'ReactorNetty/(\d+[\.\d]+)'
264
+ name: 'ReactorNetty'
265
+ version: '$1'
266
+ url: 'https://github.com/reactor/reactor-netty'
267
+
268
+ - regex: 'PostmanRuntime(?:/(\d+[\.\d]+))?'
269
+ name: 'Postman Desktop'
270
+ version: '$1'
271
+ url: 'https://github.com/postmanlabs/postman-runtime'
272
+
273
+ - regex: 'insomnia(?:/(\d+[\.\d]+))?'
274
+ name: 'Insomnia REST Client'
275
+ version: '$1'
276
+ url: 'https://insomnia.rest'
277
+
278
+ - regex: 'Jakarta Commons-HttpClient/([\.\d]+)'
279
+ name: 'Jakarta Commons HttpClient'
280
+ version: '$1'
281
+ url: 'https://hc.apache.org/httpclient-3.x'
282
+
283
+ - regex: 'WinHttp\.WinHttpRequest.+([\.\d]+)'
284
+ name: 'WinHttp WinHttpRequest'
285
+ version: '$1'
286
+
287
+ - regex: 'WinHTTP'
288
+ name: 'Windows HTTP'
289
+ version: ''
290
+
291
+ # THTTPClient in delphi 10+ default useragent
292
+ - regex: 'Embarcadero URI Client/([\.\d]+)'
293
+ name: 'Embarcadero URI Client'
294
+ version: '$1'
295
+
296
+ - regex: 'Mikrotik/([\.\d]+)'
297
+ name: 'Mikrotik Fetch'
298
+ version: '$1'
299
+
300
+ - regex: 'GRequests(?:/(\d+[\.\d]+))?'
301
+ name: 'GRequests'
302
+ version: '$1'
303
+
304
+ # https://doc.akka.io/
305
+ - regex: 'akka-http/([\.\d]+)'
306
+ name: 'Akka HTTP'
307
+ version: '$1'
308
+
309
+ # this added need added tests
310
+ - regex: 'aria2(?:/(\d+[\.\d]+))?'
311
+ name: 'Aria2'
312
+ version: '$1'
313
+
314
+ - regex: '(?:BTWebClient/|^uTorrent/)'
315
+ name: 'uTorrent'
316
+ version: ''
317
+
318
+ - regex: 'gvfs/(?:(\d+[\.\d]+))?'
319
+ name: 'gvfs'
320
+ version: '$1'
321
+
322
+ # https://openwrt.org/packages/pkgdata/uclient-fetch
323
+ - regex: 'uclient-fetch'
324
+ name: 'uclient-fetch'
325
+ version: ''
326
+
327
+ # https://github.com/microsoft/cpprestsdk
328
+ - regex: 'cpprestsdk/([\.\d]+)'
329
+ name: 'C++ REST SDK'
330
+ version: '$1'
331
+
332
+ - regex: 'lua-resty-http/([\.\d]+).+ngx_'
333
+ name: 'LUA OpenResty NGINX'
334
+ version: '$1'
335
+
336
+ # https://github.com/Kong/unirest-java
337
+ - regex: 'unirest-java/([\.\d]+)'
338
+ name: 'Unirest for Java'
339
+ version: '$1'
340
+
341
+ # jsdom (https://github.com/jsdom/jsdom)
342
+ - regex: 'jsdom/([\.\d]+)'
343
+ name: 'jsdom'
344
+ version: '$1'
345
+
346
+ # hackney (https://github.com/benoitc/hackney) (elixir)
347
+ - regex: 'hackney/([\.\d]+)'
348
+ name: 'hackney'
349
+ version: '$1'
350
+
351
+ # Resty (https://github.com/go-resty/resty)
352
+ - regex: 'go-resty/([\.\d]+)'
353
+ name: 'Resty'
354
+ version: '$1'
355
+
356
+ # Pa11y (https://pa11y.org/)
357
+ - regex: 'pa11y/([\.\d]+)'
358
+ name: 'Pa11y'
359
+ version: '$1'
360
+
361
+ # Ultimate Sitemap Parser (https://github.com/mediacloud/ultimate-sitemap-parser)
362
+ - regex: 'ultimate_sitemap_parser/([\.\d]+)'
363
+ name: 'Ultimate Sitemap Parser'
364
+ version: '$1'
365
+
366
+ # Container-related useragents
367
+
368
+ # Artifactory (https://jfrog.com/de/artifactory/)
369
+ - regex: 'Artifactory/([\.\d]+)'
370
+ name: 'Artifactory'
371
+ version: '$1'
372
+
373
+ # Open build service (https://build.opensuse.org/)
374
+ - regex: 'BSRPC ([\.\d]+)'
375
+ name: 'Open Build Service'
376
+ version: '$1'
377
+
378
+ # Buildah (https://github.com/containers/buildah)
379
+ - regex: 'Buildah/([\.\d]+)'
380
+ name: 'Buildah'
381
+ version: '$1'
382
+
383
+ # Buildkit (https://github.com/moby/buildkit)
384
+ - regex: 'buildkit/v?([\.\d]+)'
385
+ name: 'BuildKit'
386
+ version: '$1'
387
+
388
+ # containerd (https://github.com/containerd/containerd)
389
+ - regex: 'containerd/v?([\.\d]+)'
390
+ name: 'Containerd'
391
+ version: '$1'
392
+
393
+ # containers (https://github.com/containers/image)
394
+ - regex: 'containers/([\.\d]+)'
395
+ name: 'containers'
396
+ version: '$1'
397
+
398
+ # cri-o (https://github.com/cri-o/cri-)o
399
+ - regex: 'cri-o/([\.\d]+)'
400
+ name: 'cri-o'
401
+ version: '$1'
402
+
403
+ # docker (https://github.com/moby/moby)
404
+ - regex: 'docker/([\.\d]+)'
405
+ name: 'docker'
406
+ version: '$1'
407
+
408
+ # gcr (https://github.com/google/go-containerregistry)
409
+ - regex: 'go-containerregistry/v([\.\d]+)'
410
+ name: 'go-container registry'
411
+ version: '$1'
412
+
413
+ # libpod (https://github.com/dankohn/libpod)
414
+ - regex: 'libpod/([\.\d]+)'
415
+ name: 'libpod'
416
+ version: '$1'
417
+
418
+ # skopeo (https://github.com/containers/skopeo)
419
+ - regex: 'skopeo/([\.\d]+)'
420
+ name: 'Skopeo'
421
+ version: '$1'
422
+
423
+ # helm (https://github.com/helm/helm)
424
+ - regex: 'Helm/([\.\d]+)'
425
+ name: 'Helm'
426
+ version: '$1'
427
+
428
+ # harbor client (https://goharbor.io/)
429
+ - regex: 'harbor-registry-client'
430
+ name: 'Harbor registry client'
431
+ version: ''
432
+
433
+ # axios http (https://axios-http.com/)
434
+ - regex: 'axios(?:/?(\d+[\.\d]+))?'
435
+ name: Axios
436
+ version: '$1'
437
+
438
+ # Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks
439
+ - regex: '^CarrierWave/(\d+\.[.\d]+)'
440
+ name: 'CarrierWave'
441
+ version: '$1'
442
+
443
+ - regex: '^Deno/(\d+\.[.\d]+)'
444
+ name: 'Deno'
445
+ version: '$1'
446
+
447
+ # Streaming downloads using net/http, http.rb, HTTPX or wget (ruby)
448
+ - regex: '^Down/(\d+\.[.\d]+)'
449
+ name: 'Down'
450
+ version: '$1'
451
+
452
+ # various programs can use this, like vlc, but the underlying lib is ffmpeg
453
+ - regex: '^Lavf/'
454
+ name: 'ffmpeg'
455
+ version: '$1'
456
+
457
+ - regex: '^FileDownloader/(\d+\.[.\d]+)'
458
+ name: 'FileDownloader'
459
+ version: '$1'
460
+
461
+ # Allows managing large files with git, without storing the file contents in git
462
+ - regex: '^git-annex/(\d+\.[.\d]+)'
463
+ name: 'git-annex'
464
+ version: '$1'
465
+
466
+ - regex: '^GStreamer(?: souphttpsrc)[ /](\d+\.[.\d]+)?'
467
+ name: 'GStreamer'
468
+ version: '$1'
469
+
470
+ # A small, simple, correct HTTP/1.1 client (Perl)
471
+ - regex: '^HTTP-Tiny/(\d+\.[.\d]+)'
472
+ name: 'HTTP:Tiny'
473
+ version: '$1'
474
+
475
+ - regex: 'KaiOS Downloader'
476
+ name: 'KaiOS Downloader'
477
+ version: ''
478
+
479
+ # HTTP client/server library for GNOME
480
+ - regex: '^libsoup/(\d+\.[.\d]+)'
481
+ name: 'libsoup'
482
+ version: '$1'
483
+
484
+ - regex: '^Android\.LVLDM$'
485
+ name: 'Android License Verification Library'
486
+ version: '$1'
487
+
488
+ # A file downloader library for Android with pause and resume support
489
+ - regex: '^PRDownloader$'
490
+ name: 'PRDownloader'
491
+ version: ''
492
+
493
+ # a rust http library
494
+ - regex: '^reqwest/(\d+\.[.\d]+)'
495
+ name: 'reqwest'
496
+ version: '$1'
497
+
498
+ # lua http library
499
+ - regex: '^resty-requests'
500
+ name: 'resty-requests'
501
+ version: ''
502
+
503
+ # ruby core lib http download
504
+ - regex: '^Ruby'
505
+ name: 'ruby'
506
+ version: ''
507
+
508
+ # SFSafariViewController, some safari service
509
+ - regex: '^SafariViewService/(\d+\.[.\d]+)'
510
+ name: 'Safari View Service'
511
+ version: '$1'
512
+
513
+ # a nodejs lib
514
+ - regex: '^undici$'
515
+ name: 'undici'
516
+ version: ''
517
+
518
+ # URL, an emacs plugin
519
+ - regex: '^URL/Emacs Emacs/(\d+\.[.\d]+)'
520
+ name: 'Emacs'
521
+ version: '$1'
522
+
523
+ - regex: '^FDM[ /]([\d\.]+)'
524
+ name: 'Free Download Manager'
525
+ version: '$1'
526
+
527
+ # 'https://github.com/lingochamp/okdownload'
528
+ - regex: 'OkDownload/([\d\.]+)'
529
+ name: 'OKDownload Library'
530
+ version: '$1'
531
+
532
+ # podcast host https://libsyn.com (probably an importer)
533
+ - regex: '^Libsyn4-?(?:peek|download)$'
534
+ name: 'Libsyn'
535
+ version: ''
536
+
537
+ # any ios application that uses apple core media but doesn't set its user
538
+ # agent will default to this, always with 1.0.0 version.
539
+ # there was a time when (not even that long ago) apple didn't let you set
540
+ # a user agent so a ton of random applications still identify themselves this way.
541
+ - regex: 'AppleCoreMedia/1\.0\.0'
542
+ name: 'iOS Application'
543
+ version: ''
544
+
545
+ - regex: 'cpp-httplib(?:/(\d+[\.\d]+))?'
546
+ name: 'cpp-httplib'
547
+ version: '$1'
548
+ url: 'https://github.com/yhirose/cpp-httplib'
549
+
550
+ - regex: 'Definitely-Not-Requests'
551
+ name: 'Requests'
552
+ version: ''
553
+ url: 'https://github.com/psf/requests'
554
+
555
+ - regex: 'Stealer ([\d\.]+)'
556
+ name: 'Stealer'
557
+ version: '$1'
558
+ url: 'https://github.com/hotrush/stealer/'
559
+
560
+ - regex: 'Mandrill-PHP(?:/(\d+[\.\d]+))?'
561
+ name: 'Mandrill PHP'
562
+ version: '$1'
563
+ url: 'https://bitbucket.org/mailchimp/mandrill-api-php/src/master/'
564
+
565
+ - regex: '^Podgrab'
566
+ name: 'Podgrab'
567
+ version: ''
568
+ url: 'https://github.com/akhilrex/podgrab'
569
+
570
+ - regex: '^Podcast Provider.*?Radio Downloader ([\d\.]+)'
571
+ name: 'Radio Downloader'
572
+ version: '$1'
573
+ url: 'https://nerdoftheherd.com/tools/radiodld/'
574
+
575
+ - regex: '^ESP32 HTTP Client/([\d\.]+)'
576
+ name: 'ESP32 HTTP Client'
577
+ version: '$1'
578
+ url: 'https://github.com/espressif/arduino-esp32'
579
+
580
+ - regex: 'babashka\.http-client(?:/(\d+[\.\d]+))?'
581
+ name: 'Babashka HTTP Client'
582
+ version: '$1'
583
+ url: 'https://github.com/babashka/http-client'
584
+
585
+ - regex: 'http\.rb(?:/(\d+[\.\d]+))?'
586
+ name: 'http.rb'
587
+ version: '$1'
588
+ url: 'https://github.com/httprb/http'
589
+
590
+ - regex: 'node-superagent(?:/(\d+[\.\d]+))?'
591
+ name: 'superagent'
592
+ version: '$1'
593
+ url: 'https://github.com/ladjs/superagent'
594
+
595
+ - regex: 'CakePHP'
596
+ name: 'CakePHP'
597
+ version: ''
598
+ url: 'https://www.cakephp.org/'
599
+
600
+ - regex: 'request\.js'
601
+ name: 'request'
602
+ version: ''
603
+ url: 'https://github.com/request/request'
604
+
605
+ - regex: 'qbhttp(?:/(\d+[\.\d]+))?'
606
+ name: 'QbHttp'
607
+ version: '$1'
608
+ url: 'https://github.com/OpenQb/QbHttp'
609
+
610
+ - regex: 'httprs(?:/(\d+[\.\d]+))?'
611
+ name: 'httprs'
612
+ version: '$1'
613
+ url: 'https://github.com/http-server-rs/http-server'
614
+
615
+ - regex: 'Boto3(?:/(\d+[\.\d]+))?'
616
+ name: 'Boto3'
617
+ version: '$1'
618
+ url: 'https://github.com/boto/boto3'
619
+
620
+ - regex: 'Python-xmlrpc(?:/(\d+[\.\d]+))?'
621
+ name: 'XML-RPC'
622
+ version: '$1'
623
+ url: 'https://docs.python.org/3/library/xmlrpc.html'
624
+
625
+ - regex: 'ICAP-Client-Library(?:/(\d+[\.\d]+))?'
626
+ name: 'ICAP Client'
627
+ version: '$1'
628
+ url: 'https://github.com/Peoplecantfly/icapserver'