XMLRPC súlyos gond

Fórumok

Megpróbáltam "B" típusú értéket küldeni XMLRPC-vel, és bizony nagyon meghátaltak a dógok tőle. Utánanéztem, és az rpcmethod.prg rpctype függvénye valóban méltánytalanul keveset (semennyit) foglalkozik a bináris típussal. Indítványoznám, hogy valamiképpen bytesorozatként menjen át, bár kétségtelen, hogy az XMLRPC szabvány előírja az unicode-ot...

w

Hozzászólások

Feltételezem, hogy a B típus elírás. Kódblokkot nem lehet átküldeni, helyette a kódblokk kiértékelődik, és az eredmény megy át (valahogy így emlékszem, de meg kell nézni pontosabban).

Valószínűleg bytesorozat (X) típusra gondoltál. Tetszőleges bytesorozat azonban nem bír része lenni egy XML dokumentumnak, ilyen az XML szabvány, ezzel nem lehet mit kezdeni. Az XML dokumentumban csak karakterek lehetnek, ami nem karakter, arra az XML elemző hibát dob. Pl. UTF-8 kódolású dokumentumban az érvénytelen UTF-8 szekvencia az hiba. Latin-1 kódolásban a 0 byte hiba (azt hiszem a space alatt csak a TAB, LF és CR számít karakternek).

Tehát bináris érték nem tud nyersen átmenni XMLRPC paraméterként. Ilyenkor az a megoldás, hogy az értéket base64 kódolással becsomagoljuk.

--
CCC3

Szerk:

Az XML szabvány nem írja elő a unicode-ot. Azt írja elő, hogy a default kódolás UTF-8. Ehelyett meg lehet adni más kódolást is, pl. ISO-8859-1 (latin-1), ami egy egybájtos kódolás. Azonban ezzel sem lehet átvinni olyan bájtokat, amik a szabvány szerint nem számítanak karakternek. Tehát az a döntő, hogy a szabvány kimondja: az XML dokumentum karakterekből áll.

Igen, elírás volt, bocs :)
Oké, ezt tettem, végülis nem rossz így sem. Most azon gondolkozom, hogy akkor az X típussal lehetne-e automatikusan ezt csinálni, hogy base64_encode segítségével küldeni át, csak a kérdés, hogy a túloldal honnan fogja tudni, hogy ez most X és nem pedig C, és base64_decode-olni kell. De lehet, hogy ez meg már túlzás, végülis base64-gyel gond nélkül átment nekem, tehát voltaképp nincs is gond. :) Annyit lehetne még tenni, hogy a fent nevezett függvényben valahogyan jelezni, akár egy errorral, hogy nem jó a dolog, ugyanis így NIL-t ad vissza, ami aztán sokkal később misztikus hibaként jelenik meg, amikor a <value>-hoz akar NIL-t adni.

w

Az XP-en a CCC3\tools\xmlrpc\demo-rpc-ban talaalhatoo peldaat elszaal a linkben.
A linuxban ugyanaz tökeeletesen müködik.

C:\CCC\CCC3\tools\xmlrpc\demo-rpc>bapp_w32c @parfile.bld
CCC Program Builder 1.2.24 Copyright (C) ComFirm Bt.
.
OBJ2EXE.BAT demo-client .
-------------------------------------------------------------------------
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0xb2): undefined reference to `ERR_peek_error'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x2dc): undefined reference to `ERR_error_string'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x380): undefined reference to `ERR_peek_error'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x6cf): undefined reference to `TLSv1_client_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x6dd): undefined reference to `SSL_CTX_new'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x784): undefined reference to `SSLv23_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x7e9): undefined reference to `SSLv2_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x80d): undefined reference to `SSLv2_server_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x951): undefined reference to `SSLv2_client_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x9a7): undefined reference to `SSLv3_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x9bb): undefined reference to `SSLv3_server_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0xa11): undefined reference to `SSLv3_client_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0xab3): undefined reference to `SSLv23_server_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0xb09): undefined reference to `SSLv23_client_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0xb5f): undefined reference to `TLSv1_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0xbb5): undefined reference to `TLSv1_server_method'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0xc84): undefined reference to `SSL_CTX_free'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0xeb1): undefined reference to `SSL_CTX_use_certificate_file'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x1129): undefined reference to `SSL_CTX_use_certificate_chain_file'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x13b1): undefined reference to `SSL_CTX_use_PrivateKey_file'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x1605): undefined reference to `SSL_CTX_check_private_key'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x1726): undefined reference to `X509_STORE_CTX_get_current_cert'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x172e): undefined reference to `X509_get_subject_name'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x1743): undefined reference to `X509_NAME_oneline'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x1887): undefined reference to `SSL_CTX_set_verify'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x1aa5): undefined reference to `SSL_CTX_get_verify_mode'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x1c55): undefined reference to `SSL_CTX_get_verify_depth'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x1e4e): undefined reference to `SSL_CTX_set_verify_depth'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x209e): undefined reference to `SSL_CTX_load_verify_locations'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x2364): undefined reference to `SSL_load_client_CA_file'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x237e): undefined reference to `SSL_CTX_set_client_CA_list'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x2585): undefined reference to `SSL_CTX_get_quiet_shutdown'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x2746): undefined reference to `SSL_CTX_set_quiet_shutdown'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x2986): undefined reference to `SSL_CTX_set_session_id_context'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x2bfa): undefined reference to `SSL_CTX_ctrl'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x2e10): undefined reference to `SSL_CTX_ctrl'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x3025): undefined reference to `SSL_CTX_get_timeout'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x3221): undefined reference to `SSL_CTX_set_timeout'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x344a): undefined reference to `SSL_CTX_ctrl'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x3660): undefined reference to `SSL_CTX_ctrl'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x3884): undefined reference to `SSL_CTX_flush_sessions'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x3a4a): undefined reference to `SSL_CTX_ctrl'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x3b47): undefined reference to `SSL_load_error_strings'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslctx_funif.obj):sslctx_funif.cpp:(.text+0x3b4c): undefined reference to `SSL_library_init'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0xc5): undefined reference to `SSL_new'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x1ac): undefined reference to `SSL_new'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x324): undefined reference to `SSL_free'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x521): undefined reference to `SSL_set_fd'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x735): undefined reference to `SSL_get_fd'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x8e5): undefined reference to `SSL_accept'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0xa95): undefined reference to `SSL_connect'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0xc45): undefined reference to `SSL_clear'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0xe26): undefined reference to `SSL_write'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x116c): undefined reference to `SSL_get_fd'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x11df): undefined reference to `SSL_pending'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x123f): undefined reference to `SSL_read'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x149e): undefined reference to `SSL_get_error'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x15c5): undefined reference to `SSL_pending'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x178a): undefined reference to `SSL_ctrl'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(sslcon_funif.obj):sslcon_funif.cpp:(.text+0x1945): undefined reference to `SSL_shutdown'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(set_callback.obj):set_callback.cpp:(.text+0x62): undefined reference to `CRYPTO_num_locks'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(set_callback.obj):set_callback.cpp:(.text+0xde): undefined reference to `CRYPTO_set_locking_callback'
C:\CCC\ccc3\usr\lib\mng\ccc3_sslsocket.lib(set_callback.obj):set_callback.cpp:(.text+0xea): undefined reference to `CRYPTO_set_id_callback'
collect2: ld returned 1 exit status