HTTPRequestHeader.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:7k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* $Id: HTTPRequestHeader.java,v 1.3 2000/04/18 13:13:24 wastl Exp $ */
  2. package net.wastl.webmail.server.http;
  3. import java.io.*;
  4. import java.util.*;
  5. import javax.activation.DataSource;
  6. import javax.mail.*;
  7. import javax.mail.internet.*;
  8. import gnu.regexp.*;
  9. import net.wastl.webmail.server.*;
  10. import net.wastl.webmail.misc.*;
  11. import net.wastl.webmail.server.TimeoutException;
  12. import net.wastl.webmail.debug.ErrorHandler;
  13. /**
  14.  * HTTPHeader.java
  15.  *
  16.  *
  17.  * Created: Tue Feb  2 15:25:48 1999
  18.  *
  19.  * @author Sebastian Schaffert
  20.  * @version
  21.  */
  22. public class HTTPRequestHeader  {
  23.     private Hashtable content;
  24.     private Hashtable headers;
  25.     public HTTPRequestHeader() {
  26. headers=new Hashtable(10,.9f);
  27. content=new Hashtable(5,.9f);
  28.     }
  29.     public String getMethod() {
  30. return getHeader("Method");
  31.     }
  32.     public String getPath() {
  33. return getHeader("Path");
  34.     }
  35.     public String getVersion() {
  36. return getHeader("Version");
  37.     }
  38.     public void setPath(String s) {
  39. setHeader("PATH",Urlify.unUrlify(s));
  40.     }
  41.     public void setMethod(String s) {
  42. setHeader("METHOD",s);
  43.     }
  44.     public void setVersion(String s) {
  45. setHeader("VERSION",s);
  46.     }
  47.     public void setEncodedContent(String url_encoded, String contenttype) {
  48. if(contenttype.toLowerCase().startsWith("application/x-www-form-urlencoded")) {
  49.     StringTokenizer t=new StringTokenizer(url_encoded,"&");
  50.     while(t.hasMoreTokens()) {
  51. try {
  52.     String str=t.nextToken();
  53.     StringTokenizer tok=new StringTokenizer(str,"=rn");
  54.     String key="";
  55.     String value="";
  56.     try {
  57. key=Urlify.unUrlify(tok.nextToken());
  58. value=Urlify.unUrlify(tok.nextToken());
  59.     } catch(Exception e) {
  60.     } finally {
  61. content.put(key.toUpperCase(),value);
  62.     }
  63. } catch(NoSuchElementException e) {
  64.     e.printStackTrace();
  65.     System.err.println("While reading post");
  66. }
  67.     }
  68. } else if(contenttype.toLowerCase().startsWith("multipart/form-data")) {
  69.     String s="Content-type: "+headers.get("CONTENT-TYPE")+"nContent-length: "+headers.get("CONTENT-LENGTH")+"n"
  70. + url_encoded;
  71.     try {
  72. HTTPDataSource ds=new HTTPDataSource(s,((String)headers.get("CONTENT-TYPE")));
  73. MimeMultipart m=new MimeMultipart(ds);
  74. //System.err.println("Parts: "+m.getCount());
  75. for(int i=0;i<m.getCount();i++) {
  76.     MimeBodyPart p=(MimeBodyPart)m.getBodyPart(i);
  77.     
  78.     Enumeration enum=p.getAllHeaders();
  79.     while(enum.hasMoreElements()) {
  80. Header h=(Header)enum.nextElement();
  81. //System.err.println(h.getName()+" "+h.getValue());
  82.     }
  83.     p.setHeader("Content-Transfer-Encoding","binary");
  84.     p.setHeader("Content-Type","application/octet-stream");
  85.     //System.err.println(p.getFileName());
  86.     
  87.     String disp=p.getHeader("CONTENT-DISPOSITION",";");
  88.     RE name_re=new RE("name\="([^"]+)"",RE.REG_MULTILINE);
  89.     REMatch name_m=name_re.getMatch(disp);
  90.     String name=name_m.substituteInto("$1");
  91.     
  92.     ByteStore bs=parseMIME(p);
  93.     bs.setName(p.getFileName());
  94.     bs.setContentType(WebMailServer.getStorage().getMimeType(p.getFileName()));
  95.     content.put(name.toUpperCase(),bs);
  96.     
  97. }
  98.     } catch(Exception e) {
  99. e.printStackTrace();
  100.     }
  101.     
  102. } else {
  103.     System.err.println("Unsupported contenttype! "+contenttype);
  104. }
  105.     }
  106.     public void setHeader(String key, String value) {
  107. if(headers == null) {
  108.     headers=new Hashtable();
  109. }
  110. //System.out.println("DEBUG: Setting "+key.trim().toUpperCase()+" to "+value);
  111. headers.put(key.toUpperCase(), value);
  112.     }
  113.     public String getHeader(String t) {
  114. return (String)headers.get(t.toUpperCase());
  115.     }
  116.     public Hashtable getContent() {
  117. return content;
  118.     }
  119.     public Object getObjContent(String key) {
  120. if(content!=null) {
  121.     return content.get(key.toUpperCase());
  122. } else {
  123.     return null;
  124. }
  125.     }
  126.     public String getContent(String key) {
  127. if(content!=null) {
  128.     Object o=content.get(key.toUpperCase());
  129.     if(o == null) {
  130. return null;
  131.     } else if(o instanceof String) {
  132. return (String)o;
  133.     } else if(o instanceof ByteStore) {
  134. return new String(((ByteStore)o).getBytes());
  135.     } else {
  136. return "";
  137.     }
  138.     //return (String)content.get(key.toUpperCase());
  139. } else {
  140.     return "";
  141. }
  142.     }
  143.     public boolean isContentSet(String key) {
  144. Object s=content.get(key.toUpperCase());
  145. return s != null && !(s instanceof String && ((String)s).equals(""));
  146.     }
  147.     public void setContent(String key, String value) {
  148. content.put(key.toUpperCase(),value);
  149.     }
  150.     public Enumeration getHeaderKeys() {
  151. return headers.keys();
  152.     }
  153.     public Enumeration getContentKeys() {
  154. return content.keys();
  155.     }
  156.     public String toString() {
  157. String s="Method: "+headers.get("METHOD")+", Path="+headers.get("PATH")+", HTTP-version: "+headers.get("VERSION")+"n";
  158. s+="HTTP Headers:n";
  159. Enumeration e=headers.keys();
  160. while(e.hasMoreElements()) {
  161.     String h=(String)e.nextElement();
  162.     s+="Header name: "+h+", value: "+headers.get(h)+"n";
  163. }
  164. if(content != null) {
  165.     s+="Form Content:n";
  166.     e=content.keys();
  167.     while(e.hasMoreElements()) {
  168. String h=(String)e.nextElement();
  169. s+="Header name: "+h+", value: "+content.get(h)+"n";
  170.     }
  171. }
  172. return s;
  173.     }
  174.     
  175.     
  176.     protected static ByteStore parseMIME(MimeBodyPart p) {
  177. try {
  178.     InputStream in=null;
  179.     String type="";
  180.     int size=Integer.parseInt(WebMailServer.getStorage().getConfig("max attach size"));
  181.     if(p instanceof MimeBodyPart) {
  182. MimeBodyPart mpb=(MimeBodyPart)p;
  183. InputStream is=mpb.getInputStream();
  184. /* Workaround for Java or Javamail Bug */
  185. in=new BufferedInputStream(is);
  186. ByteStore ba=ByteStore.getBinaryFromIS(in,size);
  187. in=new ByteArrayInputStream(ba.getBytes());
  188. /* End of workaround */
  189. size=in.available();
  190.     } else {
  191. //System.err.println("*** No MIME Body part!! ***");
  192. in=p.getInputStream();
  193.     }
  194.     
  195.     ByteStore data=ByteStore.getBinaryFromIS(in,size);
  196.     //data.setContentType(p.getContentType());
  197.     data.setContentEncoding(p.getHeader("Content-Transfer-Encoding")[0]);
  198.     return data;
  199. } catch(Exception e) {
  200.     return null;
  201. }
  202.     }
  203.     
  204.     protected class HTTPDataSource implements DataSource {
  205. InputStream is;
  206. String contenttype;
  207. HTTPDataSource(String in, String cont) {
  208.     contenttype=cont;
  209.     is=new ByteArrayInputStream(in.getBytes());
  210. }
  211. public InputStream getInputStream() throws IOException {
  212.     if(is==null) {
  213. throw new IOException("No InputStream");
  214.     }
  215.     return is;
  216. }
  217. public OutputStream getOutputStream() throws IOException {
  218.     throw new IOException();
  219. }
  220. public String getContentType() {
  221.     return contenttype;
  222. }
  223. public String getName() {
  224.     return "NoName";
  225. }
  226.     }
  227. } // HTTPHeader