#1 <sf.jp> service function can't return faultcode

open-accepted
nobody
None
4
2007-09-15
2007-04-30
nobunobu
No

------------------------------------------
Original report was posted by mumin (mumincacao)
http://sourceforge.jp/tracker/index.php?func=detail&aid=10256&group_id=64&atid=7892
------------------------------------------
[ja](This report is written in Japanese)

/modules/legacy/lib/ShadeSoap/NusoapServer.class.php
L120 - 127

ShadeSoap_NusoapServer::invoke_method()
で対応する service 関数を読んだ後に

if (is_array($retValue)) {
 $retValue = $this->_encodeUTF8($retValue, $root-
>mLanguageManager);
}
else {
 $retValue = $root->mLanguageManager->encodeUTF8
($retValue);
}

と encode 処理をかけちゃうために soap_fault くらすを返
しても文字列に変換されちゃうため期待する反応が返ってこ
ないです

if(is_object($retValue) && get_class($retValue)
== 'soap_fault')
{
$retValue->faultcode = $root->mLanguageManager-
>encodeUTF8($retValue->faultcode);
$retValue->faultactor = $root->mLanguageManager-
>encodeUTF8($retValue->faultactor);
$retValue->faultstring = $root->mLanguageManager-
>encodeUTF8($retValue->faultstring);
$retValue->faultdetail = $root->mLanguageManager-
>encodeUTF8($retValue->faultdetail);
}

こんなかんじの処理を追加すればだいじょーぶかなぁ?

あとこれはばぐなのか仕様なのかびみょーだけど,service
関数の引数が内部 encoding に変換されず UTF のまま飛んで
きてるみたいです。

Discussion

  • nobunobu

    nobunobu - 2007-04-30

    Logged In: YES
    user_id=1270173
    Originator: YES

    Original comments at sourceforge.jp
    ---------------------------------
    Date: 2007-04-25 19:10
    Author: minahito

    Logged In: YES
    user_id=8353

    This task is Cube 1.0.

    Date: 2007-04-13 11:23
    Author: mumincacao

    Logged In: YES
    user_id=24376

    php5 で動かなかったからほんとにちょっとだけ修正しましたです
     【なんちゃらさーば】ヾ(´・ω・`;【壁

    って思いっきり投げっぱなしてたけど,使い方は解凍してできた
    preload の中身をそのまま
    {XOOPS_ROOT_PATH}/preload
    に投げ込んでもらえれば動くと思いますです
    基本的に ShadeSoap_NusoapServer を置き換えるだけなので
    Service 側は戻り値以外変更なしでいける・・・かなぁ?

    Date: 2007-04-12 20:33
    Author: mumincacao

    Logged In: YES
    user_id=24376

    勢いで創っちゃったので置いときますです 【なんちゃらさー
    ば】ヾ(´・ω・`;【壁

    変更点としては

    引数を XCube_Root::mContext::mRequest にまっぴんぐ
    →内部 service とおんなじ方法で取得できるように
    →ついでに UTF を内部こーどに変換

    戻り値をかなり変更
    →基本は XCube_Object のさぶくらす
    XCube_ObjectArray は値を保持できる構造じゃないみたいなので
    通常の配列で
    正常に処理できなかったときは Temporary_Exception を投げる

    global function や static method 用の処理は見なかったことに
    →XCube_Service が出力する WSDL では出ない気がするので

    こんなかんじにしてありますです
    っていうか途中からかなりうにになってたのであとは赤ぺんせんせ
    おねがいしますです

    Date: 2007-04-10 12:56
    Author: minahito

    Logged In: YES
    user_id=8353

    If you have to use XCube_Service, do define {Your}_Service
    as sub-class of XCube_Service to get your goal.

    [JA]
    もし近いうちに XCube_Service を使わなければまずいのであれ
    ば、 {なんちゃら}_Service を XCube_Service のサブクラスとし
    て定義してしのいでください。m(__)m

    Date: 2007-04-10 12:54
    Author: minahito

    Logged In: YES
    user_id=8353

    This is our 'homework' for Cube 1.0. In Legacy 2.1, this is
    'Known Issue'.

    Date: 2007-04-10 12:27
    Author: minahito

    Logged In: YES
    user_id=8353

    XCube_Service may have to define the specific Exeption
    class. And, SOAP may convert it to soap_fault when it is
    outer service. But, it needs some time to consider it.

    [JA]
    XCube_Service が専用の例外クラスを持ち、 SOAP アダプタが外部
    サービス時のみ soap_fault なりにコンバートすればいいかもしれ
    ません。いずれにせよ、ちょっと時間が欲しいところです。

    Date: 2007-04-09 15:00
    Author: mumincacao

    Logged In: YES
    user_id=24376

    こーど読んでてなんとなくそんな感じはしてたけどやっぱり
    XCube_Object か XCube_ObjectArray を継承したのしか返せないで
    すか(´・ω・`;【壁
    唯一見つけた XCube_Service のさんぷるとして
    Legacy_SearchService 見てたら array で返してたから特に縛りは
    ないってことにしてました
    それなら XCube_Object を継承した例外処理用のをつく・・・って
    それだと定義してある戻り値と型が変わっちゃうし・・・

    とりあえずえらーの時は null や -9999 を返すみたいなおやくそ
    くで回避かなぁ?

    Date: 2007-04-09 13:56
    Author: minahito

    Logged In: YES
    user_id=8353

    [EN]
    Sub-class of virtual service doesn't need to return
    soap_fault object. (A virtual service doesn't depend on the
    specific way)

    The virtual service will not be completed in 0.9.

    [JA]
    仮想サービスのサブクラスは soap_fault オブジェクトを返す前提
    に立っていない(というか、仮想サービスの実装側は特定の経路に
    依存してはいけない)ので...後で(相当後日に)ちょっと検証し
    てみますね。0.9は、仮想サービスは未完のままいくと思います。

    File Added: soap.tgz

     
  • nobunobu

    nobunobu - 2007-04-30

    SOAPserver Trial

     
  • nobunobu

    nobunobu - 2007-04-30

    SOAPserver Trial(New)

     
  • nobunobu

    nobunobu - 2007-04-30

    Logged In: YES
    user_id=1270173
    Originator: YES

    File Added: soap.tgz

     
  • nobunobu

    nobunobu - 2007-04-30
    • summary: <sf.jp>service function can't return faultcode --> <sf.jp> service function can't return faultcode
    • status: open --> open-accepted
     
  • mumin

    mumin - 2007-06-15

    Logged In: YES
    user_id=1642217
    Originator: NO

    This attached file is minor change revision, but I could not find form of attached file.
    So, only the change point is reported.

    1.xsd:decimal, xsd:token and xsd:base64Binary type was added to allowed built-in datatype
    /preload/lib/soap/ServiceServer.class.php L172
    + /**
    + * _isXSD
    + *
    + * @param string $type
    + *
    + * @return bool
    + *
    + * @private
    + **/
    + function _isXSD($type)
    + {
    + return ($type == 'string' || $type == 'int' || $type == 'decimal' || $type == 'token' || $type == 'base64Binary');
    + }

    /preload/lib/soap/ServiceServer.class.php L200 or L214
    - (XCube_ServiceUtils::isXSD($tmpClassName) ? 'xsd' : 'tns:')
    + ($this->_isXSD($tmpClassName) ? 'xsd' : 'tns:')

    /preload/lib/soap/ServiceServer.class.php L231 or L245
    - (XCube_ServiceUtils::isXSD($type) ? 'xsd:' : 'tns:')
    + ($this->_isXSD($type) ? 'xsd:' : 'tns:')

    /preload/lib/soap/ServiceServer.class.php L264 or L278
    - (XCube_ServiceUtils::isXSD($tmpOut) ? 'xsd:' : 'tns:')
    + ($this->_isXSD($tmpOut) ? 'xsd:' : 'tns:')

    /preload/lib/soap/ServiceServer.class.php L272 or L286
    - (XCube_ServiceUtils::isXSD($type) ? 'xsd:' : 'tns:')
    + ($this->_isXSD($type) ? 'xsd:' : 'tns:')

    This changed XCube_ServiceUtils::isXSD into ServiceServer::_isXSD.
    If you need other built-in datatype, you add in _isXSD method.

    2.notice message is fixed
    /preload/lib/soap/SoapServer.class.php L152-154
    $root->mContext->mRequest =& new XCube_GenericRequest(
    - $this->_decodeUTF8($this->methodparams,$root->mLanguageManager)
    + is_array($this->methodparams) ?
    + $this->_decodeUTF8($this->methodparams,$root->mLanguageManager) :
    + array()
    );

    3.Debug message missing is fixed
    /preload/lib/soap/SoapServer.class.php L204-211
    $this->debug(
    XCube_Utils::formatString(
    'in invoke_method, called method {0}, received {1} of type {2}',
    $this->methodname,
    - $this->methodreturn,
    + print_r($this->methodreturn,true),
    gettype($this->methodreturn)
    )
    );

    4.Typo is fixed
    /preload/lib/soap/SoapServer.class.php L259
    - case is_object($val) && is_a($val,XCube_Object):
    + case is_object($val) && is_a($val,'XCube_Object'):

    5.For debugging code is fixed
    /preload/lib/soap/SoapServer.class.php L286-287
    - print_r($this->debug_str,true)
    -// $this->methodname
    + $this->methodname

    [ja]そこまでおっきな変更じゃないけどびみょーなとこあったから修正版を・・・
    と思ったらふぁいるの添付をするとこが見つからないので変更点だけ

    1.基本型に xsd:string と xsd:int しか使えなかったので xsd:decimal,xsd:token,xsd:base64Binary の追加
    /preload/lib/soap/ServiceServer.class.php L172 付近
    + /**
    + * _isXSD
    + *
    + * @param string $type
    + *
    + * @return bool
    + *
    + * @private
    + **/
    + function _isXSD($type)
    + {
    + return ($type == 'string' || $type == 'int' || $type == 'decimal' || $type == 'token' || $type == 'base64Binary');
    + }

    /preload/lib/soap/ServiceServer.class.php L200 か L214 付近
    - (XCube_ServiceUtils::isXSD($tmpClassName) ? 'xsd' : 'tns:')
    + ($this->_isXSD($tmpClassName) ? 'xsd' : 'tns:')

    /preload/lib/soap/ServiceServer.class.php L231 か L245 付近
    - (XCube_ServiceUtils::isXSD($type) ? 'xsd:' : 'tns:')
    + ($this->_isXSD($type) ? 'xsd:' : 'tns:')

    /preload/lib/soap/ServiceServer.class.php L264 か L278 付近
    - (XCube_ServiceUtils::isXSD($tmpOut) ? 'xsd:' : 'tns:')
    + ($this->_isXSD($tmpOut) ? 'xsd:' : 'tns:')

    /preload/lib/soap/ServiceServer.class.php L272 か L286 付近
    - (XCube_ServiceUtils::isXSD($type) ? 'xsd:' : 'tns:')
    + ($this->_isXSD($type) ? 'xsd:' : 'tns:')

    って xsd 判定めそっどを独自実装
    まだ足りなかったら _isXSD に各自で追加してください

    2.さーびすの引数が void なときに notice が出るのを修正
    /preload/lib/soap/SoapServer.class.php L152-154
    $root->mContext->mRequest =& new XCube_GenericRequest(
    - $this->_decodeUTF8($this->methodparams,$root->mLanguageManager)
    + is_array($this->methodparams) ?
    + $this->_decodeUTF8($this->methodparams,$root->mLanguageManager) :
    + array()
    );

    3.戻り値の値によってはでばぐ情報がびみょーになるのを修正
    /preload/lib/soap/SoapServer.class.php L204-211
    $this->debug(
    XCube_Utils::formatString(
    'in invoke_method, called method {0}, received {1} of type {2}',
    $this->methodname,
    - $this->methodreturn,
    + print_r($this->methodreturn,true),
    gettype($this->methodreturn)
    )
    );

    4.typo の修正
    /preload/lib/soap/SoapServer.class.php L259
    - case is_object($val) && is_a($val,XCube_Object):
    + case is_object($val) && is_a($val,'XCube_Object'):

    5.でばぐ用の消し忘れ _(.._;【壁
    /preload/lib/soap/SoapServer.class.php L286-287
    - print_r($this->debug_str,true)
    -// $this->methodname
    + $this->methodname

    使ってるひとがいるのかわかんないけどとりあえず途中経過のご報告まで[/ja]

     
  • minahito

    minahito - 2007-09-15
    • labels: 963736 -->
    • milestone: 705996 -->
    • assigned_to: minahito --> nobody
     
  • minahito

    minahito - 2007-09-15

    Logged In: YES
    user_id=1102607
    Originator: NO

    Moved to "Feature Request".

     

Log in to post a comment.