【问题标题】:wash_out parse failures: SOAP errors instead of HTML errorswash_out 解析失败:SOAP 错误而不是 HTML 错误
【发布时间】:2012-10-24 21:34:37
【问题描述】:

因此,当您在 Rails 中使用wash_out gem,并且客户端发送错误的 XML 时,响应如下:

<html>…
  <body>
    <h1>REXML::ParseException</h1> 
    …

而不是正确的 SOAP 响应,如下所示:

<soap:Body>
  <soap:Fault>
    <faultcode>soap:Client</faultcode>
    …

我首先尝试修补wash_out 本身。我设法重现 REXML::ParseException 来自其测试,但后来发现让我沮丧 Rails 在wash_out 之前实际上会解析(并分解)错误的 XML 触及参数。

那么,wash_out gem 应该如何钩入 Rails 以便它可以拯救那些 例外,只针对它拥有的路由?

这是我们必须使用的回溯。我很确定有一些 指向它是完美的钩子,但我还不知道是哪个:

malformed XML: missing tag start
Line: 13
Position: 558
Last 80 unconsumed characters:
<urn:                <Width xsi:type="xsd:int">1</Width>                <Height x
Line: 13
Position: 558
Last 80 unconsumed characters:
<urn:                <Width xsi:type="xsd:int">1</Width>                <Height x):
  /home/rking/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:95:in `rescue in parse'
  /home/rking/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:20:in `parse'
  /home/rking/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/rexml/document.rb:231:in `build'
  /home/rking/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/rexml/document.rb:43:in `initialize'
  activesupport (3.2.8) lib/active_support/xml_mini/rexml.rb:30:in `new'
  activesupport (3.2.8) lib/active_support/xml_mini/rexml.rb:30:in `parse'
  activesupport (3.2.8) lib/active_support/xml_mini.rb:80:in `parse'
  activesupport (3.2.8) lib/active_support/core_ext/hash/conversions.rb:90:in `from_xml'
  actionpack (3.2.8) lib/action_dispatch/middleware/params_parser.rb:41:in `parse_formatted_parameters'
  actionpack (3.2.8) lib/action_dispatch/middleware/params_parser.rb:17:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/flash.rb:242:in `call'
  rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context'
  rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/cookies.rb:339:in `call'
  activerecord (3.2.8) lib/active_record/query_cache.rb:64:in `call'
  activerecord (3.2.8) lib/active_record/connection_adapters/abstract/connection_pool.rb:473:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
  activesupport (3.2.8) lib/active_support/callbacks.rb:405:in `_run__937528092__call__217727214__callbacks'
  activesupport (3.2.8) lib/active_support/callbacks.rb:405:in `__run_callback'
  activesupport (3.2.8) lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
  activesupport (3.2.8) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (3.2.8) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/reloader.rb:65:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.8) lib/rails/rack/logger.rb:26:in `call_app'
  railties (3.2.8) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.1) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.8) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.1) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/static.rb:62:in `call'
  railties (3.2.8) lib/rails/engine.rb:479:in `call'
  railties (3.2.8) lib/rails/application.rb:223:in `call'
  rack (1.4.1) lib/rack/content_length.rb:14:in `call'
  railties (3.2.8) lib/rails/rack/log_tailer.rb:17:in `call'
  rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service'
  /home/rking/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  /home/rking/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  /home/rking/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread' 

谢谢! ——☈

【问题讨论】:

    标签: ruby-on-rails soap rack activesupport actionpack


    【解决方案1】:

    这行得通:

    https://github.com/exad/wash_out/commit/7695dcf9214ab3176b6e3c795c1d309571f7854c

    基本上,我们创建了一个机架中间件层并将其插入到正确的位置。

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多