123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
|
/*******************************************************************************
copyright: Copyright (c) 2004 Kris Bell. All rights reserved
license: BSD style: $(LICENSE)
version: Initial release: April 2004
author: Kris
*******************************************************************************/
module tango.net.http.HttpParams;
private import tango.time.Time;
private import tango.io.model.IConduit;
private import tango.net.http.HttpTokens;
private import tango.io.stream.Delimiters;
public import tango.net.http.model.HttpParamsView;
/******************************************************************************
Maintains a set of query parameters, parsed from an HTTP request.
Use HttpParams instead for output parameters.
Note that these input params may have been encoded by the user-
agent. Unfortunately there has been little consensus on what that
encoding should be (especially regarding GET query-params). With
luck, that will change to a consistent usage of UTF-8 within the
near future.
******************************************************************************/
class HttpParams : HttpTokens, HttpParamsView
{
// tell compiler to expose super.parse() also
alias HttpTokens.parse parse;
alias HttpTokens.addInt addInt;
private Delimiters!(char) amp;
/**********************************************************************
Construct parameters by telling the HttpStack that
name/value pairs are seperated by a '=' character.
**********************************************************************/
this ()
{
super ('=');
// construct a line tokenizer for later usage
amp = new Delimiters!(char) ("&");
}
/**********************************************************************
Return the number of headers
**********************************************************************/
uint size ()
{
return super.stack.size;
}
/**********************************************************************
Read all query parameters. Everything is mapped rather
than being allocated & copied
**********************************************************************/
override void parse (InputBuffer input)
{
setParsed (true);
amp.set (input);
while (amp.next || amp.get().length)
stack.push (amp.get());
}
/**********************************************************************
Add a name/value pair to the query list
**********************************************************************/
override void add (const(char)[] name, const(char)[] value)
{
super.add (name, value);
}
/**********************************************************************
Add a name/integer pair to the query list
**********************************************************************/
void addInt (const(char)[] name, int value)
{
super.addInt (name, value);
}
/**********************************************************************
Add a name/date(long) pair to the query list
**********************************************************************/
override void addDate (const(char)[] name, Time value)
{
super.addDate (name, value);
}
/**********************************************************************
Return the value of the provided header, or null if the
header does not exist
**********************************************************************/
override const(char)[] get (const(char)[] name, const(char)[] ret = null)
{
return super.get (name, ret);
}
/**********************************************************************
Return the integer value of the provided header, or the
provided default-value if the header does not exist
**********************************************************************/
override int getInt (const(char)[] name, int ret = -1)
{
return super.getInt (name, ret);
}
/**********************************************************************
Return the date value of the provided header, or the
provided default-value if the header does not exist
**********************************************************************/
override Time getDate (const(char)[] name, Time ret = Time.epoch)
{
return super.getDate (name, ret);
}
/**********************************************************************
Output the param list to the provided consumer
**********************************************************************/
override void produce (scope size_t delegate(const(void)[]) consume, const(char)[] eol=null)
{
return super.produce (consume, eol);
}
}
|