├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md └── src ├── hoster_manager.rs ├── id_generator.rs ├── main.rs ├── stats_conduit.rs └── transport.rs /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "MacTypes-sys" 5 | version = "2.1.0" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | dependencies = [ 8 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 9 | ] 10 | 11 | [[package]] 12 | name = "ansi_term" 13 | version = "0.11.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | dependencies = [ 16 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 17 | ] 18 | 19 | [[package]] 20 | name = "arrayvec" 21 | version = "0.4.10" 22 | source = "registry+https://github.com/rust-lang/crates.io-index" 23 | dependencies = [ 24 | "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 25 | ] 26 | 27 | [[package]] 28 | name = "atty" 29 | version = "0.2.11" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | dependencies = [ 32 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 33 | "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 34 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 35 | ] 36 | 37 | [[package]] 38 | name = "autocfg" 39 | version = "0.1.2" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | 42 | [[package]] 43 | name = "base64" 44 | version = "0.9.3" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | dependencies = [ 47 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 48 | "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 49 | ] 50 | 51 | [[package]] 52 | name = "base64" 53 | version = "0.10.1" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | dependencies = [ 56 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 57 | ] 58 | 59 | [[package]] 60 | name = "bitflags" 61 | version = "1.0.4" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | 64 | [[package]] 65 | name = "block-buffer" 66 | version = "0.7.0" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | dependencies = [ 69 | "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 70 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 71 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 72 | "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 73 | ] 74 | 75 | [[package]] 76 | name = "block-padding" 77 | version = "0.1.3" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | dependencies = [ 80 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 81 | ] 82 | 83 | [[package]] 84 | name = "byte-tools" 85 | version = "0.3.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | 88 | [[package]] 89 | name = "byteorder" 90 | version = "1.3.1" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | 93 | [[package]] 94 | name = "bytes" 95 | version = "0.4.11" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | dependencies = [ 98 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 99 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 100 | ] 101 | 102 | [[package]] 103 | name = "cc" 104 | version = "1.0.30" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | 107 | [[package]] 108 | name = "cfg-if" 109 | version = "0.1.6" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | 112 | [[package]] 113 | name = "clap" 114 | version = "2.32.0" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | dependencies = [ 117 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 118 | "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 119 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 120 | "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 121 | "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 122 | "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 123 | "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 124 | ] 125 | 126 | [[package]] 127 | name = "cloudabi" 128 | version = "0.0.3" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | dependencies = [ 131 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 132 | ] 133 | 134 | [[package]] 135 | name = "core-foundation" 136 | version = "0.5.1" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | dependencies = [ 139 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 140 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 141 | ] 142 | 143 | [[package]] 144 | name = "core-foundation-sys" 145 | version = "0.5.1" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | dependencies = [ 148 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 149 | ] 150 | 151 | [[package]] 152 | name = "crossbeam-deque" 153 | version = "0.7.1" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | dependencies = [ 156 | "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 157 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 158 | ] 159 | 160 | [[package]] 161 | name = "crossbeam-epoch" 162 | version = "0.7.1" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | dependencies = [ 165 | "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", 166 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 167 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 168 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 169 | "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 170 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 171 | ] 172 | 173 | [[package]] 174 | name = "crossbeam-queue" 175 | version = "0.1.2" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | dependencies = [ 178 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 179 | ] 180 | 181 | [[package]] 182 | name = "crossbeam-utils" 183 | version = "0.6.5" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | dependencies = [ 186 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 187 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 188 | ] 189 | 190 | [[package]] 191 | name = "digest" 192 | version = "0.8.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | dependencies = [ 195 | "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 196 | ] 197 | 198 | [[package]] 199 | name = "dtoa" 200 | version = "0.4.3" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | 203 | [[package]] 204 | name = "fake-simd" 205 | version = "0.1.2" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | 208 | [[package]] 209 | name = "fibridge-proxy-rs" 210 | version = "0.1.0" 211 | dependencies = [ 212 | "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", 213 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 214 | "hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)", 215 | "omnistreams 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 216 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 217 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 218 | "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", 219 | "uuid 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 220 | "warp 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 221 | ] 222 | 223 | [[package]] 224 | name = "fnv" 225 | version = "1.0.6" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | 228 | [[package]] 229 | name = "foreign-types" 230 | version = "0.3.2" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | dependencies = [ 233 | "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 234 | ] 235 | 236 | [[package]] 237 | name = "foreign-types-shared" 238 | version = "0.1.1" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | 241 | [[package]] 242 | name = "fuchsia-cprng" 243 | version = "0.1.1" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | 246 | [[package]] 247 | name = "fuchsia-zircon" 248 | version = "0.3.3" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | dependencies = [ 251 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 252 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 253 | ] 254 | 255 | [[package]] 256 | name = "fuchsia-zircon-sys" 257 | version = "0.3.3" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | 260 | [[package]] 261 | name = "futures" 262 | version = "0.1.25" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | 265 | [[package]] 266 | name = "futures-cpupool" 267 | version = "0.1.8" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | dependencies = [ 270 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 271 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 272 | ] 273 | 274 | [[package]] 275 | name = "generic-array" 276 | version = "0.12.0" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | dependencies = [ 279 | "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 280 | ] 281 | 282 | [[package]] 283 | name = "h2" 284 | version = "0.1.16" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | dependencies = [ 287 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 288 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 289 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 290 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 291 | "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 292 | "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 293 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 294 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 295 | "string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 296 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 297 | ] 298 | 299 | [[package]] 300 | name = "headers" 301 | version = "0.2.1" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | dependencies = [ 304 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 305 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 306 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 307 | "headers-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 308 | "headers-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 309 | "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 310 | "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 311 | "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 312 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 313 | ] 314 | 315 | [[package]] 316 | name = "headers-core" 317 | version = "0.1.0" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | dependencies = [ 320 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 321 | "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 322 | ] 323 | 324 | [[package]] 325 | name = "headers-derive" 326 | version = "0.1.0" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | dependencies = [ 329 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 330 | "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 331 | "syn 0.15.28 (registry+https://github.com/rust-lang/crates.io-index)", 332 | ] 333 | 334 | [[package]] 335 | name = "http" 336 | version = "0.1.16" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | dependencies = [ 339 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 340 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 341 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 342 | ] 343 | 344 | [[package]] 345 | name = "httparse" 346 | version = "1.3.3" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | 349 | [[package]] 350 | name = "hyper" 351 | version = "0.10.15" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | dependencies = [ 354 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 355 | "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 356 | "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 357 | "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 358 | "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 359 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 360 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 361 | "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 362 | "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 363 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 364 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 365 | ] 366 | 367 | [[package]] 368 | name = "hyper" 369 | version = "0.12.25" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | dependencies = [ 372 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 373 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 374 | "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 375 | "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 376 | "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 377 | "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 378 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 379 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 380 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 381 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 382 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 383 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 384 | "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 385 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 386 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 387 | "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 388 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 389 | "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 390 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 391 | "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 392 | ] 393 | 394 | [[package]] 395 | name = "idna" 396 | version = "0.1.5" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | dependencies = [ 399 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 400 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 401 | "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 402 | ] 403 | 404 | [[package]] 405 | name = "indexmap" 406 | version = "1.0.2" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | 409 | [[package]] 410 | name = "input_buffer" 411 | version = "0.2.0" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | dependencies = [ 414 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 415 | ] 416 | 417 | [[package]] 418 | name = "iovec" 419 | version = "0.1.2" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | dependencies = [ 422 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 423 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 424 | ] 425 | 426 | [[package]] 427 | name = "itoa" 428 | version = "0.4.3" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | 431 | [[package]] 432 | name = "kernel32-sys" 433 | version = "0.2.2" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | dependencies = [ 436 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 437 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 438 | ] 439 | 440 | [[package]] 441 | name = "language-tags" 442 | version = "0.2.2" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | 445 | [[package]] 446 | name = "lazy_static" 447 | version = "1.3.0" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | 450 | [[package]] 451 | name = "lazycell" 452 | version = "1.2.1" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | 455 | [[package]] 456 | name = "libc" 457 | version = "0.2.49" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | 460 | [[package]] 461 | name = "lock_api" 462 | version = "0.1.5" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | dependencies = [ 465 | "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 467 | ] 468 | 469 | [[package]] 470 | name = "log" 471 | version = "0.3.9" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | dependencies = [ 474 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 475 | ] 476 | 477 | [[package]] 478 | name = "log" 479 | version = "0.4.6" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | dependencies = [ 482 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 483 | ] 484 | 485 | [[package]] 486 | name = "matches" 487 | version = "0.1.8" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | 490 | [[package]] 491 | name = "memoffset" 492 | version = "0.2.1" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | 495 | [[package]] 496 | name = "mime" 497 | version = "0.2.6" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | dependencies = [ 500 | "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 501 | ] 502 | 503 | [[package]] 504 | name = "mime" 505 | version = "0.3.13" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | dependencies = [ 508 | "unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 509 | ] 510 | 511 | [[package]] 512 | name = "mime_guess" 513 | version = "2.0.0-alpha.6" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | dependencies = [ 516 | "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 517 | "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 518 | "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 519 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 520 | ] 521 | 522 | [[package]] 523 | name = "mio" 524 | version = "0.6.16" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | dependencies = [ 527 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 528 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 529 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 530 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 531 | "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 532 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 533 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 534 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 535 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 536 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 537 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 538 | ] 539 | 540 | [[package]] 541 | name = "mio-uds" 542 | version = "0.6.7" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | dependencies = [ 545 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 546 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 547 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 548 | ] 549 | 550 | [[package]] 551 | name = "miow" 552 | version = "0.2.1" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | dependencies = [ 555 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 556 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 557 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 558 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 559 | ] 560 | 561 | [[package]] 562 | name = "native-tls" 563 | version = "0.2.2" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | dependencies = [ 566 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 567 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 568 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 569 | "openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)", 570 | "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 571 | "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", 572 | "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", 573 | "security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 574 | "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 575 | "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 576 | ] 577 | 578 | [[package]] 579 | name = "net2" 580 | version = "0.2.33" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | dependencies = [ 583 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 584 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 585 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 586 | ] 587 | 588 | [[package]] 589 | name = "nodrop" 590 | version = "0.1.13" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | 593 | [[package]] 594 | name = "num_cpus" 595 | version = "1.10.0" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | dependencies = [ 598 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 599 | ] 600 | 601 | [[package]] 602 | name = "omnistreams" 603 | version = "0.1.0" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | dependencies = [ 606 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 607 | "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 608 | "websocket 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)", 609 | ] 610 | 611 | [[package]] 612 | name = "opaque-debug" 613 | version = "0.2.2" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | 616 | [[package]] 617 | name = "openssl" 618 | version = "0.10.19" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | dependencies = [ 621 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 622 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 623 | "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 624 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 625 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 626 | "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", 627 | ] 628 | 629 | [[package]] 630 | name = "openssl-probe" 631 | version = "0.1.2" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | 634 | [[package]] 635 | name = "openssl-sys" 636 | version = "0.9.42" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | dependencies = [ 639 | "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", 640 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 641 | "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", 642 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 643 | "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 644 | ] 645 | 646 | [[package]] 647 | name = "owning_ref" 648 | version = "0.4.0" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | dependencies = [ 651 | "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 652 | ] 653 | 654 | [[package]] 655 | name = "parking_lot" 656 | version = "0.7.1" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | dependencies = [ 659 | "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 660 | "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 661 | ] 662 | 663 | [[package]] 664 | name = "parking_lot_core" 665 | version = "0.4.0" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | dependencies = [ 668 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 669 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 670 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 671 | "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", 672 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 673 | ] 674 | 675 | [[package]] 676 | name = "percent-encoding" 677 | version = "1.0.1" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | 680 | [[package]] 681 | name = "phf" 682 | version = "0.7.24" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | dependencies = [ 685 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 686 | ] 687 | 688 | [[package]] 689 | name = "phf_codegen" 690 | version = "0.7.24" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | dependencies = [ 693 | "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 694 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 695 | ] 696 | 697 | [[package]] 698 | name = "phf_generator" 699 | version = "0.7.24" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | dependencies = [ 702 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 703 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 704 | ] 705 | 706 | [[package]] 707 | name = "phf_shared" 708 | version = "0.7.24" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | dependencies = [ 711 | "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 712 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 713 | ] 714 | 715 | [[package]] 716 | name = "pkg-config" 717 | version = "0.3.14" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | 720 | [[package]] 721 | name = "proc-macro2" 722 | version = "0.4.27" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | dependencies = [ 725 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 726 | ] 727 | 728 | [[package]] 729 | name = "quote" 730 | version = "0.6.11" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | dependencies = [ 733 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 734 | ] 735 | 736 | [[package]] 737 | name = "rand" 738 | version = "0.5.6" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | dependencies = [ 741 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 742 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 743 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 744 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 745 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 746 | ] 747 | 748 | [[package]] 749 | name = "rand" 750 | version = "0.6.5" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | dependencies = [ 753 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 754 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 755 | "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 756 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 757 | "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 758 | "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 759 | "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 760 | "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 761 | "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 762 | "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 763 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 764 | ] 765 | 766 | [[package]] 767 | name = "rand_chacha" 768 | version = "0.1.1" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | dependencies = [ 771 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 772 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 773 | ] 774 | 775 | [[package]] 776 | name = "rand_core" 777 | version = "0.3.1" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | dependencies = [ 780 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 781 | ] 782 | 783 | [[package]] 784 | name = "rand_core" 785 | version = "0.4.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | 788 | [[package]] 789 | name = "rand_hc" 790 | version = "0.1.0" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | dependencies = [ 793 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 794 | ] 795 | 796 | [[package]] 797 | name = "rand_isaac" 798 | version = "0.1.1" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | dependencies = [ 801 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 802 | ] 803 | 804 | [[package]] 805 | name = "rand_jitter" 806 | version = "0.1.3" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | dependencies = [ 809 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 810 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 811 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 812 | ] 813 | 814 | [[package]] 815 | name = "rand_os" 816 | version = "0.1.2" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | dependencies = [ 819 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 820 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 821 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 822 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 823 | "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 824 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 825 | ] 826 | 827 | [[package]] 828 | name = "rand_pcg" 829 | version = "0.1.2" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | dependencies = [ 832 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 833 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 834 | ] 835 | 836 | [[package]] 837 | name = "rand_xorshift" 838 | version = "0.1.1" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | dependencies = [ 841 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 842 | ] 843 | 844 | [[package]] 845 | name = "rdrand" 846 | version = "0.4.0" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | dependencies = [ 849 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 850 | ] 851 | 852 | [[package]] 853 | name = "redox_syscall" 854 | version = "0.1.51" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | 857 | [[package]] 858 | name = "redox_termios" 859 | version = "0.1.1" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | dependencies = [ 862 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 863 | ] 864 | 865 | [[package]] 866 | name = "remove_dir_all" 867 | version = "0.5.1" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | dependencies = [ 870 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 871 | ] 872 | 873 | [[package]] 874 | name = "ring" 875 | version = "0.13.5" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | dependencies = [ 878 | "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", 879 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 880 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 881 | "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 882 | ] 883 | 884 | [[package]] 885 | name = "rustc_version" 886 | version = "0.2.3" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | dependencies = [ 889 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 890 | ] 891 | 892 | [[package]] 893 | name = "rustls" 894 | version = "0.14.0" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | dependencies = [ 897 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 898 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 899 | "ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)", 900 | "sct 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 901 | "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 902 | "webpki 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", 903 | ] 904 | 905 | [[package]] 906 | name = "ryu" 907 | version = "0.2.7" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | 910 | [[package]] 911 | name = "safemem" 912 | version = "0.3.0" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | 915 | [[package]] 916 | name = "schannel" 917 | version = "0.1.15" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | dependencies = [ 920 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 921 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 922 | ] 923 | 924 | [[package]] 925 | name = "scoped-tls" 926 | version = "0.1.2" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | 929 | [[package]] 930 | name = "scopeguard" 931 | version = "0.3.3" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | 934 | [[package]] 935 | name = "sct" 936 | version = "0.4.0" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | dependencies = [ 939 | "ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)", 940 | "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 941 | ] 942 | 943 | [[package]] 944 | name = "security-framework" 945 | version = "0.2.2" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | dependencies = [ 948 | "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 949 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 950 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 951 | "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 952 | ] 953 | 954 | [[package]] 955 | name = "security-framework-sys" 956 | version = "0.2.3" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | dependencies = [ 959 | "MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 960 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 961 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 962 | ] 963 | 964 | [[package]] 965 | name = "semver" 966 | version = "0.9.0" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | dependencies = [ 969 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 970 | ] 971 | 972 | [[package]] 973 | name = "semver-parser" 974 | version = "0.7.0" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | 977 | [[package]] 978 | name = "serde" 979 | version = "1.0.89" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | dependencies = [ 982 | "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 983 | ] 984 | 985 | [[package]] 986 | name = "serde_derive" 987 | version = "1.0.89" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | dependencies = [ 990 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 991 | "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 992 | "syn 0.15.28 (registry+https://github.com/rust-lang/crates.io-index)", 993 | ] 994 | 995 | [[package]] 996 | name = "serde_json" 997 | version = "1.0.39" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | dependencies = [ 1000 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1001 | "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 1002 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 1003 | ] 1004 | 1005 | [[package]] 1006 | name = "serde_urlencoded" 1007 | version = "0.5.4" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | dependencies = [ 1010 | "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1011 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1012 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 1013 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "sha-1" 1018 | version = "0.8.1" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | dependencies = [ 1021 | "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1022 | "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 1023 | "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1024 | "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1025 | ] 1026 | 1027 | [[package]] 1028 | name = "sha1" 1029 | version = "0.6.0" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | 1032 | [[package]] 1033 | name = "siphasher" 1034 | version = "0.2.3" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | 1037 | [[package]] 1038 | name = "slab" 1039 | version = "0.4.2" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | 1042 | [[package]] 1043 | name = "smallvec" 1044 | version = "0.6.9" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | 1047 | [[package]] 1048 | name = "stable_deref_trait" 1049 | version = "1.1.1" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | 1052 | [[package]] 1053 | name = "string" 1054 | version = "0.1.3" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | 1057 | [[package]] 1058 | name = "strsim" 1059 | version = "0.7.0" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | 1062 | [[package]] 1063 | name = "syn" 1064 | version = "0.15.28" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | dependencies = [ 1067 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1068 | "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 1069 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1070 | ] 1071 | 1072 | [[package]] 1073 | name = "tempfile" 1074 | version = "3.0.7" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | dependencies = [ 1077 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1078 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 1079 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1080 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1081 | "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1082 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "termion" 1087 | version = "1.5.1" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | dependencies = [ 1090 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 1091 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1092 | "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "textwrap" 1097 | version = "0.10.0" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | dependencies = [ 1100 | "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "time" 1105 | version = "0.1.42" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | dependencies = [ 1108 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 1109 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1110 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "tokio" 1115 | version = "0.1.16" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | dependencies = [ 1118 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1119 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1120 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1121 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1122 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1123 | "tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1124 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1125 | "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1126 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1127 | "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1128 | "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1129 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1130 | "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1131 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 1132 | "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1133 | "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "tokio-codec" 1138 | version = "0.1.1" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | dependencies = [ 1141 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1142 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1143 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1144 | ] 1145 | 1146 | [[package]] 1147 | name = "tokio-current-thread" 1148 | version = "0.1.5" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | dependencies = [ 1151 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1152 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "tokio-executor" 1157 | version = "0.1.6" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | dependencies = [ 1160 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1161 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1162 | ] 1163 | 1164 | [[package]] 1165 | name = "tokio-fs" 1166 | version = "0.1.6" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | dependencies = [ 1169 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1170 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1171 | "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "tokio-io" 1176 | version = "0.1.12" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | dependencies = [ 1179 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1180 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1181 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1182 | ] 1183 | 1184 | [[package]] 1185 | name = "tokio-reactor" 1186 | version = "0.1.9" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | dependencies = [ 1189 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1190 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1191 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1192 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1193 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1194 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1195 | "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1196 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1197 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1198 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1199 | "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "tokio-sync" 1204 | version = "0.1.3" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | dependencies = [ 1207 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1208 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "tokio-tcp" 1213 | version = "0.1.3" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | dependencies = [ 1216 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1217 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1218 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1219 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1220 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1221 | "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "tokio-threadpool" 1226 | version = "0.1.12" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | dependencies = [ 1229 | "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1230 | "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1231 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1232 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1233 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1234 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1235 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1236 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1237 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "tokio-timer" 1242 | version = "0.2.10" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | dependencies = [ 1245 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1246 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1247 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1248 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1249 | ] 1250 | 1251 | [[package]] 1252 | name = "tokio-tls" 1253 | version = "0.2.1" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | dependencies = [ 1256 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1257 | "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1258 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1259 | ] 1260 | 1261 | [[package]] 1262 | name = "tokio-udp" 1263 | version = "0.1.3" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | dependencies = [ 1266 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1267 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1268 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1269 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1270 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1271 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1272 | "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "tokio-uds" 1277 | version = "0.2.5" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | dependencies = [ 1280 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1281 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1282 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1283 | "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", 1284 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1285 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1286 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1287 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1288 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1289 | "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "traitobject" 1294 | version = "0.1.0" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | 1297 | [[package]] 1298 | name = "try-lock" 1299 | version = "0.2.2" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | 1302 | [[package]] 1303 | name = "tungstenite" 1304 | version = "0.6.1" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | dependencies = [ 1307 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 1308 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1309 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1310 | "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1311 | "input_buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1312 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1313 | "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", 1314 | "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 1315 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1316 | "utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "typeable" 1321 | version = "0.1.2" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | 1324 | [[package]] 1325 | name = "typenum" 1326 | version = "1.10.0" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | 1329 | [[package]] 1330 | name = "unicase" 1331 | version = "1.4.2" 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" 1333 | dependencies = [ 1334 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "unicase" 1339 | version = "2.3.0" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | dependencies = [ 1342 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "unicode-bidi" 1347 | version = "0.3.4" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | dependencies = [ 1350 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1351 | ] 1352 | 1353 | [[package]] 1354 | name = "unicode-normalization" 1355 | version = "0.1.8" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | dependencies = [ 1358 | "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", 1359 | ] 1360 | 1361 | [[package]] 1362 | name = "unicode-width" 1363 | version = "0.1.5" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | 1366 | [[package]] 1367 | name = "unicode-xid" 1368 | version = "0.1.0" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | 1371 | [[package]] 1372 | name = "untrusted" 1373 | version = "0.6.2" 1374 | source = "registry+https://github.com/rust-lang/crates.io-index" 1375 | 1376 | [[package]] 1377 | name = "url" 1378 | version = "1.7.2" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | dependencies = [ 1381 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1382 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1383 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "urlencoding" 1388 | version = "1.0.0" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | 1391 | [[package]] 1392 | name = "utf-8" 1393 | version = "0.7.5" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | 1396 | [[package]] 1397 | name = "uuid" 1398 | version = "0.7.2" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | dependencies = [ 1401 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1402 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 1403 | ] 1404 | 1405 | [[package]] 1406 | name = "vcpkg" 1407 | version = "0.2.6" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | 1410 | [[package]] 1411 | name = "vec_map" 1412 | version = "0.8.1" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | 1415 | [[package]] 1416 | name = "version_check" 1417 | version = "0.1.5" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | 1420 | [[package]] 1421 | name = "want" 1422 | version = "0.0.6" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | dependencies = [ 1425 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1426 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1427 | "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "warp" 1432 | version = "0.1.13" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | dependencies = [ 1435 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1436 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1437 | "headers 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1438 | "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1439 | "hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)", 1440 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1441 | "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 1442 | "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", 1443 | "rustls 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", 1444 | "scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1445 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 1446 | "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", 1447 | "serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 1448 | "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1449 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1450 | "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1451 | "tungstenite 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 1452 | "urlencoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "webpki" 1457 | version = "0.18.1" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | dependencies = [ 1460 | "ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)", 1461 | "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 1462 | ] 1463 | 1464 | [[package]] 1465 | name = "websocket" 1466 | version = "0.22.3" 1467 | source = "registry+https://github.com/rust-lang/crates.io-index" 1468 | dependencies = [ 1469 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 1470 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 1471 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1472 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1473 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1474 | "hyper 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)", 1475 | "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1476 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1477 | "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 1478 | "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1479 | "tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1480 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1481 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1482 | ] 1483 | 1484 | [[package]] 1485 | name = "winapi" 1486 | version = "0.2.8" 1487 | source = "registry+https://github.com/rust-lang/crates.io-index" 1488 | 1489 | [[package]] 1490 | name = "winapi" 1491 | version = "0.3.6" 1492 | source = "registry+https://github.com/rust-lang/crates.io-index" 1493 | dependencies = [ 1494 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1495 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1496 | ] 1497 | 1498 | [[package]] 1499 | name = "winapi-build" 1500 | version = "0.1.1" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | 1503 | [[package]] 1504 | name = "winapi-i686-pc-windows-gnu" 1505 | version = "0.4.0" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | 1508 | [[package]] 1509 | name = "winapi-x86_64-pc-windows-gnu" 1510 | version = "0.4.0" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | 1513 | [[package]] 1514 | name = "ws2_32-sys" 1515 | version = "0.2.1" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | dependencies = [ 1518 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1519 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1520 | ] 1521 | 1522 | [metadata] 1523 | "checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" 1524 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 1525 | "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" 1526 | "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" 1527 | "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" 1528 | "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 1529 | "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" 1530 | "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" 1531 | "checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" 1532 | "checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" 1533 | "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 1534 | "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" 1535 | "checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa" 1536 | "checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" 1537 | "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" 1538 | "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" 1539 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 1540 | "checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980" 1541 | "checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" 1542 | "checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" 1543 | "checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" 1544 | "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" 1545 | "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" 1546 | "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" 1547 | "checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" 1548 | "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 1549 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1550 | "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1551 | "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1552 | "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 1553 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 1554 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 1555 | "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" 1556 | "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" 1557 | "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" 1558 | "checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" 1559 | "checksum headers 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc6e2e51d356081258ef05ff4c648138b5d3fe64b7300aaad3b820554a2b7fb6" 1560 | "checksum headers-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51ae5b0b5417559ee1d2733b21d33b0868ae9e406bd32eb1a51d613f66ed472a" 1561 | "checksum headers-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97c462e8066bca4f0968ddf8d12de64c40f2c2187b3b9a2fa994d06e8ad444a9" 1562 | "checksum http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fe67e3678f2827030e89cc4b9e7ecd16d52f132c0b940ab5005f88e821500f6a" 1563 | "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" 1564 | "checksum hyper 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "df0caae6b71d266b91b4a83111a61d2b94ed2e2bea024c532b933dcff867e58c" 1565 | "checksum hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)" = "7d5b6658b016965ae301fa995306db965c93677880ea70765a84235a96eae896" 1566 | "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 1567 | "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" 1568 | "checksum input_buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e1b822cc844905551931d6f81608ed5f50a79c1078a4e2b4d42dbc7c1eedfbf" 1569 | "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" 1570 | "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" 1571 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1572 | "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 1573 | "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" 1574 | "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" 1575 | "checksum libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)" = "413f3dfc802c5dc91dc570b05125b6cda9855edfaa9825c9849807876376e70e" 1576 | "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" 1577 | "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" 1578 | "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" 1579 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1580 | "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" 1581 | "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" 1582 | "checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425" 1583 | "checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" 1584 | "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" 1585 | "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" 1586 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1587 | "checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" 1588 | "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" 1589 | "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" 1590 | "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" 1591 | "checksum omnistreams 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c98b3901c09ab34781ccc27ff262d513229816f377a051586e14770a5b9bd07" 1592 | "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" 1593 | "checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" 1594 | "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" 1595 | "checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" 1596 | "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" 1597 | "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" 1598 | "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" 1599 | "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 1600 | "checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" 1601 | "checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" 1602 | "checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" 1603 | "checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" 1604 | "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" 1605 | "checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" 1606 | "checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" 1607 | "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" 1608 | "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 1609 | "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 1610 | "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 1611 | "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" 1612 | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 1613 | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 1614 | "checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" 1615 | "checksum rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7c690732391ae0abafced5015ffb53656abfaec61b342290e5eb56b286a679d" 1616 | "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" 1617 | "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 1618 | "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 1619 | "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" 1620 | "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" 1621 | "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" 1622 | "checksum ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2c4db68a2e35f3497146b7e4563df7d4773a2433230c5e4b448328e31740458a" 1623 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1624 | "checksum rustls 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b7891791343c75b73ed9a18cadcafd8c8563d11a88ebe2d87f5b8a3182654d9" 1625 | "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" 1626 | "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" 1627 | "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" 1628 | "checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" 1629 | "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" 1630 | "checksum sct 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb8f61f9e6eadd062a71c380043d28036304a4706b3c4dd001ff3387ed00745a" 1631 | "checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05" 1632 | "checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc" 1633 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1634 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1635 | "checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" 1636 | "checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" 1637 | "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" 1638 | "checksum serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d48f9f99cd749a2de71d29da5f948de7f2764cc5a9d7f3c97e3514d4ee6eabf2" 1639 | "checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" 1640 | "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 1641 | "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" 1642 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1643 | "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" 1644 | "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" 1645 | "checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" 1646 | "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" 1647 | "checksum syn 0.15.28 (registry+https://github.com/rust-lang/crates.io-index)" = "218aa5a01ab9805df6e9e48074c8d88f317cc9660b1ad6c3dabac2d627d185d6" 1648 | "checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" 1649 | "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" 1650 | "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" 1651 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 1652 | "checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" 1653 | "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" 1654 | "checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" 1655 | "checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" 1656 | "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" 1657 | "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" 1658 | "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" 1659 | "checksum tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" 1660 | "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" 1661 | "checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" 1662 | "checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" 1663 | "checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" 1664 | "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" 1665 | "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" 1666 | "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" 1667 | "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" 1668 | "checksum tungstenite 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e9573852f935883137b7f0824832493ce7418bf290c8cf164b7aafc9b0a99aa0" 1669 | "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" 1670 | "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" 1671 | "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" 1672 | "checksum unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41d17211f887da8e4a70a45b9536f26fc5de166b81e2d5d80de4a17fd22553bd" 1673 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 1674 | "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" 1675 | "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" 1676 | "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" 1677 | "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" 1678 | "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 1679 | "checksum urlencoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3df3561629a8bb4c57e5a2e4c43348d9e29c7c29d9b1c4c1f47166deca8f37ed" 1680 | "checksum utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" 1681 | "checksum uuid 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0238db0c5b605dd1cf51de0f21766f97fba2645897024461d6a00c036819a768" 1682 | "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" 1683 | "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" 1684 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 1685 | "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" 1686 | "checksum warp 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2861682c6918c92c78d58edc336aaa1fdeda0167adce901bdf0c7057cb2d2ec1" 1687 | "checksum webpki 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "17d7967316d8411ca3b01821ee6c332bde138ba4363becdb492f12e514daa17f" 1688 | "checksum websocket 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7cc2d74d89f9df981ab41ae624e33cf302fdf456b93455c6a31911a99c9f0bb8" 1689 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1690 | "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" 1691 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1692 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1693 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1694 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 1695 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "fibridge-proxy-rs" 3 | version = "0.1.0" 4 | authors = ["Anders Pitman "] 5 | edition = "2018" 6 | 7 | [dependencies] 8 | #omnistreams = { path = "../omnistreams/omnistreams-rs" } 9 | omnistreams = "0.1" 10 | futures = "0.1" 11 | warp = { version = "0.1", features = ["tls"] } 12 | serde = { version = "1.0", features = ["derive"] } 13 | serde_json = "1.0" 14 | uuid = { version = "0.7", features = ["serde", "v4"] } 15 | hyper = "0.12" 16 | clap = "2.0" 17 | rand = "0.6.5" 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Anders Pitman 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Rationale and introduction available in the 2 | [blog post](http://iobio.io/2019/06/12/introducing-fibridge/). 3 | 4 | The point of this is to allow your browser to "host" files which can be 5 | streamed over HTTP. This requires a proxy server to handle the HTTP requests 6 | and forward them to the browser over websockets. 7 | 8 | Why would this be useful? If the user has a very large file (genomic data files 9 | can easily be in the 20GB-200GB range), and you want to make 10 | [ranged requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests) 11 | to that file (ie only download specific chunks) as though it were hosted on a 12 | normal server, this will allow that. In [iobio](http://iobio.io/) we use this 13 | to allow our backend system to access a user's local files for processing by 14 | backend tools such as samtools. 15 | 16 | # Example usage 17 | 18 | First start up the proxy server. We'll assume it's publicly available at 19 | example.com. You can either download it from the release page, or see 20 | below for instructions on building. 21 | 22 | Then start it up: 23 | 24 | ```bash 25 | ./fibridge-proxy-rs --port 9001 26 | ``` 27 | 28 | A few useful options: 29 | 30 | ```bash 31 | sudo ./fibridge-proxy-rs --host fbrg.xyz --port 80 --ip-address 172.xxx.x.x --key keyfile.pem --cert certfile.pem --secure-port 443 32 | ``` 33 | 34 | Create a hoster object in the browser and host a file (see 35 | [this page](https://github.com/anderspitman/fibridge-host-js) for information 36 | about the `fibridge-host` library): 37 | 38 | ```javascript 39 | const fibridge = require('fibridge-host'); 40 | fibridge.createHoster({ proxyAddress: 'example.com', port: 9001, secure: false }).then((hoster) => { 41 | 42 | const file = new File(["Hi there"], "file.txt", { 43 | type: "text/plain", 44 | }); 45 | 46 | const path = '/' + file.name; 47 | 48 | hoster.hostFile(path, file); 49 | 50 | // This is necessary because fibridge automatically generates a randomized 51 | // hoster id which is included in the path. 52 | const fullPath = hoster.getHostedPath(path); 53 | const url = `http://example.com:9001${fullPath}`; 54 | 55 | console.log(url); 56 | }); 57 | ``` 58 | 59 | That will print out a URL for the hosted file. You can then retrieve the file 60 | using any http client: 61 | 62 | ```bash 63 | curl example.com:9001//file.txt 64 | Hi there 65 | ``` 66 | 67 | Ranged requests work too: 68 | ```bash 69 | curl -H "Range: bytes=0-2" example.com:9001//file.txt 70 | Hi 71 | ``` 72 | 73 | # Building 74 | In order to build from source, you'll first need rust installed. The proxy currently expects 75 | the GUI repo to be available in the same directory, like this: 76 | 77 | ``` 78 | fibridge/ 79 | fibridge-proxy-rs/ 80 | fibridge-gui-js/ 81 | ``` 82 | 83 | See [fibridge-gui-js](https://github.com/anderspitman/fibridge-gui-js) for instructions 84 | on building the GUI. 85 | 86 | Once the GUI is built, run: 87 | 88 | ```bash 89 | cargo build --release 90 | ``` 91 | 92 | If all goes well you should end up with a binary in `fibridge-proxy-rs/target/release`. 93 | 94 | # Other implementations 95 | There is an API-compatible JavaScript (Node) implementation of the proxy server 96 | available 97 | [here](https://github.com/anderspitman/fibridge-proxy-js). 98 | 99 | # API 100 | I still need to document the API, but it's pretty simple. It uses 101 | [omni-rpc](https://github.com/omnistreams/omni-rpc-spec), which is 102 | itself built on top of 103 | [omnistreams](https://github.com/omnistreams/omnistreams-spec). 104 | -------------------------------------------------------------------------------- /src/hoster_manager.rs: -------------------------------------------------------------------------------- 1 | use std::sync::{Arc, Mutex}; 2 | use std::collections::HashMap; 3 | use futures::sync::{mpsc, oneshot}; 4 | use futures::{Stream}; 5 | use serde_json::{json, Value}; 6 | use omnistreams::{ 7 | Multiplexer, MultiplexerEvent, EventEmitter, Producer, SinkAdapter, 8 | MapConduit, Message, 9 | }; 10 | use super::transport::WebSocketTransport; 11 | use warp::http::{Response}; 12 | use hyper::Body; 13 | use warp::filters::ws::{WebSocket}; 14 | use crate::stats_conduit::StatsConduit; 15 | 16 | 17 | type ResponseManagers = Arc>>; 18 | type Cache = Arc>>>; 19 | 20 | const MAX_CACHED_SIZE: usize = 20 * 1024 * 1024; 21 | 22 | 23 | pub struct HosterManager { 24 | id: String, 25 | next_request_id: usize, 26 | mux: Multiplexer, 27 | response_managers: ResponseManagers, 28 | cache: Cache, 29 | } 30 | 31 | struct ResponseManager { 32 | cache_key: String, 33 | tx: oneshot::Sender>, 34 | } 35 | 36 | impl HosterManager { 37 | pub fn new(id: String, ws: WebSocket, done_tx: mpsc::UnboundedSender) -> Self { 38 | 39 | let cache = Arc::new(Mutex::new(HashMap::new())); 40 | let cache_clone = cache.clone(); 41 | 42 | let transport = WebSocketTransport::new(ws); 43 | let mut mux = Multiplexer::new(transport); 44 | 45 | let rpc_set_id = json!({ 46 | "jsonrpc": "2.0", 47 | "method": "setId", 48 | "params": id, 49 | }).to_string(); 50 | 51 | mux.send_control_message(rpc_set_id.as_bytes().to_vec()); 52 | 53 | let events = mux.events().expect("no events"); 54 | 55 | let response_managers: ResponseManagers = Arc::new(Mutex::new(HashMap::new())); 56 | let response_managers_clone = response_managers.clone(); 57 | 58 | let id_clone = id.clone(); 59 | 60 | warp::spawn(events.for_each(move |event| { 61 | 62 | let id = (&id_clone).clone(); 63 | 64 | match event { 65 | MultiplexerEvent::Close => { 66 | done_tx.unbounded_send(id).expect("signal done"); 67 | }, 68 | MultiplexerEvent::ControlMessage(control_message) => { 69 | let message: Value = serde_json::from_slice(&control_message) 70 | .expect("parse control message"); 71 | 72 | println!("{}", message); 73 | 74 | if message.get("error").is_some() { 75 | 76 | match &message["id"] { 77 | Value::Number(request_id) => { 78 | let request_id = request_id.as_u64().expect("parse u64") as usize; 79 | let mut lock = response_managers_clone.lock().expect("get lock"); 80 | let response_manager = lock.remove(&request_id).expect("removed tx"); 81 | 82 | let response = Response::builder() 83 | .status(404) 84 | .body(message["error"]["message"].to_string().into()) 85 | .expect("error response"); 86 | 87 | response_manager.tx.send(response).expect("error send"); 88 | }, 89 | _ => (), 90 | } 91 | } 92 | } 93 | MultiplexerEvent::Conduit(producer, metadata) => { 94 | 95 | let md: Value = serde_json::from_slice(&metadata).expect("parse metadata"); 96 | 97 | println!("Create conduit"); 98 | println!("{}", md); 99 | 100 | let request_id = md["id"].as_u64().expect("parse id") as usize; 101 | 102 | let (stream_tx, stream_rx) = mpsc::channel::>(1); 103 | let stream_rx = stream_rx.map_err(|_e| { 104 | "stream fail" 105 | }); 106 | 107 | // See if there's a way to do this without importing hyper 108 | // directly. 109 | let body = Body::wrap_stream(stream_rx); 110 | 111 | let mut builder = Response::builder(); 112 | 113 | let size = md["result"]["size"].as_u64().expect("parse size") as usize; 114 | 115 | match md["result"].get("range") { 116 | Some(Value::Object(range)) => { 117 | let start = range["start"].as_u64().expect("parse start") as usize; 118 | 119 | let end = match range.get("end") { 120 | Some(Value::Number(end)) => { 121 | end.as_u64().expect("parse end") as usize 122 | }, 123 | _ => size, 124 | }; 125 | 126 | let len = end - start; 127 | 128 | // Need to subtract one from end because HTTP ranges are inclusive 129 | let content_range = format!("bytes {}-{}/{}", start, end - 1, size); 130 | 131 | builder 132 | .status(206) 133 | .header("Content-Range", content_range) 134 | .header("Content-Length", len); 135 | }, 136 | _ => { 137 | builder.header("Content-Length", size); 138 | }, 139 | } 140 | 141 | let response = builder 142 | .header("Accept-Ranges", "bytes") 143 | .header("Content-Type", "application/octet-stream") 144 | .body(body).expect("response"); 145 | 146 | 147 | let mut lock = response_managers_clone.lock().expect("get lock"); 148 | let response_manager = lock.remove(&request_id).expect("removed tx"); 149 | match response_manager.tx.send(response) { 150 | Ok(_) => (), 151 | Err(_) => (), 152 | } 153 | 154 | let cache = cache_clone.clone(); 155 | let cache_key = response_manager.cache_key.clone(); 156 | 157 | // TODO: this is hacky 158 | let mut cached = if size <= MAX_CACHED_SIZE { 159 | vec![0; size] 160 | } 161 | else { 162 | Vec::new() 163 | }; 164 | 165 | let mut index = 0; 166 | let cache_conduit = MapConduit::new(move |data: Message| { 167 | 168 | if size <= MAX_CACHED_SIZE { 169 | 170 | for elem in &data { 171 | cached[index] = *elem; 172 | index += 1; 173 | } 174 | 175 | if index == size { 176 | println!("add {} to cache", cache_key.clone()); 177 | cache.lock().expect("lock cache") 178 | // TODO: get rid of this extra clone 179 | .insert(cache_key.clone(), cached.clone()); 180 | } 181 | } 182 | 183 | data 184 | }); 185 | 186 | let consumer = SinkAdapter::new(stream_tx); 187 | producer 188 | .pipe_through(cache_conduit) 189 | .pipe_through(StatsConduit::new(request_id)) 190 | .pipe_into(consumer); 191 | } 192 | } 193 | Ok(()) 194 | })); 195 | 196 | Self { 197 | id: id.clone(), 198 | next_request_id: 0, 199 | mux, 200 | response_managers, 201 | cache, 202 | } 203 | } 204 | 205 | pub fn id(&self) -> String { 206 | self.id.clone() 207 | } 208 | 209 | fn next_request_id(&mut self) -> usize { 210 | let id = self.next_request_id; 211 | self.next_request_id += 1; 212 | id 213 | } 214 | 215 | pub fn process_request(&mut self, filename: String, range_header: String) -> oneshot::Receiver> { 216 | 217 | let request_id = self.next_request_id(); 218 | 219 | let mut request = json!({ 220 | "jsonrpc": "2.0", 221 | "method": "getFile", 222 | "params": json!({ 223 | "path": format!("/{}", filename), 224 | }), 225 | "id": request_id, 226 | }); 227 | 228 | let (response_tx, response_rx) = oneshot::channel(); 229 | 230 | let range = parse_range_header(&range_header); 231 | 232 | if range.is_some() { 233 | request["params"]["range"] = range.expect("set range"); 234 | } 235 | else { 236 | match self.cache.lock().expect("lock cache").get(&filename) { 237 | Some(cached) => { 238 | println!("serve {} from cache", filename); 239 | // TODO: this early return is nastay 240 | let response = Response::builder() 241 | .body(cached.clone().into()).expect("error response"); 242 | response_tx.send(response).expect("response_tx send"); 243 | return response_rx; 244 | }, 245 | None => (), 246 | } 247 | } 248 | 249 | self.mux.send_control_message(request.to_string().as_bytes().to_vec()); 250 | 251 | let response_manager = ResponseManager { 252 | cache_key: filename, 253 | tx: response_tx, 254 | }; 255 | self.response_managers.lock().expect("get lock").insert(request_id, response_manager); 256 | 257 | response_rx 258 | } 259 | } 260 | 261 | fn parse_range_header(header: &str) -> Option { 262 | if header == "" { 263 | return None; 264 | } 265 | else { 266 | 267 | // TODO: error handling 268 | let parts: Vec<&str> = header.split('=').collect(); 269 | let range_str: Vec<&str> = parts[1].split('-').collect(); 270 | let start = range_str[0].parse::().expect("parse range start"); 271 | let end_str = range_str[1]; 272 | 273 | let mut range = json!({ 274 | "start": start, 275 | }); 276 | 277 | if end_str.len() > 0 { 278 | // Need to add one because HTTP ranges are inclusive 279 | let end = 1 + end_str.parse::().expect("parse range end"); 280 | range["end"] = json!(end); 281 | } 282 | 283 | Some(range) 284 | } 285 | } 286 | -------------------------------------------------------------------------------- /src/id_generator.rs: -------------------------------------------------------------------------------- 1 | use rand::Rng; 2 | use uuid::Uuid; 3 | 4 | 5 | pub trait IdGenerator { 6 | fn gen(&self) -> String; 7 | } 8 | 9 | #[derive(Clone)] 10 | pub struct UuidGenerator { 11 | } 12 | 13 | impl UuidGenerator { 14 | pub fn new() -> Self { 15 | Self { 16 | } 17 | } 18 | } 19 | 20 | impl IdGenerator for UuidGenerator { 21 | fn gen(&self) -> String { 22 | Uuid::new_v4().to_string() 23 | } 24 | } 25 | 26 | #[derive(Clone)] 27 | pub struct ShortIdGenerator { 28 | } 29 | 30 | impl ShortIdGenerator { 31 | pub fn new() -> Self { 32 | Self { 33 | } 34 | } 35 | } 36 | 37 | impl IdGenerator for ShortIdGenerator { 38 | fn gen(&self) -> String { 39 | let mut rng = rand::thread_rng(); 40 | let possible = "0123456789abcdefghijkmnpqrstuvwxyz"; 41 | 42 | let mut random_char = || { 43 | let rand_index = rng.gen_range(0, possible.len()); 44 | possible.chars().nth(rand_index).expect("error generating index") 45 | }; 46 | 47 | let mut id = String::new(); 48 | 49 | for _ in 0..4 { 50 | id.push(random_char()); 51 | } 52 | 53 | id.push('-'); 54 | 55 | for _ in 0..4 { 56 | id.push(random_char()); 57 | } 58 | 59 | id 60 | } 61 | } 62 | 63 | pub fn create_generator(gen_type: &str) -> Box { 64 | if gen_type == "uuid" { 65 | Box::new(UuidGenerator::new()) 66 | } 67 | else { 68 | Box::new(ShortIdGenerator::new()) 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod transport; 2 | mod hoster_manager; 3 | mod stats_conduit; 4 | mod id_generator; 5 | 6 | use std::sync::{Arc, Mutex}; 7 | use std::collections::HashMap; 8 | use warp::{self, Filter}; 9 | use warp::http::{Response, Uri}; 10 | use warp::path::FullPath; 11 | use hoster_manager::HosterManager; 12 | use futures::{Future, Stream}; 13 | use futures::sync::{mpsc}; 14 | use futures::future::Either; 15 | use clap::{App, Arg}; 16 | use std::net::SocketAddrV4; 17 | use hyper::rt; 18 | use crate::id_generator::{create_generator}; 19 | 20 | type HosterManagers = Arc>>; 21 | 22 | 23 | fn main() { 24 | let matches = App::new("fibridge proxy") 25 | .about("Share local files via HTTP streaming") 26 | .arg(Arg::with_name("host") 27 | .short("h") 28 | .long("host") 29 | .value_name("HOST") 30 | .takes_value(true)) 31 | .arg(Arg::with_name("ip") 32 | .short("i") 33 | .long("ip-address") 34 | .value_name("IP") 35 | .takes_value(true)) 36 | .arg(Arg::with_name("port") 37 | .short("p") 38 | .long("port") 39 | .value_name("PORT") 40 | .takes_value(true)) 41 | .arg(Arg::with_name("id-type") 42 | .long("id-type") 43 | .value_name("ID TYPE") 44 | .takes_value(true)) 45 | .arg(Arg::with_name("key") 46 | .long("key") 47 | .value_name("TLS_KEY") 48 | .takes_value(true)) 49 | .arg(Arg::with_name("cert") 50 | .long("cert") 51 | .value_name("TLS_CERT") 52 | .takes_value(true)) 53 | .arg(Arg::with_name("secure-port") 54 | .long("secure-port") 55 | .value_name("SECURE_PORT") 56 | .takes_value(true)) 57 | .get_matches(); 58 | 59 | let port = matches.value_of("port").unwrap_or("9001"); 60 | let ip = matches.value_of("ip").unwrap_or("127.0.0.1"); 61 | let id_type = matches.value_of("id-type").unwrap_or("short-code"); 62 | let addr = format!("{}:{}", ip, port); 63 | 64 | let hoster_managers = Arc::new(Mutex::new(HashMap::new())); 65 | let hoster_managers_clone = hoster_managers.clone(); 66 | let range_clone = hoster_managers.clone(); 67 | let done_clone = hoster_managers.clone(); 68 | 69 | let (done_tx, done_rx) = mpsc::unbounded::(); 70 | 71 | let done_stream = done_rx.for_each(move |done_id| { 72 | done_clone.lock().expect("get lock").remove(&done_id); 73 | Ok(()) 74 | }).map_err(|_| ()); 75 | 76 | let id_generator = Arc::new(create_generator(id_type)); 77 | 78 | let omnis = warp::path("omnistreams") 79 | .map(move || hoster_managers.clone()) 80 | .and(warp::ws2()) 81 | .map(move |hoster_managers: HosterManagers, ws: warp::ws::Ws2| { 82 | 83 | let done_tx = done_tx.clone(); 84 | let id_generator = id_generator.clone(); 85 | 86 | ws.on_upgrade(move |socket| { 87 | 88 | let mut id = id_generator.gen(); 89 | 90 | // TODO: this is pretty hacky 91 | let mut id_attempts = 0; 92 | while hoster_managers.lock().expect("get lock").get(&id).is_some() { 93 | id = id_generator.gen(); 94 | id_attempts += 1; 95 | if id_attempts > 1000 { 96 | panic!("Out of ids"); 97 | } 98 | } 99 | 100 | let hoster = HosterManager::new(id.to_string(), socket, done_tx); 101 | 102 | hoster_managers.lock().expect("get lock").insert(hoster.id(), hoster); 103 | 104 | // TODO: eventually need to actually remove the old ones 105 | dbg!(hoster_managers.lock().expect("get lock").keys()); 106 | 107 | futures::future::ok(()) 108 | }) 109 | }); 110 | 111 | // TODO: reduce duplication with non_ranged below 112 | let ranged = warp::header::("Range") 113 | .and(warp::path::param()) 114 | .and(warp::path::param()) 115 | .and_then(move |range, id: String, filename: String| { 116 | let mut lock = range_clone.lock().expect("get lock"); 117 | 118 | println!("GET /{}/{} {}", id, filename, range); 119 | 120 | match lock.get_mut(&id) { 121 | Some(manager) => { 122 | Either::A(manager.process_request(filename, range) 123 | .map_err(|_e| warp::reject::not_found())) 124 | }, 125 | None => { 126 | // TODO: This still feels super hacky. There's got to be some way to have these 127 | // all be part of the same future. 128 | Either::B(futures::future::ok(Response::builder() 129 | .status(404) 130 | .body("Not found".into()) 131 | .expect("error response"))) 132 | }, 133 | } 134 | }); 135 | 136 | let non_ranged = warp::path::param() 137 | .and(warp::path::param()) 138 | .and_then(move |id: String, filename: String| { 139 | 140 | println!("GET /{}/{}", id, filename); 141 | 142 | let mut lock = hoster_managers_clone.lock().expect("get lock"); 143 | 144 | match lock.get_mut(&id) { 145 | Some(manager) => { 146 | Either::A(manager.process_request(filename, "".to_string()) 147 | .map_err(|_e| warp::reject::not_found())) 148 | }, 149 | None => { 150 | // TODO: This still feels super hacky. There's got to be some way to have these 151 | // all be part of the same future. 152 | Either::B(futures::future::ok(Response::builder() 153 | .status(404) 154 | .body("Not found".into()) 155 | .expect("error response"))) 156 | }, 157 | } 158 | }); 159 | 160 | let download = warp::get2().and(ranged.or(non_ranged)); 161 | 162 | let index = warp::path::end().map(|| { 163 | warp::reply::html(include_str!("../../fibridge-gui-js/dist/index.html")) 164 | }); 165 | 166 | let routes = index 167 | .or(omnis) 168 | .or(download); 169 | 170 | 171 | let key = matches.value_of("key"); 172 | let cert = matches.value_of("cert"); 173 | 174 | 175 | if key.is_some() && cert.is_some() { 176 | 177 | let secure_port = matches.value_of("secure-port").unwrap_or("9002"); 178 | 179 | // if host was specified, use that value, otherwise use the ip 180 | let host = matches.value_of("host").unwrap_or(ip); 181 | let secure_redirect_link = format!("{}:{}", host, secure_port); 182 | 183 | // redirect http to https 184 | let http_routes = warp::path::full().map(move |path: FullPath| { 185 | let uri = Uri::builder() 186 | .scheme("https") 187 | .authority(secure_redirect_link.as_str()) 188 | .path_and_query(path.as_str()) 189 | .build() 190 | .expect("parse uri"); 191 | warp::redirect(uri) 192 | }); 193 | let http_server_future = warp::serve(http_routes) 194 | .bind(addr.parse::() 195 | .expect("parse address")); 196 | 197 | let secure_addr = format!("{}:{}", ip, secure_port); 198 | let https_server_future = warp::serve(routes) 199 | .tls(cert.unwrap(), key.unwrap()) 200 | .bind(secure_addr.parse::().expect("parse address")); 201 | rt::run(rt::lazy(|| { 202 | rt::spawn(done_stream); 203 | rt::spawn(http_server_future); 204 | rt::spawn(https_server_future); 205 | Ok(()) 206 | })); 207 | } 208 | else { 209 | let server_future = warp::serve(routes).bind(addr.parse::().expect("parse address")); 210 | rt::run(rt::lazy(|| { 211 | rt::spawn(done_stream); 212 | rt::spawn(server_future); 213 | Ok(()) 214 | })); 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /src/stats_conduit.rs: -------------------------------------------------------------------------------- 1 | use std::sync::{Arc, Mutex}; 2 | use futures::{Future, Stream, Sink}; 3 | use futures::sync::{mpsc}; 4 | use omnistreams::{ 5 | Streamer, Producer, Consumer, Conduit, CancelReason, 6 | ProducerEventRx, ConsumerEventRx, MapConduit, Message, 7 | MapConsumer, MapProducer, ConsumerEvent, 8 | }; 9 | 10 | pub struct StatsConduit { 11 | consumer: MapConsumer, 12 | producer: MapProducer, 13 | } 14 | 15 | impl StatsConduit { 16 | pub fn new(request_id: usize) -> Self { 17 | 18 | let total_bytes: Arc> = Arc::new(Mutex::new(0)); 19 | let total_bytes_clone = total_bytes.clone(); 20 | 21 | let byte_counter = MapConduit::new(move |item: Message| { 22 | let mut val = total_bytes.lock().expect("lock"); 23 | *val += item.len(); 24 | item 25 | }); 26 | 27 | 28 | let (mut c_byte, p_byte) = byte_counter.split(); 29 | 30 | let events = c_byte.event_stream().expect("get events"); 31 | 32 | let (tx, rx) = mpsc::unbounded(); 33 | let tx = tx.sink_map_err(|_| ()); 34 | 35 | let events_fut = events.map(move |event| { 36 | match event { 37 | ConsumerEvent::Cancellation(_) => { 38 | let val = total_bytes_clone.lock().expect("lock"); 39 | println!("Canceled {} after {} bytes", request_id, *val); 40 | }, 41 | _ => (), 42 | } 43 | 44 | event 45 | }) 46 | .forward(tx) 47 | .map(|_| ()); 48 | 49 | warp::spawn(events_fut); 50 | 51 | c_byte.set_event_stream(rx); 52 | 53 | Self { 54 | consumer: c_byte, 55 | producer: p_byte, 56 | } 57 | } 58 | } 59 | 60 | impl Streamer for StatsConduit { 61 | fn cancel(&mut self, _reason: CancelReason) { 62 | // TODO: implement cancel 63 | } 64 | } 65 | 66 | impl Consumer for StatsConduit { 67 | fn write(&self, data: Message) { 68 | self.consumer.write(data); 69 | } 70 | 71 | fn end(&self) { 72 | self.consumer.end(); 73 | } 74 | 75 | fn event_stream(&mut self) -> Option { 76 | self.consumer.event_stream() 77 | } 78 | 79 | fn set_event_stream(&mut self, event_stream: ConsumerEventRx) { 80 | self.consumer.set_event_stream(event_stream); 81 | } 82 | } 83 | 84 | impl Producer for StatsConduit { 85 | fn request(&mut self, num_items: usize) { 86 | self.producer.request(num_items); 87 | } 88 | 89 | fn event_stream(&mut self) -> Option> { 90 | self.producer.event_stream() 91 | } 92 | 93 | fn set_event_stream(&mut self, event_stream: ProducerEventRx) { 94 | self.producer.set_event_stream(event_stream); 95 | } 96 | } 97 | 98 | impl Conduit for StatsConduit { 99 | 100 | type ConcreteConsumer = MapConsumer; 101 | type ConcreteProducer = MapProducer; 102 | 103 | fn split(self) -> (Self::ConcreteConsumer, Self::ConcreteProducer) { 104 | (self.consumer, self.producer) 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/transport.rs: -------------------------------------------------------------------------------- 1 | use futures::sync::mpsc; 2 | use futures::{Future, Stream, Sink}; 3 | use warp::filters::ws::{Message, WebSocket}; 4 | use omnistreams::{Transport}; 5 | 6 | type OmniMessage = Vec; 7 | type MessageRx = mpsc::UnboundedReceiver; 8 | type MessageTx = mpsc::UnboundedSender; 9 | 10 | 11 | pub struct WebSocketTransport { 12 | out_tx: MessageTx, 13 | in_rx: Option, 14 | } 15 | 16 | impl WebSocketTransport { 17 | pub fn new(ws: WebSocket) -> Self { 18 | let (ws_sink, ws_stream) = ws.split(); 19 | let (out_tx, out_rx) = mpsc::unbounded::(); 20 | let (in_tx, in_rx) = mpsc::unbounded::(); 21 | 22 | let ws_sink = ws_sink 23 | .sink_map_err(|_e| ()); 24 | 25 | let out_task = out_rx.map_err(|_e| ()) 26 | .map(|omni_message| { 27 | Message::binary(omni_message) 28 | }) 29 | .forward(ws_sink) 30 | .map(|_| ()); 31 | 32 | warp::spawn(out_task); 33 | 34 | 35 | let in_tx = in_tx.sink_map_err(|_e| ()); 36 | 37 | let in_task = ws_stream.map_err(|_e| ()) 38 | .map(|ws_message| { 39 | ws_message.as_bytes().to_vec() 40 | }) 41 | .forward(in_tx) 42 | .map(|_| ()); 43 | 44 | warp::spawn(in_task); 45 | 46 | Self { 47 | out_tx, 48 | in_rx: Some(in_rx), 49 | } 50 | } 51 | } 52 | 53 | impl Transport for WebSocketTransport { 54 | fn send(&mut self, message: OmniMessage) { 55 | match self.out_tx.unbounded_send(message) { 56 | Ok(_) => { 57 | }, 58 | Err(_) => { 59 | eprintln!("Transport attempt to send on closed out_Tx"); 60 | }, 61 | } 62 | } 63 | fn messages(&mut self) -> Option> { 64 | Option::take(&mut self.in_rx) 65 | } 66 | } 67 | --------------------------------------------------------------------------------