void FalhttpdClient::replyError( int errorID, const String& explain ) { String sErrorDesc = codeDesc( errorID ); String sReply; String sError; sReply.A("HTTP/1.1 ").N( errorID ).A( " " + sErrorDesc + "\r\n"); sError.N(errorID ).A( ": " + sErrorDesc ); // for now, we create the docuemnt here. // TODO Read the error document from a file. String sErrorDoc = "<html>\n" "<head>\r\n" "<title>Error " +sError + "</title>\n" "</head>\n" "<body>\n" "<h1>" + sError + "</h1>\n"; if( explain.size() != 0 ) { sErrorDoc += "<p>This abnormal condition has been encountered while receiving and processing Your request:</p>\n"; sErrorDoc += "<p><b>" + explain + "</b></p>\n"; } else { sErrorDoc += "<p>An error of type <b>" + sError + "</b> has been detected while parsing your request.</p>\n"; } sErrorDoc += getServerSignature(); sErrorDoc += "</body>\n</html>\n"; AutoCString content( sErrorDoc ); TimeStamp now; now.currentTime(); sReply += "Date: " + now.toRFC2822() + "\r\n"; sReply.A( "Content-Length: ").N( (int64) content.length() ).A("\r\n"); sReply += "Content-Type: text/html; charset=utf-8\r\n\r\n"; m_log->log( LOGLEVEL_INFO, "Sending ERROR reply to client " + m_sRemote + ": " + sError ); sendData( sReply ); sendData( content.c_str(), content.length() ); }
static void describe_internal( VMachine *vm, String &tgt, const Item *elem, int32 level, int32 maxLevel, int32 maxSize ) { uint32 count; // return if we reached the maximum level. if ( maxLevel >= 0 && level > maxLevel ) { tgt += "..."; return; } switch( elem->type() ) { case FLC_ITEM_NIL: tgt += "Nil"; break; case FLC_ITEM_UNB: tgt += "_"; break; case FLC_ITEM_BOOL: tgt += elem->asBoolean() ? "true" : "false"; break; case FLC_ITEM_INT: tgt.writeNumber( elem->asInteger() ); break; case FLC_ITEM_NUM: tgt.writeNumber( elem->asNumeric(), "%g" ); break; case FLC_ITEM_RANGE: elem->toString(tgt); break; case FLC_ITEM_STRING: tgt += "\""; if ( maxSize < 0 || elem->asString()->length() < (uint32) maxSize ) { tgt += *elem->asString(); tgt += "\""; } else { tgt += elem->asString()->subString(0, maxSize ); tgt += " ... \""; } break; case FLC_ITEM_LBIND: tgt += "&"; tgt += *elem->asLBind(); if (elem->isFutureBind()) { tgt +="|"; describe_internal( vm, tgt, &elem->asFutureBind(), level+1, maxLevel, maxSize ); } break; case FLC_ITEM_MEMBUF: { MemBuf *mb = elem->asMemBuf(); tgt += "MB("; tgt.writeNumber( (int64) mb->length() ); tgt += ","; tgt.writeNumber( (int64) mb->wordSize() ); tgt += ")"; tgt += " ["; String fmt; int limit = 0; switch ( mb->wordSize() ) { case 1: fmt = "%02" LLFMT "X"; limit = 24; break; case 2: fmt = "%04" LLFMT "X"; limit = 12; break; case 3: fmt = "%06" LLFMT "X"; limit = 9; break; case 4: fmt = "%08" LLFMT "X"; limit = 6; break; } uint32 max = maxSize < 0 || mb->length() < (uint32) maxSize ? mb->length() : (uint32) maxSize; for( count = 0; count < max; count++ ) { tgt.writeNumber( (int64) mb->get( count ), fmt ); tgt += " "; } if ( count == (uint32) maxSize ) tgt += " ..."; tgt += "]"; } break; case FLC_ITEM_ARRAY: { CoreArray *arr = elem->asArray(); tgt += "["; if ( level == maxLevel ) { tgt += "...]"; break; } for( count = 0; count < arr->length(); count++ ) { if ( count == 0 ) tgt += " "; describe_internal( vm, tgt, & ((*arr)[count]), level + 1, maxLevel, maxSize ); if ( count + 1 < arr->length() ) tgt += ", "; } tgt +="]"; } break; case FLC_ITEM_DICT: { CoreDict *dict = elem->asDict(); if( dict->isBlessed() ) tgt += "*"; tgt += "["; if ( level == maxLevel ) { tgt += "...=>...]"; break; } if ( dict->length() == 0 ) { tgt += "=>]"; break; } Item key, value; Iterator iter( &dict->items() ); // separate the first loop to be able to add ", " describe_internal( vm, tgt, &iter.getCurrentKey(), level + 1, maxLevel, maxSize ); tgt += " => "; describe_internal( vm, tgt, &iter.getCurrent(), level + 1, maxLevel, maxSize ); iter.next(); while( iter.hasCurrent() ) { tgt += ", "; describe_internal( vm, tgt, &iter.getCurrentKey(), level + 1, maxLevel, maxSize ); tgt += " => "; describe_internal( vm, tgt, &iter.getCurrent(), level + 1, maxLevel, maxSize ); iter.next(); } tgt += "]"; } break; case FLC_ITEM_OBJECT: { CoreObject *arr = elem->asObjectSafe(); tgt += arr->generator()->symbol()->name() + "(){ "; if ( level == maxLevel ) { tgt += "...}"; break; } const PropertyTable &pt = arr->generator()->properties(); for( count = 0; count < pt.added() ; count++ ) { const String &propName = *pt.getKey( count ); // write only? if ( pt.getEntry( count ).isWriteOnly() ) { tgt.A( "(" ).A( propName ).A(")"); } else { Item dummy; arr->getProperty( propName, dummy ); // in describe skip methods. if ( dummy.isFunction() || dummy.isMethod() ) continue; tgt += propName + " = "; describe_internal( vm, tgt, &dummy, level + 1, maxLevel, maxSize ); } if (count+1 < pt.added()) { tgt += ", "; } } tgt += "}"; } break; case FLC_ITEM_CLASS: tgt += "Class " + elem->asClass()->symbol()->name(); break; case FLC_ITEM_METHOD: { tgt += "("; Item itemp; elem->getMethodItem( itemp ); describe_internal( vm, tgt, &itemp, level + 1, maxLevel, maxSize ); tgt += ")."; tgt += elem->asMethodFunc()->name() + "()"; } break; case FLC_ITEM_CLSMETHOD: tgt += "Class "; tgt += elem->asMethodClassOwner()->generator()->symbol()->name(); tgt += "." + elem->asMethodClass()->symbol()->name() + "()"; break; case FLC_ITEM_FUNC: { const Symbol *funcSym = elem->asFunction()->symbol(); tgt += funcSym->name() + "()"; } break; case FLC_ITEM_REFERENCE: tgt += "->"; describe_internal( vm, tgt, elem->dereference(), level + 1, maxLevel, maxSize ); break; default: tgt += "?"; } }