/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source 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.
*
* Resin Open Source 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, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Nam Nguyen
*/
package com.caucho.quercus.env;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.caucho.quercus.QuercusContext;
import com.caucho.quercus.lib.string.StringModule;
import com.caucho.quercus.page.QuercusPage;
import com.caucho.vfs.WriteStream;
public class CgiEnv
extends Env
{
public CgiEnv(QuercusContext quercus,
QuercusPage page,
WriteStream out,
HttpServletRequest request,
HttpServletResponse response)
{
super(quercus, page, out, request, response);
}
public CgiEnv(QuercusContext quercus)
{
this(quercus, null, null, null, null);
}
@Override
protected String getQueryString()
{
Value serverEnv = getGlobalValue("_SERVER");
return serverEnv.get(createString("QUERY_STRING")).toString();
}
@Override
protected String getContentType()
{
Value serverEnv = getGlobalValue("_SERVER");
return serverEnv.get(createString("CONTENT_TYPE")).toString();
}
@Override
protected ArrayValue getCookies()
{
ArrayValue array = new ArrayValueImpl();
boolean isMagicQuotes = getIniBoolean("magic_quotes_gpc");
Value serverEnv = getGlobalValue("_SERVER");
String cookies = serverEnv.get(createString("HTTP_COOKIE")).toString();
int i = 0;
int j = 0;
int len = cookies.length();
while ((j = cookies.indexOf(';', i)) >= 0) {
if (j == i) {
i = j + 1;
continue;
}
addCookie(array, cookies, i, j, isMagicQuotes);
i = j + 1;
}
if (i < len) {
addCookie(array, cookies, i, len, isMagicQuotes);
}
return array;
}
private void addCookie(ArrayValue array,
String cookies,
int start,
int end,
boolean isMagicQuotes)
{
int eqIndex = cookies.indexOf('=', start);
String name = "";
String value = "";
StringValue valueV;
if (eqIndex < end) {
name = cookies.substring(start, eqIndex);
StringValue nameV = cleanCookieName(name);
if (array.get(nameV) != UnsetValue.UNSET)
return;
value = cookies.substring(eqIndex + 1, end);
value = decodeValue(value);
valueV = createString(value);
if (isMagicQuotes) // php/0876
valueV = StringModule.addslashes(valueV);
array.append(nameV, valueV);
}
else {
name = cookies.substring(start, end);
StringValue nameV = cleanCookieName(name);
if (nameV.length() > 0 && nameV.charAt(0) == '$')
array.append(nameV, getEmptyString());
}
}
private StringValue cleanCookieName(CharSequence name)
{
int len = name.length();
StringValue sb = createStringBuilder();
int i = 0;
while (i < len) {
char ch = name.charAt(i);
if (ch == ' ')
i++;
else if (ch == '+')
i++;
else if (i + 2 < len
&& ch == '%'
&& name.charAt(i + 1) == '2'
&& name.charAt(i + 2) == '0')
i += 3;
else
break;
}
int spaces = 0;
for (; i < len; i++) {
char ch = name.charAt(i);
switch (ch) {
case '%':
if (i + 2 < len
&& name.charAt(i + 1) == '2'
&& name.charAt(i + 2) == '0') {
spaces++;
i += 2;
}
else {
while (spaces > 0) {
sb.append('_');
spaces--;
}
sb.append(ch);
}
break;
case '.':
case '+':
case ' ':
spaces++;
break;
default:
while (spaces > 0) {
sb.append('_');
spaces--;
}
sb.append(ch);
}
}
return sb;
}
/*
private void fillCookie(ArrayValue cookies, CharSegment rawCookie)
{
char []buf = rawCookie.getBuffer();
int j = rawCookie.getOffset();
int end = j + rawCookie.length();
CharBuffer cbName = new CharBuffer();
CharBuffer cbValue = new CharBuffer();
while (j < end) {
char ch = 0;
cbName.clear();
cbValue.clear();
for (;
j < end && ((ch = buf[j]) == ' ' || ch == ';' || ch ==',');
j++) {
}
if (end <= j)
break;
boolean isSpecial = false;
if (buf[j] == '$') {
isSpecial = true;
j++;
}
for (; j < end; j++) {
ch = buf[j];
if (ch < 128 && TOKEN[ch])
cbName.append(ch);
else
break;
}
for (; j < end && (ch = buf[j]) == ' '; j++) {
}
if (end <= j)
break;
else if (ch == ';' || ch == ',') {
cookies.append(createString(cbName.toString()), getEmptyString());
continue;
}
else if (ch != '=') {
for (; j < end && (ch = buf[j]) != ';'; j++) {
}
continue;
}
j++;
for (; j < end && (ch = buf[j]) == ' '; j++) {
}
if (ch == '"') {
for (j++; j < end; j++) {
ch = buf[j];
if (ch == '"')
break;
cbValue.append(ch);
}
j++;
}
else {
for (; j < end; j++) {
ch = buf[j];
if (ch < 128 && VALUE[ch])
cbValue.append(ch);
else
break;
}
}
if (! isSpecial) {
if (cbName.length() == 0) {
//log.warning("bad cookie: " + rawCookie);
}
else {
cookies.append(createString(cbName.toString()),
createString(cbValue.toString()));
}
}
}
}
*/
@Override
protected void fillPost(ArrayValue postArray,
ArrayValue files,
HttpServletRequest request,
boolean isMagicQuotes)
{
InputStream is = System.in;
Value serverEnv = getGlobalValue("_SERVER");
String method = serverEnv.get(createString("REQUEST_METHOD")).toString();
String contentType
= serverEnv.get(createString("CONTENT_TYPE")).toString();
int contentLength = Integer.MAX_VALUE;
Value contentLengthV = serverEnv.get(createString("CONTENT_LENGTH"));
if (contentLengthV.isset())
contentLength = contentLengthV.toInt();
if (method.equals("POST")) {
Post.fillPost(this,
postArray,
files,
is,
contentType,
null,
contentLength,
isMagicQuotes,
getIniBoolean("file_uploads"));
} else if (! method.equals("GET")) {
StringValue bb = createBinaryBuilder();
//bb.appendReadAll(is, contentLength);
setInputData(bb);
}
}
}