webserver

Posted lan126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webserver相关的知识,希望对你有一定的参考价值。

(defun http-char (c1 c2 &optional (default #\space))
	(let ((code (parse-integer 
		(coerce (list c1 c2) ‘string)
		:radix 16
		:junk-allowed t)))
		(if code
			(code-char code)
			default)))

(defun decode-param (s)
	(labels ((f (lst)
		(when lst
			(case (car lst)
				(#\% (cons (http-char (cadr lst) (caddr lst))
					(f (cdddr lst))))
				(#\+ (cons #\space (f (cdr lst))))
				(otherwise (cons (car lst) (f (cdr lst))))))))
	(coerce (f (coerce s ‘list )) ‘string)))


(defun parse-params (s)
	(let* ((i1 (position #\= s))
			(i2 (position #\& s)))
	(cond (i1 (cons (cons (intern (string-upcase (subseq s 0 i1)))
		(decode-param (subseq s (1+ i1) i2)))
	(and i2 (parse-params (subseq s (1+ i2))))))
	((equal s "") nil)
	(t s))))


(defun parse-url (s)
	(let* ((url (subseq s
			(+ 2 (position #\space s))
			(position #\space s :from-end t) ))
		(x (position #\? url)) )
	(if x
		(cons (subseq url 0 x) (parse-params (subseq url (1+ x))))
		(cons url ‘()))))


(defun get-header (stream)
	(let* ((s (read-line stream))
		   (h (let ((i (position #\: s)))
		   		(when i
		   			(cons (intern (string-upcase (subseq s 0 i)))
		   				  (subseq s (+ 2 i)))))))
	(when h
		(cons h (get-header stream)))))


(defun get-content-params (stream header)
	(let ((length (cdr (assoc ‘content-header header)))) 
		(when length
			(let ((content (make-string (parse-integer length))))
				(read-sequence content stream)
				(parse-params content)))))


(defun serve (request-handler)
	(let ((socket (socket-server 8080)))
		(unwind-protect 
			(loop (with-open-stream (stream (socket-accept socket))
				(let* ((url (parse-url (read-line stream)))
					   (path (car url))
					   (header (get-header stream))
					   (params (append (cdr url)
					   				   (get-content-params stream header)))
					   (*standard-output* stream))
				(funcall request-handler path header params))))
			(socket-server-close socket))))


(defun hello-request-handler (path header params)
	(if (equal path "greeting")
		(let ((name (assoc ‘name params )))
			(if (not name)
				(princ "<html><form>What is your name? <input name=‘name‘/> </form><html>")
				(format t "<html>Nice to meet you,~a! </html>" (cdr name))))
		(princ "Sorry I don‘t know the page.")))

 

最后的显示似乎有点问题

以上是关于webserver的主要内容,如果未能解决你的问题,请参考以下文章

gulp-webserver

esp32通过webserver监听,控制主板上led灯(多任务)

ASP.NET CORE Linux发布工具(文件对比 只上传差异文件;自动启停WebServer命令;上传完成自动预热WebServer)

ESP8266 WebServer如何流式传输无符号字符

github webhook 实现代码自动部署 踩坑!!

ESP 保姆级教程 疯狂传感器篇 —— 案例:ESP8266 + DHT11 +WebServer页面(检测温湿度网页显示)