home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / gnu / emacs / gnus / 974 < prev    next >
Encoding:
Text File  |  1992-07-30  |  2.6 KB  |  73 lines

  1. Path: sparky!uunet!sun-barr!cs.utexas.edu!qt.cs.utexas.edu!yale.edu!ira.uka.de!chx400!sicsun!disuns2!disuns2.epfl.ch!simon
  2. From: simon@lia.di.epfl.ch (Simon Leinen)
  3. Newsgroups: gnu.emacs.gnus
  4. Subject: missing CRs in NNTP communication (RFC violation)
  5. Message-ID: <SIMON.92Jul30124258@liasg1.epfl.ch>
  6. Date: 30 Jul 92 10:42:58 GMT
  7. Sender: news@disuns2.epfl.ch
  8. Organization: DI-LIA -- Ecole Polytechnique Federale de Lausanne
  9. Lines: 60
  10. Nntp-Posting-Host: liasg1.epfl.ch
  11. X-Md4-Signature: 870626cb5828e09f03067e3e23ee6389
  12.  
  13. Testing GNUS against a new NNTP implementation, I found that GNUS
  14. fails to terminate the lines it sends to the remote NNTP server
  15. correctly.  RFC 977 states:
  16.  
  17.    272     Each command line must be terminated by a CR-LF (Carriage Return -
  18.    273     Line Feed) pair.
  19. [...]
  20.  
  21. For lines of posted articles this requirement is not stated
  22. explicitly, but the server I tested required CRLFs even there (this
  23. has been fixed now).
  24.  
  25. My fix was to replace two functions in nntp.el to insert proper CRLF
  26. sequences before sending lines to the NNTP process.  Tested on Lucid
  27. GNU Emacs 19.2 with C-News 1.5.11 and VMNNTP.
  28. -- 
  29. Simon.
  30.  
  31. (defun nntp-encode-text ()
  32.   "Encode text in current buffer for NNTP transmission.
  33. 1. Insert additional `.' at beginning of lines that start with a dot.
  34. 2. Insert CRs at the end of lines that don't have it already.
  35. 3. Insert `.' at end of buffer (end of text mark)."
  36.   (save-excursion
  37.     ;; Insert newline at end of buffer.
  38.     (goto-char (point-max))
  39.     (if (not (bolp))
  40.     (insert "\n"))
  41.     ;; Replace `.' at beginning of line with `..'.
  42.     (goto-char (point-min))
  43.     ;; (replace-regexp "^\\." "..")
  44.     (while (search-forward "\n" nil t)
  45.       (if (or (= (match-beginning 0) (point-min))
  46.           (not (eq (char-after (1- (match-beginning 0))) 13)))
  47.       (progn
  48.         (forward-char -1)
  49.         (insert "\r")
  50.         (forward-char 1)))
  51.       (if (looking-at "\\.")
  52.       (insert ".")))
  53.     ;; Insert `.' at end of buffer (end of text mark).
  54.     (goto-char (point-max))
  55.     (insert ".\r\n")
  56.     ))
  57.  
  58. (defun nntp-send-strings-to-server (&rest strings)
  59.   "Send list of STRINGS to news server as command and its arguments."
  60.   (let ((cmd (car strings))
  61.     (strings (cdr strings)))
  62.     ;; Command and each argument must be separeted by one or more spaces.
  63.     (while strings
  64.       (setq cmd (concat cmd " " (car strings)))
  65.       (setq strings (cdr strings)))
  66.     ;; Make sure the connection hasn't been closed on us.
  67.     (or (nntp-server-opened)
  68.     (nntp-restart-connection))
  69.     ;; Command line must be terminated by a CR-LF.
  70.     (nntp-trace "SEND [%s]" cmd)
  71.     (process-send-string nntp-server-process (concat cmd "\r\n"))
  72.     ))
  73.