hi again,

On Fri, Sep 09, 2005 at 01:37:34PM +0200, Hans Bulfone wrote:
> i have attached a patch that fixes both, i hope you like it :)
> it works for me but i've not tested it thoroughly.

i've extended the patch to provide support for http basic
authentication on the client side.

regards,
hans.
diff -Nrc xml-rpc.orig/xml-rpc-client.scm xml-rpc/xml-rpc-client.scm
*** xml-rpc.orig/xml-rpc-client.scm     2004-12-08 18:59:54.000000000 +0100
--- xml-rpc/xml-rpc-client.scm  2005-09-09 14:47:47.843111216 +0200
***************
*** 5,10 ****
--- 5,11 ----
  (require 'ssax-utils)
  (require 'xml-rpc-utils)
  (require 'url)
+ (require 'base64)
  
  (declare 
    (uses extras)
***************
*** 19,25 ****
    (sprintf "Chicken ~A, XML-RPC ~A" (chicken-version) version) )
  
  (define (xml-rpc:server host . more)
!   (define (decode-arguments host port path)
      (let* ((endpoint-url (url host))
           (endpoint-scheme (url-scheme endpoint-url))
           (host-is-url (if endpoint-scheme
--- 20,26 ----
    (sprintf "Chicken ~A, XML-RPC ~A" (chicken-version) version) )
  
  (define (xml-rpc:server host . more)
!   (define (decode-arguments host port path user pass)
      (let* ((endpoint-url (url host))
           (endpoint-scheme (url-scheme endpoint-url))
           (host-is-url (if endpoint-scheme
***************
*** 31,40 ****
          (values
           (url-host endpoint-url)
           (or (url-port endpoint-url) 80)
!          (string-append "/" (or (url-path endpoint-url) "")))
!         (values host port path))))
!   (let-optionals more ([port 80] [path "/RPC2"])
!     (let-values (((host port path) (decode-arguments host port path)))
        (lambda (name)
        (lambda args
          (let ([payload (create-payload name args)])
--- 32,43 ----
          (values
           (url-host endpoint-url)
           (or (url-port endpoint-url) 80)
!          (string-append "/" (or (url-path endpoint-url) ""))
!          (url-user endpoint-url)
!          (url-password endpoint-url))
!         (values host port path user pass))))
!   (let-optionals more ([port 80] [path "/RPC2"] [user #f] [pass #f])
!     (let-values (((host port path user pass) (decode-arguments host port path 
user pass)))
        (lambda (name)
        (lambda args
          (let ([payload (create-payload name args)])
***************
*** 43,51 ****
                           (http:make-request
                            'post 
                            (sprintf "~A:~A~A" host port path)
!                           `(("content-type" . "text/xml")
!                             ("content-length" . ,(number->string 
(string-length payload)))
!                             ("user-agent" . ,xml-rpc:version) )
                            payload
                            'http/1.0) ) ] )
                        (let ([x (parameterize ([case-sensitive #t]) 
--- 46,62 ----
                           (http:make-request
                            'post 
                            (sprintf "~A:~A~A" host port path)
!                           (append
!                            `(("content-type" . "text/xml")
!                              ("content-length" . ,(number->string 
(string-length payload)))
!                              ("user-agent" . ,xml-rpc:version) )
!                            (if (and user pass)
!                                `(("authorization" . ,(string-append
!                                                       "Basic "
!                                                       (base64:encode
!                                                        (string-append
!                                                         user ":" pass)))))
!                                '()))
                            payload
                            'http/1.0) ) ] )
                        (let ([x (parameterize ([case-sensitive #t]) 
***************
*** 78,87 ****
                 (apply values (map xml-rpc:unmarshall-value x)) ]
                [`(fault
                   (value
!                   (struct
!                    (member (name "faultCode") (value (int ,code)))
!                    (member (name "faultString") (value (string ,str))) ) ) )
!                (xml-rpc:error (string->number code) (sprintf "XML-RPC fault 
response (code ~A): ~A" code str)) ]
                [r (bad r r0)] ) ]
             [r (bad r r0)] ) ) ]
        [r (bad r r0)] ) ) ) )
--- 89,105 ----
                 (apply values (map xml-rpc:unmarshall-value x)) ]
                [`(fault
                   (value
!                   ,('struct members ...)))
!                (let loop ((code #f) (msg #f) (members members))
!                  (if (null? members)
!                      (xml-rpc:error (and code (string->number code))
!                                     (sprintf "XML-RPC fault response (code 
~A): ~A" code msg))
!                      (match (car members)
!                        [`(member (name "faultCode") (value ,((or 'int 'i4) 
code)))
!                         (loop code msg (cdr members))]
!                        [`(member (name "faultString") (value (string ,msg)))
!                         (loop code msg (cdr members))]
!                        [r (bad r r0)])))]
                [r (bad r r0)] ) ]
             [r (bad r r0)] ) ) ]
        [r (bad r r0)] ) ) ) )
_______________________________________________
Chicken-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to