-*- org -*-
* Notes
-* Tasks [4/8]
+* Tasks [5/8]
** DONE Handle POST requests
1. read standard for POST data
2. parse multi-line headers with boundaries
** DONE non-multipart form data
e.g., parameter strings
-** TODO some more convenience functionality [5/6]
-- [ ] strip and parse URL query string
+** DONE some more convenience functionality [6/6]
+- [X] strip and parse URL query string
- [X] parse urlencoded post data
- [X] think about defaulting to (name . content) for form elements
- [X] maybe don't require a non-nil return to cancel the connection,
(require 'emacs-web-server-status-codes)
(require 'mail-parse) ; to parse multipart data in headers
(require 'mm-encode) ; to look-up mime types for files
+(require 'url-util) ; to decode url-encoded params
(require 'eieio)
(eval-when-compile (require 'cl))
(require 'cl-lib)
(cl-flet ((to-keyword (s) (intern (concat ":" (upcase (match-string 1 s))))))
(cond
((string-match ews-http-method-rx string)
- (list (cons (to-keyword (match-string 1 string)) (match-string 2 string))
- (cons :TYPE (match-string 3 string))))
+ (let ((method (to-keyword (match-string 1 string)))
+ (url (match-string 2 string)))
+ (if (string-match "?" url)
+ (cons (cons method (substring url 0 (match-beginning 0)))
+ (url-parse-query-string (url-unhex-string
+ (substring url (match-end 0))) ))
+ (list (cons method url)))))
((string-match "^\\([^[:space:]]+\\): \\(.*\\)$" string)
(list (cons (to-keyword string) (match-string 2 string))))
(:otherwise (ews-error proc "bad header: %S" string) nil))))
(throw 'finished-parsing-headers t))
;; Parse a URL
((eq boundary :application/x-www-form-urlencoded)
- (mapc (lambda (p)
- (when (string-match "=" p)
- (setcdr (last headers)
- (list (cons (substring p 0 (match-beginning 0))
- (substring p (match-end 0)))))))
- (split-string (ews-trim (substring pending last-index))
- "&" 'omit-nulls))
+ (mapc (lambda (pair) (setcdr (last headers) (list pair)))
+ (url-parse-query-string
+ (ews-trim (substring pending last-index))))
(throw 'finished-parsing-headers t))
;; Build up multipart data.
(boundary
--- /dev/null
+;;; url-param-echo.el --- echo back url-paramed message using Emacs Web Server
+
+;; Copyright (C) 2013 Eric Schulte <schulte.eric@gmail.com>
+
+;; Author: Eric Schulte <schulte.eric@gmail.com>
+;; Keywords: http url-param
+;; License: GPLV3 (see the COPYING file in this directory)
+
+;;; Code:
+(require 'emacs-web-server)
+
+(ews-start
+ '(((:GET . ".*") .
+ (lambda (proc request)
+ (ews-response-header proc 200 '("Content-type" . "text/html"))
+ (process-send-string proc
+ (concat "URL Parameters:</br><table><tr>"
+ (mapconcat (lambda (pair)
+ (format "<th>%s</th><td>%s</td>"
+ (car pair)
+ (mapconcat #'identity (cdr pair) " ")))
+ (cl-remove-if-not (lambda (el) (stringp (car el)))
+ request)
+ "</tr><tr>")
+ "</tr></table>")))))
+ 9005)