Отправка чего-нибудь куда-нибудь из Emacs по TCP

September 2012 · 2 minute read

Короткий рецепт отправки содержимого текущего буфера по TCP. Отправляет весь текст буфера, затем открывает отдельный фрейм в нижней половине экрана, куда возвращает результат. Бинарные данные гонять не особо будет удобно, а вот для тестирования текстовых протоколов вроде HTTP самое оно. За основу взял примеры кода с EmacsWiki. Мне эта функция понадобилась для отправки запросов на сайт и просмотра результатов вместе с HTTP-заголовками, обернул её только для интерактивного вызова. Получился простой такой редактор HTTP, а больше и не требовалось.

https://gist.github.com/grafov/3730213

(defun tcp-send (server port &optional timeout) 
 "Отправить текст текущего буфера на server:port"
 (if (not timeout) (setq timeout 60))

 (let* ((res "*TCP/Result*")
	(cur-buf (buffer-name))
	(proc (open-network-stream "TcpRequest" 
				   (progn (switch-to-buffer (get-buffer-create res))
					  (erase-buffer)
					  (switch-to-buffer cur-buf) res)
				   server port)))

   (process-send-string proc (buffer-string))
   (while (equal (process-status proc) 'open)
     (when (not (accept-process-output proc timeout))
       (delete-process proc)
       (error "Network timeout.")))
   
   (switch-to-buffer res)
   (beginning-of-buffer)
   (split-window)
   (switch-to-buffer cur-buf)))

Если нужен полноценный tcp-клиент, то вот тут есть: http://www.emacswiki.org/emacs/tcp-client.el/

UPDATED В более завершённом для тестирования HTTP виде для Emacs нашелся такой код: https://github.com/hassy/http-twiddle/.

   (defun tcp-send (server port &optional timeout) 
   "Отправить текст текущего буфера на server:port"
   (if (not timeout) (setq timeout 60))
  
   (let* ((res "*TCP/Result*")
    	(cur-buf (buffer-name))
    	(proc (open-network-stream "TcpRequest" 
    				   (progn (switch-to-buffer (get-buffer-create res))
    					  (erase-buffer)
    					  (switch-to-buffer cur-buf) res)
    				   server port)))
  
     (process-send-string proc (buffer-string))
     (while (equal (process-status proc) 'open)
       (when (not (accept-process-output proc timeout))
         (delete-process proc)
         (error "Network timeout.")))
     
     (switch-to-buffer res)
     (beginning-of-buffer)
     (split-window)
     (switch-to-buffer cur-buf)))