代码之家  ›  专栏  ›  技术社区  ›  Evan Carroll

为什么Catalyst::Controller::WrapCGI没有得到任何后期数据?

  •  1
  • Evan Carroll  · 技术社区  · 9 年前

    每当我 POST 页面上的内容 Catalyst::Controller::WrapCGI 我注意到我的旧CGI脚本没有 柱,柱 data..HTTP请求主体内的数据。我做错了什么?我该如何解决?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Evan Carroll    9 年前

    就我而言,这是因为我在使用 Catalyst::Controller::WrapCGI v0.35和 Catalyst::Controller::REST 。这造成了一个问题。我的配置看起来像这样,

    package MyApp::Controller::REST;
    __PACKAGE__->config(namespace => '');
    BEGIN { extends 'Catalyst::Controller::REST' }
    

    package MyApp::Controller::Root;
    __PACKAGE__->config(namespace => '');
    BEGIN { extends 'Catalyst::Controller::WrapCGI' }
    

    然而 Catalyst::控制器::REST 安装 begin action on line 298

    sub begin : ActionClass('Deserialize') { }
    

    而且,在我的情况下,这是授权给 Catalyst::Action::Deserialize::JSON 它足够聪明 seek($body,0,0) 但太愚蠢和不体贴了,不能为下一个家伙做这件事。。。。 Code below from here

    if(openhandle $body) {
        seek($body, 0, 0); # in case something has already read from it
        while ( defined( my $line = <$body> ) ) {
            $rbody .= $line;
        }
    }
    

    更糟糕的是,这个例子中的下一个家伙 催化剂::控制器::WrapCGI 它不仅没有为下一个家伙清理,而且也没有为自己设置 (code from here) ,

    if ($body) { # Slurp from body filehandle
      local $/; $body_content = <$body>;
    }
    

    那应该看起来像(至少)

    if ($body) { # Slurp from body filehandle
      local $/;
      seek($body,0,0);
      $body_content = <$body>;
    }
    

    这就是为什么我们不能拥有美好的东西。。。 I opened a bug in C:C:WrapCGI to get this resolved.