chickadee » internet-message

internet-message

Description

internet-message is a collection of parser combinators for the grammar defined in RFC 5322 (Internet Message Format).

Usage

The combinator procedures in this library are based on the interface provided by the abnf library.

Each procedure exported by internet-message parser combinator of the form (lambda (cont s) ...), which takes a continuation and input stream. For instance, the message parser combinator can be used to parse messages:

;; A procedure which creates an input stream from a string
(define (string->input-stream s) `(() ,(string->list s)))

;; A procedure used to report parse errors 
(define (err s)
  (print "internet message error on stream: " s)
  (list))

(let* (;; Parser combinator procedure which takes continuation and input stream
         (parse-message (lambda (cont s) ((message) (compose cont car) err s)))
         (my-message "From: John Doe <jdoe@machine.example>\r\nTo: Mary Smith <mary@example.net>\r\nSubject: Saying Hello\r\nDate: Fri, 21 Nov 1997 09:55:06 -0600\r\nMessage-ID: <1234@local.machine.example>\r\n\r\nThis is a message just to say hello.\r\nSo, \r\n\r\n\"Hello\".")
          )        

  (parse-message (lambda (s) (test (apply sprintf "~S -> ~S" p) res s))
                 (string->input-stream inp))
  )
->
(message 
  (fields (From (mailbox-list (mailbox (display-name (" John " "Doe ")) (local-part "jdoe") (domain "machine.example"))))
          (To (mailbox (display-name (" Mary " "Smith ")) (local-part "mary") (domain "example.net")))
          (Subject " Saying Hello") 
	  (Date (day-of-week "Fri") (date "21" "Nov" "1997") (time "09" "55" "06" "-" "06" "00"))
	  (Message-id  (message-id "1234" "local.machine.example")))
  (body "This is a message just to say hello." "So, " "\"Hello\"."))
              

Library Procedures

The following procedures are exported:

fieldsprocedure

This parser will parse an arbitrary number of header fields as defined in the RFC. For each field, an appropriate alist is created. The following fields are recognized:

  • from
  • sender
  • return-path
  • reply-to
  • to
  • cc
  • bcc
  • message-id
  • in-reply-to
  • references
  • subject
  • comments
  • keywords
  • orig-date
  • resent-date
  • resent-from
  • resent-sender
  • resent-to
  • resent-cc
  • resent-bcc
  • resent-msg-id
  • resent-reply-to
  • received
  • optional-field
bodyprocedure

This parser will parse a message body as specified by the RFC; that is, any number of text characters, which may be divided into separate lines by CRLF.

messageprocedure

This parser will parse a complete message as defined by the RFC and it will break it down into the separate header fields and the message body.

commentprocedure

This parser parses comment text, as defined by the RFC. Comments may nest.

Repository

https://github.com/iraikov/chicken-internet-message

Requires

Version History

License

Based on the Haskell Rfc2822 module by Peter Simons.

 Copyright 2009-2018 Ivan Raikov.
 This program is free software: you can redistribute it and/or
 modify it under the terms of the GNU General Public License as
 published by the Free Software Foundation, either version 3 of the
 License, or (at your option) any later version.
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 General Public License for more details.
 A full copy of the GPL license can be found at
 <http://www.gnu.org/licenses/>.

Contents »