正在显示
4 个修改的文件
包含
280 行增加
和
4 行删除
| @@ -170,21 +170,22 @@ int SrsConfDirective::parse_conf(_srs_internal::SrsConfigBuffer* buffer, SrsDire | @@ -170,21 +170,22 @@ int SrsConfDirective::parse_conf(_srs_internal::SrsConfigBuffer* buffer, SrsDire | ||
| 170 | } | 170 | } |
| 171 | if (ret == ERROR_SYSTEM_CONFIG_BLOCK_END) { | 171 | if (ret == ERROR_SYSTEM_CONFIG_BLOCK_END) { |
| 172 | if (type != parse_block) { | 172 | if (type != parse_block) { |
| 173 | - srs_error("line %d: unexpected \"}\"", buffer->line + 1); | 173 | + srs_error("line %d: unexpected \"}\", ret=%d", buffer->line + 1, ret); |
| 174 | return ret; | 174 | return ret; |
| 175 | } | 175 | } |
| 176 | return ERROR_SUCCESS; | 176 | return ERROR_SUCCESS; |
| 177 | } | 177 | } |
| 178 | if (ret == ERROR_SYSTEM_CONFIG_EOF) { | 178 | if (ret == ERROR_SYSTEM_CONFIG_EOF) { |
| 179 | if (type == parse_block) { | 179 | if (type == parse_block) { |
| 180 | - srs_error("line %d: unexpected end of file, expecting \"}\"", conf_line + 1); | 180 | + srs_error("line %d: unexpected end of file, expecting \"}\", ret=%d", conf_line + 1, ret); |
| 181 | return ret; | 181 | return ret; |
| 182 | } | 182 | } |
| 183 | return ERROR_SUCCESS; | 183 | return ERROR_SUCCESS; |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | if (args.empty()) { | 186 | if (args.empty()) { |
| 187 | - srs_error("line %d: empty directive.", conf_line + 1); | 187 | + ret = ERROR_SYSTEM_CONFIG_INVALID; |
| 188 | + srs_error("line %d: empty directive. ret=%d", conf_line + 1, ret); | ||
| 188 | return ret; | 189 | return ret; |
| 189 | } | 190 | } |
| 190 | 191 |
| @@ -116,6 +116,8 @@ namespace _srs_internal | @@ -116,6 +116,8 @@ namespace _srs_internal | ||
| 116 | * SrsConfDirective: name="ffmpeg", arg0="/bin/ffmpeg", child-directives=[] | 116 | * SrsConfDirective: name="ffmpeg", arg0="/bin/ffmpeg", child-directives=[] |
| 117 | * ] | 117 | * ] |
| 118 | * ] | 118 | * ] |
| 119 | +* @remark, allow empty directive, for example: "dir0 {}" | ||
| 120 | +* @remark, don't allow empty name, for example: ";" or "{dir0 arg0;} | ||
| 119 | */ | 121 | */ |
| 120 | class SrsConfDirective | 122 | class SrsConfDirective |
| 121 | { | 123 | { |
| @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 31 | // current release version | 31 | // current release version |
| 32 | #define VERSION_MAJOR "0" | 32 | #define VERSION_MAJOR "0" |
| 33 | #define VERSION_MINOR "9" | 33 | #define VERSION_MINOR "9" |
| 34 | -#define VERSION_REVISION "163" | 34 | +#define VERSION_REVISION "164" |
| 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION | 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION |
| 36 | // server info. | 36 | // server info. |
| 37 | #define RTMP_SIG_SRS_KEY "SRS" | 37 | #define RTMP_SIG_SRS_KEY "SRS" |
| @@ -390,3 +390,276 @@ VOID TEST(ConfigDirectiveTest, ParseNameArg2_Dir0Arg0_Dir0Arg0) | @@ -390,3 +390,276 @@ VOID TEST(ConfigDirectiveTest, ParseNameArg2_Dir0Arg0_Dir0Arg0) | ||
| 390 | EXPECT_STREQ("ddir_arg0", ddir0.arg0().c_str()); | 390 | EXPECT_STREQ("ddir_arg0", ddir0.arg0().c_str()); |
| 391 | EXPECT_EQ(0, (int)ddir0.directives.size()); | 391 | EXPECT_EQ(0, (int)ddir0.directives.size()); |
| 392 | } | 392 | } |
| 393 | + | ||
| 394 | +VOID TEST(ConfigDirectiveTest, Parse2SingleDirs) | ||
| 395 | +{ | ||
| 396 | + MockSrsConfigBuffer buf("dir0 arg0;dir1 arg1;"); | ||
| 397 | + SrsConfDirective conf; | ||
| 398 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 399 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 400 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 401 | + EXPECT_EQ(2, (int)conf.directives.size()); | ||
| 402 | + | ||
| 403 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 404 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 405 | + EXPECT_EQ(1, (int)dir0.args.size()); | ||
| 406 | + EXPECT_STREQ("arg0", dir0.arg0().c_str()); | ||
| 407 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 408 | + | ||
| 409 | + SrsConfDirective& dir1 = *conf.directives.at(1); | ||
| 410 | + EXPECT_STREQ("dir1", dir1.name.c_str()); | ||
| 411 | + EXPECT_EQ(1, (int)dir1.args.size()); | ||
| 412 | + EXPECT_STREQ("arg1", dir1.arg0().c_str()); | ||
| 413 | + EXPECT_EQ(0, (int)dir1.directives.size()); | ||
| 414 | +} | ||
| 415 | + | ||
| 416 | +VOID TEST(ConfigDirectiveTest, ParseSingleComplexDirs) | ||
| 417 | +{ | ||
| 418 | + MockSrsConfigBuffer buf("dir0 arg0;dir1 {dir2 arg2;}"); | ||
| 419 | + SrsConfDirective conf; | ||
| 420 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 421 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 422 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 423 | + EXPECT_EQ(2, (int)conf.directives.size()); | ||
| 424 | + | ||
| 425 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 426 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 427 | + EXPECT_EQ(1, (int)dir0.args.size()); | ||
| 428 | + EXPECT_STREQ("arg0", dir0.arg0().c_str()); | ||
| 429 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 430 | + | ||
| 431 | + SrsConfDirective& dir1 = *conf.directives.at(1); | ||
| 432 | + EXPECT_STREQ("dir1", dir1.name.c_str()); | ||
| 433 | + EXPECT_EQ(0, (int)dir1.args.size()); | ||
| 434 | + EXPECT_EQ(1, (int)dir1.directives.size()); | ||
| 435 | + | ||
| 436 | + SrsConfDirective& dir2 = *dir1.directives.at(0); | ||
| 437 | + EXPECT_STREQ("dir2", dir2.name.c_str()); | ||
| 438 | + EXPECT_EQ(1, (int)dir2.args.size()); | ||
| 439 | + EXPECT_STREQ("arg2", dir2.arg0().c_str()); | ||
| 440 | + EXPECT_EQ(0, (int)dir2.directives.size()); | ||
| 441 | +} | ||
| 442 | + | ||
| 443 | +VOID TEST(ConfigDirectiveTest, ParseStringArgs) | ||
| 444 | +{ | ||
| 445 | + MockSrsConfigBuffer buf("dir0 arg0 \"str_arg\" 100;"); | ||
| 446 | + SrsConfDirective conf; | ||
| 447 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 448 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 449 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 450 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 451 | + | ||
| 452 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 453 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 454 | + EXPECT_EQ(3, (int)dir0.args.size()); | ||
| 455 | + EXPECT_STREQ("arg0", dir0.arg0().c_str()); | ||
| 456 | + EXPECT_STREQ("str_arg", dir0.arg1().c_str()); | ||
| 457 | + EXPECT_STREQ("100", dir0.arg2().c_str()); | ||
| 458 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 459 | +} | ||
| 460 | + | ||
| 461 | +VOID TEST(ConfigDirectiveTest, ParseStringArgsWithSpace) | ||
| 462 | +{ | ||
| 463 | + MockSrsConfigBuffer buf("dir0 arg0 \"str_arg space\" 100;"); | ||
| 464 | + SrsConfDirective conf; | ||
| 465 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 466 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 467 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 468 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 469 | + | ||
| 470 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 471 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 472 | + EXPECT_EQ(3, (int)dir0.args.size()); | ||
| 473 | + EXPECT_STREQ("arg0", dir0.arg0().c_str()); | ||
| 474 | + EXPECT_STREQ("str_arg space", dir0.arg1().c_str()); | ||
| 475 | + EXPECT_STREQ("100", dir0.arg2().c_str()); | ||
| 476 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 477 | +} | ||
| 478 | + | ||
| 479 | +VOID TEST(ConfigDirectiveTest, ParseNumberArgs) | ||
| 480 | +{ | ||
| 481 | + MockSrsConfigBuffer buf("dir0 100 101 102;"); | ||
| 482 | + SrsConfDirective conf; | ||
| 483 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 484 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 485 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 486 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 487 | + | ||
| 488 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 489 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 490 | + EXPECT_EQ(3, (int)dir0.args.size()); | ||
| 491 | + EXPECT_EQ(100, ::atoi(dir0.arg0().c_str())); | ||
| 492 | + EXPECT_EQ(101, ::atoi(dir0.arg1().c_str())); | ||
| 493 | + EXPECT_EQ(102, ::atoi(dir0.arg2().c_str())); | ||
| 494 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 495 | +} | ||
| 496 | + | ||
| 497 | +VOID TEST(ConfigDirectiveTest, ParseFloatArgs) | ||
| 498 | +{ | ||
| 499 | + MockSrsConfigBuffer buf("dir0 100.01 101.02 102.03;"); | ||
| 500 | + SrsConfDirective conf; | ||
| 501 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 502 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 503 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 504 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 505 | + | ||
| 506 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 507 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 508 | + EXPECT_EQ(3, (int)dir0.args.size()); | ||
| 509 | + EXPECT_FLOAT_EQ(100.01, ::atof(dir0.arg0().c_str())); | ||
| 510 | + EXPECT_FLOAT_EQ(101.02, ::atof(dir0.arg1().c_str())); | ||
| 511 | + EXPECT_FLOAT_EQ(102.03, ::atof(dir0.arg2().c_str())); | ||
| 512 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 513 | +} | ||
| 514 | + | ||
| 515 | +VOID TEST(ConfigDirectiveTest, ParseComments) | ||
| 516 | +{ | ||
| 517 | + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;\n#end-comments"); | ||
| 518 | + SrsConfDirective conf; | ||
| 519 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 520 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 521 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 522 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 523 | + | ||
| 524 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 525 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 526 | + EXPECT_EQ(1, (int)dir0.args.size()); | ||
| 527 | + EXPECT_STREQ("arg0", dir0.arg0().c_str()); | ||
| 528 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 529 | +} | ||
| 530 | + | ||
| 531 | +VOID TEST(ConfigDirectiveTest, ParseCommentsInline) | ||
| 532 | +{ | ||
| 533 | + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;#inline comments\n#end-comments"); | ||
| 534 | + SrsConfDirective conf; | ||
| 535 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 536 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 537 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 538 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 539 | + | ||
| 540 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 541 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 542 | + EXPECT_EQ(1, (int)dir0.args.size()); | ||
| 543 | + EXPECT_STREQ("arg0", dir0.arg0().c_str()); | ||
| 544 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 545 | +} | ||
| 546 | + | ||
| 547 | +VOID TEST(ConfigDirectiveTest, ParseCommentsInlineWithSpace) | ||
| 548 | +{ | ||
| 549 | + MockSrsConfigBuffer buf(" #commnets\ndir0 arg0; #inline comments\n #end-comments"); | ||
| 550 | + SrsConfDirective conf; | ||
| 551 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 552 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 553 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 554 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 555 | + | ||
| 556 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 557 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 558 | + EXPECT_EQ(1, (int)dir0.args.size()); | ||
| 559 | + EXPECT_STREQ("arg0", dir0.arg0().c_str()); | ||
| 560 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 561 | +} | ||
| 562 | + | ||
| 563 | +VOID TEST(ConfigDirectiveTest, ParseCommentsInlinemixed) | ||
| 564 | +{ | ||
| 565 | + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;#inline comments\n#end-comments\ndir1 arg1;"); | ||
| 566 | + SrsConfDirective conf; | ||
| 567 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 568 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 569 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 570 | + EXPECT_EQ(2, (int)conf.directives.size()); | ||
| 571 | + | ||
| 572 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 573 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 574 | + EXPECT_EQ(1, (int)dir0.args.size()); | ||
| 575 | + EXPECT_STREQ("arg0", dir0.arg0().c_str()); | ||
| 576 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 577 | + | ||
| 578 | + SrsConfDirective& dir1 = *conf.directives.at(1); | ||
| 579 | + EXPECT_STREQ("dir1", dir1.name.c_str()); | ||
| 580 | + EXPECT_EQ(1, (int)dir1.args.size()); | ||
| 581 | + EXPECT_STREQ("arg1", dir1.arg0().c_str()); | ||
| 582 | + EXPECT_EQ(0, (int)dir1.directives.size()); | ||
| 583 | +} | ||
| 584 | + | ||
| 585 | +VOID TEST(ConfigDirectiveTest, ParseSpecialChars) | ||
| 586 | +{ | ||
| 587 | + MockSrsConfigBuffer buf("dir0 http://www.ossrs.net/api/v1/versions?level=major;"); | ||
| 588 | + SrsConfDirective conf; | ||
| 589 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 590 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 591 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 592 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 593 | + | ||
| 594 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 595 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 596 | + EXPECT_EQ(1, (int)dir0.args.size()); | ||
| 597 | + EXPECT_STREQ("http://www.ossrs.net/api/v1/versions?level=major", dir0.arg0().c_str()); | ||
| 598 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 599 | +} | ||
| 600 | + | ||
| 601 | +VOID TEST(ConfigDirectiveTest, ParseSpecialChars2) | ||
| 602 | +{ | ||
| 603 | + MockSrsConfigBuffer buf("dir0 rtmp://[server]:[port]/[app]/[stream]_[engine];"); | ||
| 604 | + SrsConfDirective conf; | ||
| 605 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 606 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 607 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 608 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 609 | + | ||
| 610 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 611 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 612 | + EXPECT_EQ(1, (int)dir0.args.size()); | ||
| 613 | + EXPECT_STREQ("rtmp://[server]:[port]/[app]/[stream]_[engine]", dir0.arg0().c_str()); | ||
| 614 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 615 | +} | ||
| 616 | + | ||
| 617 | +VOID TEST(ConfigDirectiveTest, ParseInvalidNoEndOfDirective) | ||
| 618 | +{ | ||
| 619 | + MockSrsConfigBuffer buf("dir0"); | ||
| 620 | + SrsConfDirective conf; | ||
| 621 | + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); | ||
| 622 | +} | ||
| 623 | + | ||
| 624 | +VOID TEST(ConfigDirectiveTest, ParseInvalidNoEndOfSubDirective) | ||
| 625 | +{ | ||
| 626 | + MockSrsConfigBuffer buf("dir0 {"); | ||
| 627 | + SrsConfDirective conf; | ||
| 628 | + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); | ||
| 629 | +} | ||
| 630 | + | ||
| 631 | +VOID TEST(ConfigDirectiveTest, ParseInvalidNoStartOfSubDirective) | ||
| 632 | +{ | ||
| 633 | + MockSrsConfigBuffer buf("dir0 }"); | ||
| 634 | + SrsConfDirective conf; | ||
| 635 | + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); | ||
| 636 | +} | ||
| 637 | + | ||
| 638 | +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyName) | ||
| 639 | +{ | ||
| 640 | + MockSrsConfigBuffer buf(";"); | ||
| 641 | + SrsConfDirective conf; | ||
| 642 | + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); | ||
| 643 | +} | ||
| 644 | + | ||
| 645 | +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyName2) | ||
| 646 | +{ | ||
| 647 | + MockSrsConfigBuffer buf("{}"); | ||
| 648 | + SrsConfDirective conf; | ||
| 649 | + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); | ||
| 650 | +} | ||
| 651 | + | ||
| 652 | +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyDirective) | ||
| 653 | +{ | ||
| 654 | + MockSrsConfigBuffer buf("dir0 {}"); | ||
| 655 | + SrsConfDirective conf; | ||
| 656 | + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); | ||
| 657 | + EXPECT_EQ(0, (int)conf.name.length()); | ||
| 658 | + EXPECT_EQ(0, (int)conf.args.size()); | ||
| 659 | + EXPECT_EQ(1, (int)conf.directives.size()); | ||
| 660 | + | ||
| 661 | + SrsConfDirective& dir0 = *conf.directives.at(0); | ||
| 662 | + EXPECT_STREQ("dir0", dir0.name.c_str()); | ||
| 663 | + EXPECT_EQ(0, (int)dir0.args.size()); | ||
| 664 | + EXPECT_EQ(0, (int)dir0.directives.size()); | ||
| 665 | +} |
-
请 注册 或 登录 后发表评论