File:  [parser3project] / parser3 / src / types / pa_vresponse.C
Revision 1.47: download - view: text, annotated - select for diffs - revision graph
Fri Oct 16 13:55:16 2026 UTC (11 days, 15 hours ago) by moko
Branches: MAIN
CVS tags: HEAD
websocket (RFC 6455) support added (implements feature #1310)
sha1 code moved to lib/md5.

/** @file
	Parser: @b response class.

	Copyright (c) 2001-2026 Art. Lebedev Studio (https://www.artlebedev.com)
	Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru>
*/

#include "pa_vresponse.h"
#include "pa_request_charsets.h"
#include "pa_charsets.h"
#include "pa_charset.h"
#include "pa_vstring.h"
#include "pa_vdate.h"
#include "pa_vhash.h"
#include "pa_vvoid.h"

volatile const char * IDENT_PA_VRESPONSE_C="$Id: pa_vresponse.C,v 1.47 2026/10/16 13:55:16 moko Exp $" IDENT_PA_VRESPONSE_H;

// defines

#define REQUEST_HEADERS_ELEMENT_NAME "headers"
#define UNTAINT_ELEMENT_NAME "untaint"
#define STARTED_ELEMENT_NAME "started"

Value* VResponse::get_element(const String& aname) {
	// $charset
	if(aname==CHARSET_NAME)
		return new VString(fcharsets.client().NAME());

	// $headers
	if(aname==REQUEST_HEADERS_ELEMENT_NAME)
		return new VHash(ffields);

	// $untaint
	if(aname==UNTAINT_ELEMENT_NAME)
		return new VString(*new String(String::lang2name(lang)));

	// $started
	if(aname==STARTED_ELEMENT_NAME) {
		if(started==STREAM)
			return new VString(*new String("stream"));
		if(started==WEBSOCKET)
			return new VString(*new String("websocket"));
		return VVoid::get();
	}

	MAYBE_GET_SPECIAL_OR_METHOD(VStateless_class::get_element(aname));

	// $field
	return ffields.get(aname.change_case(fcharsets.source(), String::CC_UPPER));
}

const VJunction* VResponse::put_element(const String& aname, Value* avalue) { 
	// guard charset change
	if(aname==CHARSET_NAME)
		fcharsets.set_client(pa_charsets.get(avalue->as_string()));
	else if(aname==UNTAINT_ELEMENT_NAME)
		lang=String::name2lang(avalue->as_string());
	else if(aname==STARTED_ELEMENT_NAME)
		return Value::put_element(aname, avalue);
	else
		ffields.put(aname.change_case(fcharsets.source(), String::CC_UPPER), !avalue || (avalue->is_string() && !avalue->is_defined()) ? 0: avalue);

	return 0;
}

E-mail: