guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: extract headers from response record


From: wolf
Subject: Re: extract headers from response record
Date: Thu, 10 Aug 2023 00:34:22 +0200

On 2023-08-09 10:18:05 -0400, Mortimer Cladwell wrote:
> Hi,
> I am running a local fake Urbit zod on port 8080. I want to submit an
> http-request and obtain an urbauth id cookie. I run the following method:
> 
> (use-modules (web client)(web response) (srfi srfi-9)(oop goops) (ice-9
> receive) (ice-9 pretty-print))
> 
> (define (urbit-http-connect)
>   (let* ((uri "http://localhost:8080/~/login";)
>          (data (string-append "password=" "lidlut-tabwed-pillex-ridrup"))
> (a (receive (response body)
>   (http-request uri #:method 'POST #:body data)
>      response)))
>   (pretty-print a)))
> 
> ==> #<<response> version: (1 . 1) code: 204 reason-phrase: "ok" headers:
> ((date . #<date nanosecond: 0 second: 29 minute: 49 hour: 13 day: 9 month:
> 8 year: 2023 zone-offset: 0>) (connection close) (server .
> "urbit/vere-2.11") (set-cookie .
> "urbauth-~zod=0v7.126dd.8rbvk.lga05.jvieb.287to; Path=/; Max-Age=604800"))
> port: #<closed: file 7fc2a569b3f0>>
> 
> Below I substitute (pretty-print a) with various commands and show the
> response:
> 
> (pretty-print  (class-of a)) ==> #<<class> <<response>> 7f721fc4c280>
> (pretty-print  (record? a)) ==> #t
> (pretty-print  (response? a)) ==> #f
> 
> (pretty-print  (response-headers a)) ==> In procedure response-headers:
> Wrong type argument: #<<response> version: (1 . 1) code: 204 reason-phrase:
> "ok" headers: ((date . #<date nanosecond: 0 second: 34 minute: 0 hour: 14
> day: 9 month: 8 year: 2023 zone-offset: 0>) (connection close) (server .
> "urbit/vere-2.11") (set-cookie .
> "urbauth-~zod=0v5.9pm4c.pa0qd.00hao.vsq1p.h37hh; Path=/; Max-Age=604800"))
> port: #<closed: file 7fbaa95eb3f0>>
> 
> So I have a record that looks like a <response> record but isn't. How do I
> extract the headers from this 'response'?

I apologize for my previous message, apparently my reading comprehension is
really low at this time of day.  Anyway, to actually answer the question:
response-headers is the procedure you are looking for.  You are already using
it, and it works for me (without the receive, so maybe consider dropping it
since it is not necessary):

((accept-ranges bytes)
 (cache-control (max-age . 604800))
 (content-type text/html (charset . "UTF-8"))
 (date .
       #<date nanosecond: 0 second: 32 minute: 30 hour: 22 day: 9 month: 8 
year: 2023 zone-offset: 0>)
 (etag "3147526947" . #t)
 (expires
   .
   #<date nanosecond: 0 second: 32 minute: 30 hour: 22 day: 16 month: 8 year: 
2023 zone-offset: 0>)
 (last-modified
   .
   #<date nanosecond: 0 second: 26 minute: 18 hour: 7 day: 17 month: 10 year: 
2019 zone-offset: 0>)
 (server . "EOS (vny/044F)")
 (content-length . 1256)
 (connection close))

Expression evaluated was:

(use-modules (ice-9 pretty-print)
             (ice-9 receive)
             (web client)
             (web response))

(define (urbit-http-connect)
  (let* ((uri "http://example.org";)
         (data (string-append "password=" "lidlut-tabwed-pillex-ridrup"))
         (response (http-request uri #:method 'POST #:body data)))
    (pretty-print (response-headers response))))

(urbit-http-connect)



> How do I determine the record type?
> Thanks
> Mortimer

W.

-- 
There are only two hard things in Computer Science:
cache invalidation, naming things and off-by-one errors.

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]