Now custom httpHeader can be created

and filled with cookies and so on.

This header one can set into serverObjects

Check CookieTest.html and CookieTest.java for details.

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@1334 6c8d7289-2bf4-0310-a012-ef5d649a1542
pull/1/head
(no author) 19 years ago
parent d69a182736
commit 001513cc1f

@ -10,6 +10,12 @@
</script>
Here is a cookie test page.
<hr />
<br />
<form action="">
<input type="hidden" name="act" value="clear_cookie" />
<input type="submit" name="set_action" value="Just clean it" />
</form>
<hr />
<br />
@ -26,24 +32,28 @@ Cookies at this browser:<br />
<script type="text/javascript">
document.write(document.cookie.split(';').join(';<br />'))
</script>
#(cookiesout)#
::
<br />
<hr />
Cookies coming to server:<br />
#(/cookiesout)#
#{cookiesout}#
#[string]#
#{/cookiesout}#
#(cookiesin)#
Cookies coming to server:
::
<br />
<hr />
Cookies server sent:<br />
#(/cookiesin)#
#{cookiesin}#
#[name]# = #[value]#
#{/cookiesin}#
<br />
<hr />
#(cookiesout)#
Cookies server sent:
::
#(/cookiesout)#
#{cookiesout}#
#[name]# = #[value]#
#{/cookiesout}#
<br>
<hr>

@ -82,21 +82,26 @@ public class CookieTest {
final serverObjects prop = new serverObjects();
if(post.containsKey("act")&&post.get("act").equals("clear_cookie"))
{
httpHeader outgoingHeader=new httpHeader();
Iterator it = header.entrySet().iterator();
while(it.hasNext())
{
java.util.Map.Entry e = (Entry) it.next();
if(e.getKey().equals("Cookie"));
prop.setCoockie(
(String)e.getKey(),
(String)e.getValue(),
"expires=Thu, 01-Jan-99 00:00:01 GMT"
);
if(e.getKey().equals("Cookie"))
{
String coockie[]=e.getValue().toString().split(";");
for(int i=0;i<coockie.length;i++)
{
String nameValue[]=coockie[i].split("=");
outgoingHeader.setCoockie(nameValue[0].trim(),nameValue.length>1?(nameValue[1].trim()):"","Thu, 01-Jan-99 00:00:01 GMT");
}
}
}
prop.setOutgoingHeader(outgoingHeader);
prop.put("coockiesout",0);
//header.
@ -105,18 +110,29 @@ public class CookieTest {
{
String CoockieName = post.get("cookie_name").toString().trim();
String CoockieValue = post.get("cookie_value").toString().trim();
prop.setCoockie(CoockieName,CoockieValue);
prop.put("cookiesout",1);
prop.put("cookiesout_0_name",CoockieName);
prop.put("cookiesout_0_value",CoockieValue);
httpHeader outgoingHeader=new httpHeader();
outgoingHeader.setCoockie(CoockieName,CoockieValue);
prop.setOutgoingHeader(outgoingHeader);
prop.put("cookiesin",1);
prop.put("cookiesin_0_name",CoockieName);
prop.put("cookiesin_0_value",CoockieValue);
//header.
}
Iterator it = header.entrySet().iterator();
while(it.hasNext())
{
java.util.Map.Entry e = (Entry) it.next();
System.out.println(""+e.getKey()+" : "+e.getValue());
if(e.getKey().equals("Cookie"))
{
String a;
prop.put("cookiesout",1);
prop.put("cookiesout_0_string",e.getValue().toString().replaceAll(";",";<br />"));
}
}
return prop;

@ -70,10 +70,12 @@ import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
import java.util.Vector;
import de.anomic.server.serverCore;
import de.anomic.server.logging.serverLog;
public final class httpHeader extends TreeMap implements Map {
@ -718,4 +720,141 @@ public final class httpHeader extends TreeMap implements Map {
String dstHostSocket = (String) header.get(httpHeader.HOST);
prop.setProperty(CONNECTION_PROP_HOST,(httpd.isThisHostName(dstHostSocket)?virtualHost:dstHostSocket));
}
/*
* Patch BEGIN:
* Name: Header Property Patch
* Date: Fri. 13.01.2006
* Description: Makes possible to send header properties such as coockies back to the client.
* Part 1 of 5
* Questions: sergej.z@list.ru
*/
/**
* Holds header properties
*/
//Since properties such as coockies can be multiple, we cannot use HashMap here. We have to use Vector.
private Vector coockies=new Vector();
/**
*
* Implementation of Map.Entry. Structure that hold two values - exactly what we need!
*/
class Entry implements Map.Entry
{
private Object Key;
private Object Value;
Entry(Object Key,String Value){this.Key=Key;this.Value=Value;}
public Object getKey() {return Key;}
public Object getValue() {return Value;}
public Object setValue(Object Value) {return(this.Value=Value);}
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
* @param expires: when should this coockie be autmatically deleted. If <b>null</b> - coockie will stay forever
* @param path: Path the coockie belongs to. Default - "/". Can be <b>null</b>.
* @param domain: Domain this cookie belongs to. Default - domain name. Can be <b>null</b>.
* @param secure: If true coockie will be send only over safe connection such as https
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value, String expires, String path, String domain, boolean secure)
{
/*
* TODO:Here every value can be validated for correctness if needed
* For example semicolon should be not in any of the values
* However an exception in this case would be an overhead IMHO.
*/
String coockieString=name+"="+value+";";
if(expires!=null)
coockieString+=" expires="+expires+";";
if(path!=null)
coockieString+=" path="+path+";";
if(domain!=null)
coockieString+=" domain="+domain+";";
if(secure)
coockieString+=" secure;";
coockies.add(new Entry("Set-Cookie",coockieString));
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
* @param expires: when should this coockie be autmatically deleted. If <b>null</b> - coockie will stay forever
* @param path: Path the coockie belongs to. Default - "/". Can be <b>null</b>.
* @param domain: Domain this cookie belongs to. Default - domain name. Can be <b>null</b>.
*
* Note: this coockie will be sent over each connection independend if it is safe connection or not.
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value, String expires, String path, String domain)
{
setCoockie( name, value, expires, path, domain, false);
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
* @param expires: when should this coockie be autmatically deleted. If <b>null</b> - coockie will stay forever
* @param path: Path the coockie belongs to. Default - "/". Can be <b>null</b>.
*
* Note: this coockie will be sent over each connection independend if it is safe connection or not.
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value, String expires, String path)
{
setCoockie( name, value, expires, path, null, false);
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
* @param expires: when should this coockie be autmatically deleted. If <b>null</b> - coockie will stay forever
*
* Note: this coockie will be sent over each connection independend if it is safe connection or not.
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value, String expires)
{
setCoockie( name, value, expires, null, null, false);
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
*
* Note: this coockie will be sent over each connection independend if it is safe connection or not. This coockie never expires
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value )
{
setCoockie( name, value, null, null, null, false);
}
/**
* Returns an iterator within all properties can be reached.
* Is used mainly by httpd.
* @return iterator to read all request properties.
*
* Example:
*
* Iterator it=serverObjects.getRequestProperties();
* while(it.hasNext())
* {
* java.util.Map.Entry e=(java.util.Map.Entry)it.next();
* String propertyName=e.getKey();
* String propertyValue=e.getValue();
* }
*/
public Iterator getCookies()
{
return coockies.iterator();
}
/*
* Patch END:
* Name: Header Property Patch
*/
}

@ -1174,11 +1174,11 @@ public final class httpd implements serverHandler {
long contentLength,
Date moddate,
Date expires,
serverObjects requestProperties,
httpHeader headers,
String contentEnc,
String transferEnc
) throws IOException {
sendRespondHeader(conProp,respond,httpVersion,httpStatusCode,httpStatusText,contentType,contentLength,moddate,expires,requestProperties,contentEnc,transferEnc,true);
sendRespondHeader(conProp,respond,httpVersion,httpStatusCode,httpStatusText,contentType,contentLength,moddate,expires,headers,contentEnc,transferEnc,true);
}
public static final void sendRespondHeader(
@ -1191,13 +1191,13 @@ public final class httpd implements serverHandler {
long contentLength,
Date moddate,
Date expires,
serverObjects requestProperties,
httpHeader headers,
String contentEnc,
String transferEnc,
boolean nocache
) throws IOException {
httpHeader headers = new httpHeader();
if(headers==null)headers = new httpHeader();
Date now = new Date(System.currentTimeMillis());
headers.put(httpHeader.SERVER, "AnomicHTTPD (www.anomic.de)");
@ -1216,7 +1216,7 @@ public final class httpd implements serverHandler {
if (contentEnc != null) headers.put(httpHeader.CONTENT_ENCODING, contentEnc);
if (transferEnc != null) headers.put(httpHeader.TRANSFER_ENCODING, transferEnc);
sendRespondHeader(conProp, respond, httpVersion, httpStatusCode, httpStatusText, headers,requestProperties);
sendRespondHeader(conProp, respond, httpVersion, httpStatusCode, httpStatusText, headers);
}
public static final void sendRespondHeader(
@ -1228,25 +1228,14 @@ public final class httpd implements serverHandler {
) throws IOException {
sendRespondHeader(conProp,respond,httpVersion,httpStatusCode,null,header);
}
/*This we need because the interface has changed*/
public static final void sendRespondHeader(
Properties conProp,
OutputStream respond,
String httpVersion,
int httpStatusCode,
String httpStatusText,
httpHeader header
) throws IOException {
sendRespondHeader(conProp,respond,httpVersion,httpStatusCode,null,header,null);
}
public static final void sendRespondHeader(
Properties conProp,
OutputStream respond,
String httpVersion,
int httpStatusCode,
String httpStatusText,
httpHeader header,
serverObjects requestProperties
httpHeader header
) throws IOException {
if (respond == null) throw new NullPointerException("The outputstream must not be null.");
@ -1294,9 +1283,13 @@ public final class httpd implements serverHandler {
.append(Integer.toString(httpStatusCode)).append(" ")
.append(httpStatusText).append("\r\n");
//read custom headers
/*
if (requestProperties != null)
{
Iterator it=requestProperties.getRequestProperties();
httpHeader outgoingHeader=requestProperties.getOutgoingHeader();
if (outgoingHeader!=null)
{*/
Iterator it=header.getCookies();
while(it.hasNext())
{
//Append user properties to the main String
@ -1304,7 +1297,10 @@ public final class httpd implements serverHandler {
java.util.Map.Entry e=(java.util.Map.Entry)it.next();
headerStringBuffer.append(e.getKey()).append(": ").append(e.getValue()).append("\r\n");
}
}
/*
}
}*/
// write header
Iterator i = header.keySet().iterator();

@ -671,7 +671,7 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http
}
// write the array to the client
httpd.sendRespondHeader(this.connectionProperties, out, httpVersion, 200, null, mimeType, result.length, targetDate, null, tp, (zipContent)?"gzip":null, null, nocache);
httpd.sendRespondHeader(this.connectionProperties, out, httpVersion, 200, null, mimeType, result.length, targetDate, null, tp.getOutgoingHeader(), (zipContent)?"gzip":null, null, nocache);
if (! method.equals(httpHeader.METHOD_HEAD)) {
Thread.sleep(200); // this solved the message problem (!!)
serverFileUtils.write(result, out);

@ -69,10 +69,22 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
import de.anomic.http.httpHeader;
public final class serverObjects extends Hashtable implements Cloneable {
private static final long serialVersionUID = 1L;
private httpHeader outgoingHeader;
public void setOutgoingHeader(httpHeader outgoingHeader)
{
this.outgoingHeader=outgoingHeader;
}
public httpHeader getOutgoingHeader()
{
return outgoingHeader;
}
public serverObjects() {
super();
}
@ -211,158 +223,4 @@ public final class serverObjects extends Hashtable implements Cloneable {
return super.clone();
}
/*
* Patch BEGIN:
* Name: Header Property Patch
* Date: Fri. 13.01.2006
* Description: Makes possible to send header properties such as coockies back to the client.
* Part 1 of 5
* Questions: sergej.z@list.ru
*/
/**
* Holds header properties
*/
//Since properties such as coockies can be multiple, we cannot use HashMap here. We have to use Vector.
private Vector requestProperty=new Vector();
/**
*
* Implementation of Map.Entry. Structure that hold two values - exactly what we need!
*/
class Entry implements Map.Entry
{
private Object Key;
private Object Value;
Entry(Object Key,String Value){this.Key=Key;this.Value=Value;}
public Object getKey() {return Key;}
public Object getValue() {return Value;}
public Object setValue(Object Value) {return(this.Value=Value);}
}
/**
* Set a header property <b>name</b> with <b>value</b>
* @param name : name of the property. Ex. Location
* @param value : value of the property
*
* We can achieve redirection using property Location
* setRequestProperty("Location", "http://www.yacy.net");
* Coockies can be convinently defined with setCookie method
*/
public void setRequestProperty(String name, String value)
{
/*
* TODO: Maybe we should check here if the property name is in RFC2616
* And check for the validity of the value as well...
* */
requestProperty.add(new Entry(name,value));
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
* @param expires: when should this coockie be autmatically deleted. If <b>null</b> - coockie will stay forever
* @param path: Path the coockie belongs to. Default - "/". Can be <b>null</b>.
* @param domain: Domain this cookie belongs to. Default - domain name. Can be <b>null</b>.
* @param secure: If true coockie will be send only over safe connection such as https
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value, String expires, String path, String domain, boolean secure)
{
/*
* TODO:Here every value can be validated for correctness if needed
* For example semicolon should be not in any of the values
* However an exception in this case would be an overhead IMHO.
*/
String coockieString=name+"="+value+";";
if(expires!=null)
coockieString+=" expires="+expires+";";
if(path!=null)
coockieString+=" path="+path+";";
if(domain!=null)
coockieString+=" domain="+domain+";";
if(secure)
coockieString+=" secure;";
requestProperty.add(new Entry("Set-Cookie",coockieString));
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
* @param expires: when should this coockie be autmatically deleted. If <b>null</b> - coockie will stay forever
* @param path: Path the coockie belongs to. Default - "/". Can be <b>null</b>.
* @param domain: Domain this cookie belongs to. Default - domain name. Can be <b>null</b>.
*
* Note: this coockie will be sent over each connection independend if it is safe connection or not.
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value, String expires, String path, String domain)
{
setCoockie( name, value, expires, path, domain, false);
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
* @param expires: when should this coockie be autmatically deleted. If <b>null</b> - coockie will stay forever
* @param path: Path the coockie belongs to. Default - "/". Can be <b>null</b>.
*
* Note: this coockie will be sent over each connection independend if it is safe connection or not.
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value, String expires, String path)
{
setCoockie( name, value, expires, path, null, false);
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
* @param expires: when should this coockie be autmatically deleted. If <b>null</b> - coockie will stay forever
*
* Note: this coockie will be sent over each connection independend if it is safe connection or not.
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value, String expires)
{
setCoockie( name, value, expires, null, null, false);
}
/**
* Sets Cookie on the client machine.
*
* @param name: Coockie name
* @param value: Coockie value
*
* Note: this coockie will be sent over each connection independend if it is safe connection or not. This coockie never expires
* Further documentation at <a href="http://docs.sun.com/source/816-6408-10/cookies.htm">docs.sun.com</a>
*/
public void setCoockie(String name, String value )
{
setCoockie( name, value, null, null, null, false);
}
/**
* Returns an iterator within all properties can be reached.
* Is used mainly by httpd.
* @return iterator to read all request properties.
*
* Example:
*
* Iterator it=serverObjects.getRequestProperties();
* while(it.hasNext())
* {
* java.util.Map.Entry e=(java.util.Map.Entry)it.next();
* String propertyName=e.getKey();
* String propertyValue=e.getValue();
* }
*/
public Iterator getRequestProperties()
{
return requestProperty.iterator();
}
/*
* Patch END:
* Name: Header Property Patch
*/
}
Loading…
Cancel
Save