80 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								/*  $Id$
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Part of SWI-Prolog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Author:        Jan Wielemaker
							 | 
						||
| 
								 | 
							
								    E-mail:        jan@swi.psy.uva.nl
							 | 
						||
| 
								 | 
							
								    WWW:           http://www.swi-prolog.org
							 | 
						||
| 
								 | 
							
								    Copyright (C): 1985-2002, University of Amsterdam
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This program is free software; you can redistribute it and/or
							 | 
						||
| 
								 | 
							
								    modify it under the terms of the GNU General Public License
							 | 
						||
| 
								 | 
							
								    as published by the Free Software Foundation; either version 2
							 | 
						||
| 
								 | 
							
								    of the License, or (at your option) any later version.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This program is distributed in the hope that it will be useful,
							 | 
						||
| 
								 | 
							
								    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								    GNU General Public License for more details.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    You should have received a copy of the GNU Lesser General Public
							 | 
						||
| 
								 | 
							
								    License along with this library; if not, write to the Free Software
							 | 
						||
| 
								 | 
							
								    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    As a special exception, if you link this library with other files,
							 | 
						||
| 
								 | 
							
								    compiled with a Free Software compiler, to produce an executable, this
							 | 
						||
| 
								 | 
							
								    library does not by itself cause the resulting executable to be covered
							 | 
						||
| 
								 | 
							
								    by the GNU General Public License. This exception does not however
							 | 
						||
| 
								 | 
							
								    invalidate any other reasons why the executable file might be covered by
							 | 
						||
| 
								 | 
							
								    the GNU General Public License.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- module(http_mime_plugin, []).
							 | 
						||
| 
								 | 
							
								:- use_module(http_client).
							 | 
						||
| 
								 | 
							
								:- use_module(library(memfile)).
							 | 
						||
| 
								 | 
							
								:- use_module(library(mime)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** <module> MIME client plugin
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This plugin for library(http_client)   automatically translates messages
							 | 
						||
| 
								 | 
							
								with content-type =|multipart/form-data|= into a list   of  Name = Value
							 | 
						||
| 
								 | 
							
								pairs, greatly simplifying the processing of   forms  with this type. It
							 | 
						||
| 
								 | 
							
								relies  on  library(mime),  which  in   turn    relies   on   a  foreign
							 | 
						||
| 
								 | 
							
								implementation of the rfc2045 (mime) specifications.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- multifile
							 | 
						||
| 
								 | 
							
									http_client:http_convert_data/4,
							 | 
						||
| 
								 | 
							
									http_parameters:form_data_content_type/1.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								http_client:http_convert_data(In, Fields, Data, Options) :-
							 | 
						||
| 
								 | 
							
									memberchk(content_type(Type), Fields),
							 | 
						||
| 
								 | 
							
									(   memberchk(mime_version(MimeVersion), Fields)
							 | 
						||
| 
								 | 
							
									;   sub_atom(Type, 0, _, _, 'multipart/form-data'),
							 | 
						||
| 
								 | 
							
									    MimeVersion = '1.0'
							 | 
						||
| 
								 | 
							
									), !,
							 | 
						||
| 
								 | 
							
									new_memory_file(MemFile),
							 | 
						||
| 
								 | 
							
									open_memory_file(MemFile, write, Tmp),
							 | 
						||
| 
								 | 
							
									format(Tmp, 'Mime-Version: ~w\n', [MimeVersion]),
							 | 
						||
| 
								 | 
							
									format(Tmp, 'Content-Type: ~w\n\n', [Type]),
							 | 
						||
| 
								 | 
							
									http_read_data(Fields, _, [in(In), to(stream(Tmp))|Options]),
							 | 
						||
| 
								 | 
							
									close(Tmp),
							 | 
						||
| 
								 | 
							
									open_memory_file(MemFile, read, MimeIn),
							 | 
						||
| 
								 | 
							
									mime_parse(stream(MimeIn), Data0),
							 | 
						||
| 
								 | 
							
									close(MimeIn),
							 | 
						||
| 
								 | 
							
									free_memory_file(MemFile),
							 | 
						||
| 
								 | 
							
									mime_to_form(Data0, Data).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mime_to_form(mime(A,'',Parts), Form) :-
							 | 
						||
| 
								 | 
							
									memberchk(type('multipart/form-data'), A),
							 | 
						||
| 
								 | 
							
									mime_form_fields(Parts, Form), !.
							 | 
						||
| 
								 | 
							
								mime_to_form(Mime, Mime).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mime_form_fields([], []).
							 | 
						||
| 
								 | 
							
								mime_form_fields([mime(A, V, [])|T0], [Name=V|T]) :-
							 | 
						||
| 
								 | 
							
									memberchk(name(Name), A),
							 | 
						||
| 
								 | 
							
									mime_form_fields(T0, T).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								http_parameters:form_data_content_type(ContentType) :-
							 | 
						||
| 
								 | 
							
									sub_atom(ContentType, 0, _, _, 'multipart/form-data').
							 |