Function: socks-filter
socks-filter is a byte-compiled function defined in socks.el.gz.
Signature
(socks-filter PROC STRING)
Source Code
;; Defined in /usr/src/emacs/lisp/net/socks.el.gz
(defun socks-filter (proc string)
(let (state version desired-len)
(or (process-get proc 'socks)
(error "socks-filter called on non-SOCKS connection %S" proc))
(setq state (process-get proc 'socks-state))
(cond
((= state socks-state-waiting-for-auth)
(cl-callf (lambda (s) (setq string (concat s string)))
(process-get proc 'socks-scratch))
(if (< (length string) 2)
nil ; We need to spin some more
(process-put proc 'socks-authtype (aref string 1))
(process-put proc 'socks-scratch (substring string 2 nil))
(process-put proc 'socks-state socks-state-submethod-negotiation)))
((= state socks-state-submethod-negotiation)
)
((= state socks-state-authenticated)
)
((= state socks-state-waiting)
(cl-callf (lambda (s) (setq string (concat s string)))
(process-get proc 'socks-scratch))
(setq version (process-get proc 'socks-server-protocol))
(cond
((equal version 'http)
(if (not (string-search "\r\n\r\n" string))
nil ; Need to spin some more
(process-put proc 'socks-state socks-state-connected)
(process-put proc 'socks-reply 0)
(process-put proc 'socks-response string)))
((equal version 4)
(if (< (length string) 2)
nil ; Can't know how much to read yet
(setq desired-len
(+ 4 ; address length
2 ; port
2 ; initial data
))
(if (< (length string) desired-len)
nil ; need to spin some more
(let ((response (aref string 1)))
(if (= response 90)
(setq response 0))
(process-put proc 'socks-state socks-state-connected)
(process-put proc 'socks-reply response)
(process-put proc 'socks-response string)))))
((equal version 5)
(if (< (length string) 4)
nil
(setq desired-len
(+ 6 ; Standard socks header
(pcase (aref string 3)
((pred (= socks-address-type-v4)) 4)
((pred (= socks-address-type-v6)) 16)
((pred (= socks-address-type-name))
(if (< (length string) 5)
255
(+ 1 (aref string 4)))))))
(if (< (length string) desired-len)
nil ; Need to spin some more
(process-put proc 'socks-state socks-state-connected)
(process-put proc 'socks-reply (aref string 1))
(process-put proc 'socks-response string))))))
((= state socks-state-connected)))))