[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: Submitting a form



# 息抜き。。。はぁ。。。

From: Katsumi Yamaoka <yamaoka@jpl.org> さん曰く
Subject: [emacs-w3m:06494] Re: Submitting a form
Message-ID: <b9yvflwccgi.fsf@jpl.org>
Date: Wed, 25 Feb 2004 07:57:49 +0900

> すみませんが、どなたかフォローしていただけないでしょうか?
> ぼくは、確かに動作しませんね、と言うくらいしかできないので。^^;;

ちょっとだけ実験してみました。

> > http://www.klas.com/talkingbooks/nc

の "Search For:" に emacs と書いて実験すると、

firefox (動く) では

http://www.klas.com/cgi-bin/klascomm.cgi/ncbph?CurrScr=SimpleSearch&Num=25&RecTp=ALL&LastRec=&FirstRec=&LimitHits=First&SessionFile=OpacLog000028430&Index=Title&Str=emacs&Keyword=yes&Media=*&Disp=table&Button=Submit+Search

という URL。

Emacs-w3m (動かない) では goto-url したときの引数の URL は
http://www.klas.com/cgi-bin/klascomm.cgi/ncbph?Button=Submit+Search&Disp=table&Media=%2a&Index=Title&Keyword=yes&Str=emacs&SessionFile=OpacLog000028438&LimitHits=First&FirstRec=&LastRec=&RecTp=ALL&Num=25&CurrScr=SimpleSearch

という URL を作って goto-url しています。良くみると

(1) Media=* と Media=%2a の違いがある。

けど、無関係だった。

(2) どうも firefox と Emacs-w3m では引数の順番が(ほとんど)逆。

とりあえずw3m-form-make-form-data() で
(setq buf (nreverse buf))
として、

http://www.klas.com/cgi-bin/klascomm.cgi/ncbph?CurrScr=SimpleSearch&Num=25&RecTp=ALL&LastRec=&FirstRec=&LimitHits=First&SessionFile=OpacLog000028438&Str=emacs&Keyword=yes&Index=Title&Media=%2a&Disp=table&Button=Submit+Search   

な URL にすると動いた。

となりました。cgi の引数ってなにか指定された順番にくっつけないと
まずいのではと思い、submit ボタンの property を見ると、こんな感
じになっています。

w3m-action           (w3m-form-submit [w3m-form-object get "http://www.klas.com/cgi-bin/klascomm.cgi/ncbph" nil application/x-www-form-urlencoded (1 (:value ("CurrScr" . "SimpleSearch")) 2 (:value ("Num" . "25")) 3 (:value ("RecTp" . "ALL")) 4 (:value ("LastRec" . "")) 5 (:value ("FirstRec" . "")) 6 (:value ("LimitHits" . "First")) 7 (:value ("SessionFile" . "OpacLog000028438")) 9 (:value ("Str" . "emacs")) 10 (:value ("Keyword" "yes")) 8 (:value ("Index" "Title" ("Author" . "Author") ("Title" . "Title") ("Subject" . "Subject") ("Narrator" . "Narrator") ("Series" . "Series") ("Annotation" . "Annotation"))) 11 (:value ("Media" "*" ("*" . "All") ("Braille" . "Braille") ("Cassette" . "Cassette") ("Discs" . "Discs") ("Large Type" . "Large Type") ("Video (DVS)" . "Video (DVS)"))) 12 (:value ("Disp" "table" ("table" . "Table") ("long" . "Long") ("short" . "Short"))) 13 (:value ("Button")) 15 (:value ("Button")))] 13 "Button" "Submit Search")

firefox の作った URL を分解すると下記のようになって、上記の数字
順と一致します。

1. CurrScr=SimpleSearch
2. Num=25
3. RecTp=ALL
4. LastRec=
5. FirstRec=
6. LimitHits=First
7. SessionFile=OpacLog000028430
8. Index=Title
9. Str=emacs
10. Keyword=yes
11. Media=*
12. Disp=table
13. Button=Submit+Search

じゃってんで、

(defun w3m-form-make-form-data (form)
  (let ((plist (w3m-form-plist form))
	(coding (w3m-form-charlst form))
	buf bufs)
    (setq coding
	  (or (catch 'det
		(while coding
		  (if (w3m-charset-to-coding-system (car coding))
		      (throw 'det (w3m-charset-to-coding-system (car coding)))
		    (setq coding (cdr coding)))))
	      w3m-current-coding-system
	      (w3m-charset-to-coding-system
	       (w3m-content-charset w3m-current-url))
	      w3m-default-coding-system))
    (while plist
      (let* ((number (car plist))
	     (pair (plist-get (cadr plist) :value))
	     (name (car pair))
	     (value (cdr pair)))
	(unless number (setq number 9999)) ;; number って hseq?
	(cond
	 ((and (consp value)
	       (eq (car value) 'file))
	  (setq bufs (cons (cons number (cons name value)) bufs)))
	 ((and (consp value)
	       (consp (cdr value))
	       (consp (cadr value)))	; select.
	  (setq bufs (cons (cons number (cons name (car value))) bufs)))
	 ((consp value)			; checkbox
	  (setq bufs (append (mapcar (lambda (x) (cons number (cons name x))) value)
			     bufs)))
	 (value
	  (setq bufs (cons (cons number (cons name value)) bufs))))
	(setq plist (cddr plist))))
    (when bufs
      (setq bufs (sort bufs (lambda (x y) (< (car x) (car y)))))
      (if (eq (w3m-form-enctype form) 'multipart/form-data)
	  (let ((boundary (apply 'format "--_%d_%d_%d" (current-time)))
		file type)
	    ;; (setq buf (nreverse buf))
	    (cons
	     (concat "multipart/form-data; boundary=" boundary)
	     (with-temp-buffer
	       (while (setq buf (car bufs))
		 (if (and (consp (cdr (car buf)))
			  (eq (car (cdr (car buf))) 'file))
		     (progn
		       (setq file (expand-file-name (cdr (cdr (car buf)))))
		       (if (string= (setq type (w3m-local-content-type file))
				    "unknown")
			   (setq type "application/octet-stream"))
		       (insert "--" boundary "\r\n"
			       "Content-Disposition: form-data; name=\""
			       (car (car buf))
			       "\"; filename=\"" file "\"\r\n"
			       "Content-Type: " type "\r\n"
			       "Content-Transfer-Encoding: binary\r\n\r\n")
		       (when (file-exists-p file)
			 (insert-file-contents-literally file)
			 (goto-char (point-max)))
		       (insert "\r\n"))
		   (insert "--" boundary "\r\n"
			   "Content-Disposition: form-data; name=\""
			   (car (car buf))
			   "\"\r\n\r\n"
			   (cdr (car buf))
			   "\r\n"))
		 (setq bufs (cdr bufs)))
	       (insert "--" boundary "--\r\n")
	       (buffer-string))))
	(mapconcat (lambda (elem)
		     (setq elem (cdr elem))
		     (format "%s=%s"
			     (w3m-url-encode-string (car elem) coding)
			     (w3m-url-encode-string (if (stringp (cdr elem))
							(cdr elem)
						      "")
						    coding)))
		   bufs "&")))))

としたら動いたのですが、わからないところが多々あるので、その筋の
人の添削希望。

-- 
白井秀行 (mailto:shirai@meadowy.org)