mirror of
https://github.com/stefanocasazza/ULib.git
synced 2025-09-28 19:05:55 +08:00
SSE implementation
This commit is contained in:
parent
2eb6736227
commit
eeac9aca71
|
@ -44,6 +44,7 @@ The current version offers the following features :
|
|||
* Support for running natively PHP applications whith a php (embedded) library (experimental).
|
||||
* Support for load balance between physical server via udp brodcast (experimental).
|
||||
* Support for serialize object by [FlatBuffer schema-less](http://google.github.io/flatbuffers/index.html) like implementation.
|
||||
* Support for [SSE (Server Sent Event)](http://en.wikipedia.org/wiki/Server-sent_events) via ULib Servlet Page (USP) dedicate process.
|
||||
* Preforking mode to improve concurrency with dedicated process for long-time request.
|
||||
* Support for Windows (without preforking).
|
||||
* Customizable builds (you can remove unneeded functionality).
|
||||
|
|
24
configure
vendored
24
configure
vendored
|
@ -1060,6 +1060,7 @@ enable_log
|
|||
enable_GSDS
|
||||
enable_HCRS
|
||||
enable_HPRS
|
||||
enable_SSE
|
||||
enable_http2
|
||||
enable_check_time
|
||||
enable_classic
|
||||
|
@ -1804,6 +1805,7 @@ Optional Features:
|
|||
--enable-GSDS enable GDB Stack Dump Support [default=no]
|
||||
--enable-HCRS enable Cache Request Support [default=no]
|
||||
--enable-HPRS enable Homogeneous Pipeline Request Support [default=no]
|
||||
--enable-SSE enable Server-Sent Events Support [default=yes]
|
||||
--enable-http2 enable HTTP/2 support [default=no]
|
||||
--enable-check-time enable server check time between request for parallelization [default=no]
|
||||
--enable-classic enable server classic model support [default=no]
|
||||
|
@ -28326,6 +28328,28 @@ $as_echo "#define U_PIPELINE_HOMOGENEOUS_DISABLE 1" >>confdefs.h
|
|||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_HPRS" >&5
|
||||
$as_echo "$enable_HPRS" >&6; }
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if you want to enable Server-Sent Events support" >&5
|
||||
$as_echo_n "checking if you want to enable Server-Sent Events support... " >&6; }
|
||||
# Check whether --enable-SSE was given.
|
||||
if test "${enable_SSE+set}" = set; then :
|
||||
enableval=$enable_SSE;
|
||||
fi
|
||||
|
||||
if test -z "$enable_SSE"; then
|
||||
if test "$USP_FLAGS" = "-DAS_cpoll_cppsp_DO"; then
|
||||
enable_SSE="no"
|
||||
else
|
||||
enable_SSE="yes"
|
||||
fi
|
||||
fi
|
||||
if test "$enable_SSE" = "yes"; then
|
||||
|
||||
$as_echo "#define U_SSE_ENABLE 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_SSE" >&5
|
||||
$as_echo "$enable_SSE" >&6; }
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if you want to enable HTTP/2 support" >&5
|
||||
$as_echo_n "checking if you want to enable HTTP/2 support... " >&6; }
|
||||
# Check whether --enable-http2 was given.
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
delete query;
|
||||
delete crono;
|
||||
delete footer;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
extern U_EXPORT void runDynamicPage_ir_web(int param);
|
||||
|
@ -61,7 +61,6 @@ extern U_EXPORT void runDynamicPage_ir_web(int param);
|
|||
{
|
||||
U_TRACE(0, "::runDynamicPage_ir_web(%d)", param)
|
||||
|
||||
|
||||
if (param)
|
||||
{
|
||||
if (param == U_DPAGE_INIT) { usp_init_ir_web(); return; }
|
||||
|
|
|
@ -6,7 +6,7 @@ static void usp_end_wi_auth();
|
|||
static void usp_init_wi_auth();
|
||||
static void usp_sighup_wi_auth();
|
||||
|
||||
#include <ulib/examples/wi_auth_declaration.h>
|
||||
#include <ulib/examples/wi_auth_declaration.h>
|
||||
|
||||
extern "C" {
|
||||
extern U_EXPORT void runDynamicPage_wi_auth(int param);
|
||||
|
@ -14,7 +14,6 @@ extern U_EXPORT void runDynamicPage_wi_auth(int param);
|
|||
{
|
||||
U_TRACE(0, "::runDynamicPage_wi_auth(%d)", param)
|
||||
|
||||
|
||||
if (param)
|
||||
{
|
||||
if (param == U_DPAGE_INIT) { usp_init_wi_auth(); return; }
|
||||
|
|
|
@ -258,8 +258,13 @@ typedef enum {
|
|||
U_HASH_RIPEMD160 = 9
|
||||
} UHashType;
|
||||
|
||||
#if SIZEOF_LONG == 4
|
||||
# define U_INT2PTR(x) ((void*)(long)(x))
|
||||
#else
|
||||
# define U_INT2PTR(x) ((void*)((long)(x) & 0x00000000FFFFFFFFULL))
|
||||
#endif
|
||||
|
||||
#define U_PTR2INT(x) ((unsigned int)(long)x)
|
||||
#define U_INT2PTR(x) ( (void*)(long)x)
|
||||
|
||||
union uucflag {
|
||||
unsigned char c[4];
|
||||
|
|
|
@ -868,6 +868,9 @@
|
|||
/* enable server thread approach support */
|
||||
#undef U_SERVER_THREAD_APPROACH_SUPPORT
|
||||
|
||||
/* enable Server-Sent Events support */
|
||||
#undef U_SSE_ENABLE
|
||||
|
||||
/* STATIC_HANDLER_ECHO */
|
||||
#undef U_STATIC_HANDLER_ECHO
|
||||
|
||||
|
|
|
@ -6,6 +6,10 @@
|
|||
typedef _Bool bool;
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_SYSMACROS_H_OUTER
|
||||
#define _SYS_SYSMACROS_H_OUTER 1
|
||||
#endif
|
||||
|
||||
#define U_CSP_INTERFACE
|
||||
#include <ulib/base/base.h>
|
||||
#include <ulib/internal/chttp.h>
|
||||
|
|
|
@ -289,8 +289,20 @@ public:
|
|||
|
||||
union jval getKey() const { return pkey; }
|
||||
|
||||
int64_t getInt64() const { return -(long)getPayload(); }
|
||||
uint64_t getUInt64() const { return (long)getPayload(); }
|
||||
uint64_t getUInt64() const
|
||||
{
|
||||
U_TRACE_NO_PARAM(0, "UValue::getUInt64()")
|
||||
|
||||
uint64_t n = u_getPayload(value.ival);
|
||||
|
||||
U_INTERNAL_DUMP("n = %llu", n)
|
||||
|
||||
U_INTERNAL_ASSERT(n <= 140737488355327ULL)
|
||||
|
||||
U_RETURN(n);
|
||||
}
|
||||
|
||||
int64_t getInt64() const { return -getUInt64(); }
|
||||
|
||||
UString getString() { return getString(value.ival); }
|
||||
|
||||
|
@ -958,21 +970,12 @@ protected:
|
|||
U_INTERNAL_DUMP("o.ival = %llu", o.ival)
|
||||
}
|
||||
|
||||
#if SIZEOF_LONG == 4
|
||||
static void setValue(uint8_t tag, char* pval) { setValue(tag, (void*)*pval); }
|
||||
static void setValue(uint8_t tag, unsigned char* pval) { setValue(tag, (void*)*pval); }
|
||||
static void setValue(uint8_t tag, short* pval) { setValue(tag, (void*)*pval); }
|
||||
static void setValue(uint8_t tag, unsigned short* pval) { setValue(tag, (void*)*pval); }
|
||||
static void setValue(uint8_t tag, int* pval) { setValue(tag, (void*)*pval); }
|
||||
static void setValue(uint8_t tag, unsigned int* pval) { setValue(tag, (void*)*pval); }
|
||||
#else
|
||||
static void setValue(uint8_t tag, char* pval) { setValue(tag, (void*)(*pval & 0x00000000FFFFFFFFULL)); }
|
||||
static void setValue(uint8_t tag, unsigned char* pval) { setValue(tag, (void*)(*pval & 0x00000000FFFFFFFFULL)); }
|
||||
static void setValue(uint8_t tag, short* pval) { setValue(tag, (void*)(*pval & 0x00000000FFFFFFFFULL)); }
|
||||
static void setValue(uint8_t tag, unsigned short* pval) { setValue(tag, (void*)(*pval & 0x00000000FFFFFFFFULL)); }
|
||||
static void setValue(uint8_t tag, int* pval) { setValue(tag, (void*)(*pval & 0x00000000FFFFFFFFULL)); }
|
||||
static void setValue(uint8_t tag, unsigned int* pval) { setValue(tag, (void*)(*pval & 0x00000000FFFFFFFFULL)); }
|
||||
#endif
|
||||
static void setValue(uint8_t tag, char* pval) { setValue(tag, U_INT2PTR(*pval)); }
|
||||
static void setValue(uint8_t tag, unsigned char* pval) { setValue(tag, U_INT2PTR(*pval)); }
|
||||
static void setValue(uint8_t tag, short* pval) { setValue(tag, U_INT2PTR(*pval)); }
|
||||
static void setValue(uint8_t tag, unsigned short* pval) { setValue(tag, U_INT2PTR(*pval)); }
|
||||
static void setValue(uint8_t tag, int* pval) { setValue(tag, U_INT2PTR(*pval)); }
|
||||
static void setValue(uint8_t tag, unsigned int* pval) { setValue(tag, U_INT2PTR(*pval)); }
|
||||
|
||||
static void setUInt64(uint64_t l)
|
||||
{
|
||||
|
|
|
@ -103,7 +103,7 @@ class UFlatBuffer;
|
|||
|
||||
template <class T> class UFlatBufferTypeHandler;
|
||||
|
||||
class U_NO_EXPORT UFlatBufferValue {
|
||||
class U_EXPORT UFlatBufferValue {
|
||||
public:
|
||||
|
||||
/**
|
||||
|
@ -337,6 +337,8 @@ protected:
|
|||
}
|
||||
|
||||
private:
|
||||
UFlatBufferValue() {}
|
||||
|
||||
friend class UFlatBuffer;
|
||||
|
||||
U_DISALLOW_COPY_AND_ASSIGN(UFlatBufferValue)
|
||||
|
@ -355,6 +357,11 @@ public:
|
|||
UFlatBuffer()
|
||||
{
|
||||
U_TRACE_REGISTER_OBJECT(0, UFlatBuffer, "", 0)
|
||||
|
||||
// coverity[uninit_ctor]
|
||||
# ifdef U_COVERITY_FALSE_POSITIVE
|
||||
reset();
|
||||
# endif
|
||||
}
|
||||
|
||||
~UFlatBuffer()
|
||||
|
@ -364,6 +371,17 @@ public:
|
|||
|
||||
// SERVICES
|
||||
|
||||
void reset()
|
||||
{
|
||||
U_TRACE_NO_PARAM(0, "UFlatBuffer::reset()")
|
||||
|
||||
data_ = U_NULLPTR;
|
||||
buffer_idx = 0;
|
||||
type_ = UFlatBufferValue::TYPE_NULL;
|
||||
byte_width_ =
|
||||
parent_width_ = UFlatBufferValue::BIT_WIDTH_8;
|
||||
}
|
||||
|
||||
uint8_t GetType() const { return type_; }
|
||||
|
||||
static bool IsBool(uint8_t type) { return type == UFlatBufferValue::TYPE_BOOL; }
|
||||
|
@ -675,14 +693,11 @@ public:
|
|||
|
||||
// Reset all state so we can re-use the buffers
|
||||
|
||||
setStackPointer(stack_idx = buffer_idx = 0);
|
||||
reset();
|
||||
|
||||
setStackPointer((stack_idx = 0));
|
||||
|
||||
pvalue->reset();
|
||||
|
||||
data_ = U_NULLPTR;
|
||||
type_ = UFlatBufferValue::TYPE_NULL;
|
||||
byte_width_ =
|
||||
parent_width_ = UFlatBufferValue::BIT_WIDTH_8;
|
||||
}
|
||||
|
||||
uint32_t EndBuild()
|
||||
|
|
|
@ -1213,7 +1213,9 @@ protected:
|
|||
friend class UFile;
|
||||
friend class UHTTP2;
|
||||
friend class UValue;
|
||||
friend class UServices;
|
||||
friend class UStringExt;
|
||||
friend class USocketExt;
|
||||
friend class UClientImage_Base;
|
||||
friend class UREDISClient_Base;
|
||||
|
||||
|
@ -1243,7 +1245,7 @@ protected:
|
|||
void setFromData(const char** ptr, uint32_t sz, unsigned char delim);
|
||||
|
||||
public:
|
||||
// mutable
|
||||
// mutable
|
||||
UStringRep* rep;
|
||||
|
||||
// SERVICES
|
||||
|
@ -1306,6 +1308,23 @@ protected:
|
|||
U_INTERNAL_ASSERT(invariant())
|
||||
}
|
||||
|
||||
uint32_t getReserveNeed(uint32_t n)
|
||||
{
|
||||
U_TRACE(0, "UString::getReserveNeed(%u)", n)
|
||||
|
||||
uint32_t need = rep->_length + n;
|
||||
|
||||
if (need < U_CAPACITY) need = U_CAPACITY;
|
||||
else if (need > U_CAPACITY)
|
||||
{
|
||||
if (need < 2*1024*1024) need = (need * 2) + (PAGESIZE * 2);
|
||||
|
||||
need += PAGESIZE; // NB: to avoid duplication on realloc...
|
||||
}
|
||||
|
||||
U_RETURN(need);
|
||||
}
|
||||
|
||||
public:
|
||||
void _assign(UStringRep* r)
|
||||
{
|
||||
|
@ -1620,7 +1639,7 @@ public:
|
|||
|
||||
if (rep->space() < n)
|
||||
{
|
||||
_reserve(*this, n);
|
||||
_reserve(*this, rep->_length + n);
|
||||
|
||||
U_RETURN(true); // return true if it has changed rep...
|
||||
}
|
||||
|
@ -1628,7 +1647,23 @@ public:
|
|||
U_RETURN(false);
|
||||
}
|
||||
|
||||
static void _reserve(UString& buffer, uint32_t n);
|
||||
static void _reserve(UString& buffer, uint32_t n)
|
||||
{
|
||||
U_TRACE(0, "UString::_reserve(%V,%u)", buffer.rep, n)
|
||||
|
||||
UStringRep* rep = buffer.rep;
|
||||
|
||||
U_INTERNAL_DUMP("rep = %p rep->parent = %p rep->references = %u rep->child = %d rep->_length = %u rep->_capacity = %u",
|
||||
rep, rep->parent, rep->references, rep->child, rep->_length, rep->_capacity)
|
||||
|
||||
U_ASSERT(rep->space() < n)
|
||||
U_INTERNAL_ASSERT(n <= max_size())
|
||||
U_INTERNAL_ASSERT_MAJOR(n, rep->_length)
|
||||
|
||||
buffer._set(UStringRep::create(rep->_length, n, rep->str));
|
||||
|
||||
U_INTERNAL_ASSERT(buffer.invariant())
|
||||
}
|
||||
|
||||
// Element access
|
||||
|
||||
|
@ -1637,8 +1672,8 @@ public:
|
|||
|
||||
char* pend() const { return rep->pend(); }
|
||||
|
||||
// operator const char *() const { return rep->data(); }
|
||||
// operator char *() { return rep->data(); }
|
||||
// operator const char *() const { return rep->data(); }
|
||||
// operator char *() { return rep->data(); }
|
||||
|
||||
// Modifiers
|
||||
|
||||
|
@ -2061,7 +2096,25 @@ public:
|
|||
}
|
||||
|
||||
void setBuffer(uint32_t n);
|
||||
void moveToBeginDataInBuffer(uint32_t n);
|
||||
|
||||
void moveToBeginDataInBuffer(uint32_t n)
|
||||
{
|
||||
U_TRACE(1, "UString::moveToBeginDataInBuffer(%u)", n)
|
||||
|
||||
U_INTERNAL_ASSERT_MAJOR(rep->_length, n)
|
||||
U_INTERNAL_ASSERT_RANGE(1, n, max_size())
|
||||
U_INTERNAL_ASSERT_MAJOR(rep->_capacity, n)
|
||||
|
||||
# if defined(DEBUG) && !defined(U_SUBSTR_INC_REF)
|
||||
U_INTERNAL_ASSERT(rep->references == 0)
|
||||
# endif
|
||||
|
||||
rep->_length -= n;
|
||||
|
||||
(void) U_SYSCALL(memmove, "%p,%p,%u", (void*)rep->str, rep->str + n, rep->_length);
|
||||
|
||||
U_INTERNAL_ASSERT(invariant())
|
||||
}
|
||||
|
||||
static vpFpcu printValueToBuffer;
|
||||
|
||||
|
@ -2179,7 +2232,7 @@ public:
|
|||
{
|
||||
U_TRACE(0, "UString::appendNumber32(%u)", number)
|
||||
|
||||
(void) reserve(12U);
|
||||
U_ASSERT_MAJOR(space(), 12)
|
||||
|
||||
uint32_t sz = size();
|
||||
char* ptr = c_pointer(sz);
|
||||
|
@ -2193,7 +2246,7 @@ public:
|
|||
{
|
||||
U_TRACE(0, "UString::appendNumber32s(%d)", number)
|
||||
|
||||
(void) reserve(12U);
|
||||
U_ASSERT_MAJOR(space(), 12)
|
||||
|
||||
uint32_t sz = size();
|
||||
char* ptr = c_pointer(sz);
|
||||
|
@ -2207,7 +2260,7 @@ public:
|
|||
{
|
||||
U_TRACE(0, "UString::appendNumber64(%llu)", number)
|
||||
|
||||
(void) reserve(22U);
|
||||
U_ASSERT_MAJOR(space(), 22)
|
||||
|
||||
uint32_t sz = size();
|
||||
char* ptr = c_pointer(sz);
|
||||
|
@ -2221,7 +2274,7 @@ public:
|
|||
{
|
||||
U_TRACE(0, "UString::appendNumber64s(%lld)", number)
|
||||
|
||||
(void) reserve(22U);
|
||||
U_ASSERT_MAJOR(space(), 22)
|
||||
|
||||
uint32_t sz = size();
|
||||
char* ptr = c_pointer(sz);
|
||||
|
@ -2235,7 +2288,7 @@ public:
|
|||
{
|
||||
U_TRACE(0, "UString::appendNumberDouble(%g)", number)
|
||||
|
||||
(void) reserve(32U);
|
||||
U_ASSERT_MAJOR(space(), 32)
|
||||
|
||||
uint32_t sz = size();
|
||||
char* ptr = c_pointer(sz);
|
||||
|
@ -2249,6 +2302,8 @@ public:
|
|||
{
|
||||
U_TRACE(0, "UString::appendData(%.*S,%u)", tlen, t, tlen)
|
||||
|
||||
U_ASSERT_MAJOR(space(), tlen)
|
||||
|
||||
uint32_t sz = size();
|
||||
char* ptr = c_pointer(sz);
|
||||
|
||||
|
|
|
@ -359,7 +359,14 @@ public:
|
|||
// SERVICES
|
||||
|
||||
void nanosleep();
|
||||
static void nanosleep(time_t timeoutMS) { UTimeVal(timeoutMS / 1000L, (timeoutMS % 1000L) * 1000L).nanosleep(); }
|
||||
static void nanosleep(time_t timeoutMS)
|
||||
{
|
||||
U_TRACE(0, "UTimeVal::nanosleep(%ld)", timeoutMS)
|
||||
|
||||
U_INTERNAL_ASSERT(timeoutMS >= 100)
|
||||
|
||||
UTimeVal(timeoutMS / 1000L, (timeoutMS % 1000L) * 1000L).nanosleep();
|
||||
}
|
||||
|
||||
// CHRONOMETER
|
||||
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
|
||||
class U_EXPORT UStringExt {
|
||||
public:
|
||||
|
||||
#ifdef USE_LIBSSL
|
||||
static UString BIOtoString(BIO* bio);
|
||||
static UString ASN1TimetoString(ASN1_GENERALIZEDTIME* t);
|
||||
|
@ -41,6 +40,10 @@ public:
|
|||
static UString stripTags(const UString& html, UString* list_tags_allowed = U_NULLPTR);
|
||||
#endif
|
||||
|
||||
#ifndef U_LOG_DISABLE
|
||||
static const char* deflate_agent;
|
||||
#endif
|
||||
|
||||
static bool isDelimited(const UString& s, const char* delimiter = "()")
|
||||
{
|
||||
U_TRACE(0, "UStringExt::isDelimited(%V,%S)", s.rep, delimiter)
|
||||
|
|
|
@ -676,6 +676,59 @@ public:
|
|||
U_RETURN_STRING(keyid);
|
||||
}
|
||||
|
||||
#ifdef U_SSE_ENABLE // SERVER SENT EVENTS (SSE)
|
||||
static bool bsse;
|
||||
|
||||
static uint32_t getSSELastEventID()
|
||||
{
|
||||
U_TRACE_NO_PARAM(0, "UHTTP::getSSELastEventID()")
|
||||
|
||||
U_INTERNAL_ASSERT(bsse)
|
||||
|
||||
const char* ptr = UHTTP::getHeaderValuePtr(U_CONSTANT_TO_PARAM("last-event-id"), true);
|
||||
|
||||
uint32_t last_event_id = (ptr ? u_atoi(ptr) : 0);
|
||||
|
||||
U_RETURN(last_event_id);
|
||||
}
|
||||
|
||||
static void writeSSE(uint32_t id, const UString& data, const UString* pevent = U_NULLPTR)
|
||||
{
|
||||
U_TRACE(0, "UHTTP::writeSSE(%u,%V,%p)", id, data.rep, pevent)
|
||||
|
||||
if (pevent) UClientImage_Base::wbuffer->snprintf_add(U_CONSTANT_TO_PARAM("id:%u\nevent:%v\ndata:"), id, pevent->rep);
|
||||
else UClientImage_Base::wbuffer->snprintf_add(U_CONSTANT_TO_PARAM("id:%u\ndata:"), id);
|
||||
|
||||
UVector<UString> vec(data, '\n');
|
||||
|
||||
UClientImage_Base::wbuffer->append(vec[0]);
|
||||
|
||||
for (uint32_t i = 1, n = vec.size(); i < n; ++i)
|
||||
{
|
||||
UClientImage_Base::wbuffer->snprintf_add(U_CONSTANT_TO_PARAM("\ndata:%v"), vec[i].rep);
|
||||
}
|
||||
|
||||
UClientImage_Base::wbuffer->append(U_CONSTANT_TO_PARAM("\n\n"));
|
||||
}
|
||||
|
||||
static void sendSSE(uint32_t id, const UString& data, const UString* pevent = U_NULLPTR)
|
||||
{
|
||||
U_TRACE(0, "UHTTP::sendSSE(%u,%V,%p)", id, data.rep, pevent)
|
||||
|
||||
U_INTERNAL_ASSERT(bsse)
|
||||
|
||||
UClientImage_Base::wbuffer->setBuffer(U_CAPACITY);
|
||||
|
||||
writeSSE(id, data, pevent);
|
||||
|
||||
uint32_t sz = UClientImage_Base::wbuffer->size();
|
||||
|
||||
U_SRV_LOG_WITH_ADDR("send message (%u bytes) %#.*S to", sz, sz, UClientImage_Base::wbuffer->data());
|
||||
|
||||
if (USocketExt::write(UServer_Base::csocket, UClientImage_Base::wbuffer->data(), sz, UServer_Base::timeoutMS) != (int32_t)sz) UServer_Base::endNewChild(); // no return
|
||||
}
|
||||
#endif
|
||||
|
||||
// HTML Pagination
|
||||
|
||||
static uint32_t num_page_end,
|
||||
|
@ -842,7 +895,7 @@ public:
|
|||
const char* dump(bool reset) const U_EXPORT;
|
||||
#endif
|
||||
|
||||
private:
|
||||
private:
|
||||
bool load() U_NO_EXPORT;
|
||||
bool isPath(const char* pathname, uint32_t len)
|
||||
{
|
||||
|
@ -859,6 +912,7 @@ public:
|
|||
template <class T> friend void u_construct(const T**,bool);
|
||||
};
|
||||
|
||||
static UServletPage* usp;
|
||||
static bool bcallInitForAllUSP;
|
||||
static UVector<UServletPage*>* vusp;
|
||||
|
||||
|
@ -867,8 +921,8 @@ public:
|
|||
static void callSigHUPForAllUSP();
|
||||
static void callAfterForkForAllUSP();
|
||||
|
||||
static bool checkForUSP();
|
||||
static UServletPage* getUSP(const char* key, uint32_t key_len);
|
||||
static bool checkForUSP();
|
||||
static bool getUSP(const char* key, uint32_t key_len);
|
||||
|
||||
// CSP (C Servlet Page)
|
||||
|
||||
|
|
|
@ -209,6 +209,21 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[
|
|||
fi
|
||||
AC_MSG_RESULT([$enable_HPRS])
|
||||
|
||||
AC_MSG_CHECKING(if you want to enable Server-Sent Events support)
|
||||
AC_ARG_ENABLE(SSE,
|
||||
[ --enable-SSE enable Server-Sent Events Support [[default=yes]]])
|
||||
if test -z "$enable_SSE"; then
|
||||
if test "$USP_FLAGS" = "-DAS_cpoll_cppsp_DO"; then
|
||||
enable_SSE="no"
|
||||
else
|
||||
enable_SSE="yes"
|
||||
fi
|
||||
fi
|
||||
if test "$enable_SSE" = "yes"; then
|
||||
AC_DEFINE(U_SSE_ENABLE, 1, [enable Server-Sent Events support])
|
||||
fi
|
||||
AC_MSG_RESULT([$enable_SSE])
|
||||
|
||||
AC_MSG_CHECKING(if you want to enable HTTP/2 support)
|
||||
AC_ARG_ENABLE(http2,
|
||||
[ --enable-http2 enable HTTP/2 support [[default=no]]])
|
||||
|
|
|
@ -390,7 +390,7 @@ U_NO_EXPORT bool UCommand::postCommand(UString* input, UString* output)
|
|||
|
||||
UProcess::kill(pid, SIGTERM);
|
||||
|
||||
UTimeVal::nanosleep(1L);
|
||||
UTimeVal::nanosleep(1000L);
|
||||
|
||||
UProcess::kill(pid, SIGKILL);
|
||||
}
|
||||
|
|
|
@ -515,6 +515,8 @@ void UMemoryPool::deallocate(void* ptr, uint32_t length)
|
|||
{
|
||||
U_TRACE(1, "UMemoryPool::deallocate(%p,%u)", ptr, length)
|
||||
|
||||
U_INTERNAL_ASSERT_MINOR(length, U_TO_FREE)
|
||||
|
||||
if (UFile::isLastAllocation(ptr, length))
|
||||
{
|
||||
UFile::pfree = (char*)ptr;
|
||||
|
|
|
@ -717,12 +717,15 @@ void ULog::logResponse(const UString& data, const char* format, uint32_t fmt_siz
|
|||
len = (UServer_Base::mod_name[0][0] ? u__snprintf(buffer, sizeof(buffer), U_CONSTANT_TO_PARAM("%s"), UServer_Base::mod_name) : 0);
|
||||
len += u__snprintf(buffer-len, sizeof(buffer)-len, U_CONSTANT_TO_PARAM("received response (%u bytes) %#.*S"), sz, sz, ptr);
|
||||
|
||||
va_list argp;
|
||||
va_start(argp, fmt_size);
|
||||
if (fmt_size)
|
||||
{
|
||||
va_list argp;
|
||||
va_start(argp, fmt_size);
|
||||
|
||||
len += u__vsnprintf(buffer+len, sizeof(buffer)-len, format, fmt_size, argp);
|
||||
len += u__vsnprintf(buffer+len, sizeof(buffer)-len, format, fmt_size, argp);
|
||||
|
||||
va_end(argp);
|
||||
va_end(argp);
|
||||
}
|
||||
|
||||
write(buffer, len);
|
||||
|
||||
|
|
|
@ -365,7 +365,7 @@ fd_set* UPing::checkForPingAsyncCompletion(uint32_t nfds)
|
|||
if (nfds &&
|
||||
SHM_counter < nfds)
|
||||
{
|
||||
UTimeVal::nanosleep(1L);
|
||||
UTimeVal::nanosleep(1000L);
|
||||
|
||||
U_INTERNAL_DUMP("SHM_counter = %u addrmask = %B", SHM_counter, __FDS_BITS(addrmask)[0])
|
||||
|
||||
|
|
|
@ -900,7 +900,7 @@ void UClientImage_Base::manageReadBufferResize(uint32_t n)
|
|||
{
|
||||
const char* ptr = rbuffer->data();
|
||||
|
||||
UString::_reserve(*rbuffer, n);
|
||||
UString::_reserve(*rbuffer, rbuffer->getReserveNeed(n));
|
||||
|
||||
diff += rbuffer->data() - ptr;
|
||||
}
|
||||
|
|
|
@ -579,15 +579,13 @@ int UHttpPlugIn::handlerRun() // NB: we use this method instead of handlerInit()
|
|||
|
||||
UHTTP::bcallInitForAllUSP = true;
|
||||
|
||||
UHTTP::UServletPage* usp = UHTTP::getUSP(U_CONSTANT_TO_PARAM("modupload"));
|
||||
|
||||
if (usp)
|
||||
if (UHTTP::getUSP(U_CONSTANT_TO_PARAM("modupload")))
|
||||
{
|
||||
U_INTERNAL_DUMP("modupload->runDynamicPage = %p", usp->runDynamicPage)
|
||||
U_INTERNAL_DUMP("modupload->runDynamicPage = %p", UHTTP::usp->runDynamicPage)
|
||||
|
||||
U_INTERNAL_ASSERT_POINTER(usp->runDynamicPage)
|
||||
U_INTERNAL_ASSERT_POINTER(UHTTP::usp->runDynamicPage)
|
||||
|
||||
UHTTP::on_upload = usp->runDynamicPage;
|
||||
UHTTP::on_upload = UHTTP::usp->runDynamicPage;
|
||||
}
|
||||
|
||||
if (UHTTP::upload_dir->empty()) (void) UHTTP::upload_dir->assign(U_CONSTANT_TO_PARAM("uploads"));
|
||||
|
|
|
@ -78,15 +78,13 @@ int UWebSocketPlugIn::handlerRun()
|
|||
|
||||
U_NEW(UString, UWebSocket::rbuffer, UString(U_CAPACITY));
|
||||
|
||||
UHTTP::UServletPage* usp = UHTTP::getUSP(U_CONSTANT_TO_PARAM("modsocket"));
|
||||
|
||||
if (usp)
|
||||
if (UHTTP::getUSP(U_CONSTANT_TO_PARAM("modsocket")))
|
||||
{
|
||||
U_INTERNAL_DUMP("modsocket->runDynamicPage = %p", usp->runDynamicPage)
|
||||
U_INTERNAL_DUMP("modsocket->runDynamicPage = %p", UHTTP::usp->runDynamicPage)
|
||||
|
||||
U_INTERNAL_ASSERT_POINTER(usp->runDynamicPage)
|
||||
U_INTERNAL_ASSERT_POINTER(UHTTP::usp->runDynamicPage)
|
||||
|
||||
on_message = usp->runDynamicPage;
|
||||
on_message = UHTTP::usp->runDynamicPage;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -152,6 +152,8 @@ public:
|
|||
* <!--#vcode ... -->
|
||||
* <!--#pcode ... -->
|
||||
* <!--#lcode ... -->
|
||||
* <!--#ssecode ... -->
|
||||
* <!--#sseloop ... -->
|
||||
* <!--#number ... -->
|
||||
* <!--#puts ... -->
|
||||
* <!--#xmlputs ... -->
|
||||
|
@ -301,16 +303,6 @@ public:
|
|||
|
||||
manageDirectiveArgsOrCpath("UHTTP::getPathComponent", true);
|
||||
}
|
||||
else if (strncmp(directive, U_CONSTANT_TO_PARAM("header")) == 0)
|
||||
{
|
||||
U_ASSERT(vcode.empty())
|
||||
U_ASSERT(http_header.empty())
|
||||
U_INTERNAL_ASSERT_EQUALS(bfirst_pass, false)
|
||||
|
||||
setDirectiveItem(directive, U_CONSTANT_SIZE("header"));
|
||||
|
||||
http_header = token;
|
||||
}
|
||||
else if (strncmp(directive, U_CONSTANT_TO_PARAM("vcode")) == 0) // validation code
|
||||
{
|
||||
U_ASSERT(vcode.empty()) // NB: <!--#vcode ... --> must be before other code and uniq...
|
||||
|
@ -376,6 +368,111 @@ public:
|
|||
|
||||
output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\t%v\n\t\n"), token.rep);
|
||||
}
|
||||
else if (strncmp(directive, U_CONSTANT_TO_PARAM("ssecode")) == 0) // SSE code
|
||||
{
|
||||
U_ASSERT(output2.empty())
|
||||
U_ASSERT(http_header.empty())
|
||||
U_INTERNAL_ASSERT_EQUALS(bfirst_pass, false)
|
||||
|
||||
setDirectiveItem(directive, U_CONSTANT_SIZE("ssecode"));
|
||||
|
||||
U_INTERNAL_ASSERT(token)
|
||||
|
||||
token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t\t"));
|
||||
|
||||
/**
|
||||
* we must insert:
|
||||
*
|
||||
* <!--#header
|
||||
* Content-Type: text/event-stream
|
||||
* Cache-Control: no-cache
|
||||
* -->
|
||||
*/
|
||||
|
||||
(void) http_header.reserve(1000U + token.size());
|
||||
|
||||
(void) http_header.snprintf(U_CONSTANT_TO_PARAM(
|
||||
"\n\tif (U_http_accept_len != U_CONSTANT_SIZE(\"text/event-stream\") ||"
|
||||
" u_get_unalignedp64(U_http_info.accept) != U_MULTICHAR_CONSTANT64('t','e','x','t','/','e','v','e')) UHTTP::setBadRequest();"
|
||||
"\n\telse"
|
||||
"\n\t\t{"
|
||||
"\n\t\tUHTTP::bsse = true;"
|
||||
"\n\t\t(void) UServer_Base::csocket->shutdown(SHUT_RD);"
|
||||
"\n\t\tU_INTERNAL_ASSERT_EQUALS(UClientImage_Base::wbuffer->findEndHeader(),false)"
|
||||
"\n\t\tU_http_info.endHeader = 61;"
|
||||
"\n\t\t(void) UClientImage_Base::wbuffer->insert(0, U_CONSTANT_TO_PARAM(\"Content-Type: text/event-stream\\r\\nCache-Control: no-cache\\r\\n\\r\\n\"));"
|
||||
"\n\t\tU_http_content_type_len = 1;"
|
||||
"\n\t\t%v"
|
||||
"\n\t\t}"), token.rep);
|
||||
}
|
||||
else if (strncmp(directive, U_CONSTANT_TO_PARAM("sseloop")) == 0) // SSE loop
|
||||
{
|
||||
U_ASSERT(sseloop.empty())
|
||||
U_INTERNAL_ASSERT_EQUALS(bfirst_pass, false)
|
||||
|
||||
setDirectiveItem(directive, U_CONSTANT_SIZE("sseloop"));
|
||||
|
||||
U_INTERNAL_ASSERT(token)
|
||||
|
||||
uint32_t sz = token.size();
|
||||
const char* data = token.data();
|
||||
|
||||
uint32_t sse_time_to_sleep = 1;
|
||||
|
||||
if (*data == ':')
|
||||
{
|
||||
++data;
|
||||
|
||||
sse_time_to_sleep = u_strtoulp(&data);
|
||||
|
||||
sz = token.remain(data);
|
||||
}
|
||||
|
||||
char buffer[200];
|
||||
|
||||
(void) vars.append(buffer, u__snprintf(buffer, sizeof(buffer), U_CONSTANT_TO_PARAM("\n\tUTimeVal sse_time_to_sleep(%u, 0L);\n\t\n"), sse_time_to_sleep));
|
||||
|
||||
sseloop = UStringExt::substitute(data, sz, '\n', U_CONSTANT_TO_PARAM("\n\t"));
|
||||
|
||||
(void) output2.reserve(200U + sseloop.size());
|
||||
|
||||
output2.snprintf(U_CONSTANT_TO_PARAM(
|
||||
"\n\treturn;\n\t\n"
|
||||
"sseloop:"
|
||||
"\n\tsse_time_to_sleep.nanosleep();"
|
||||
"\n\t%v"
|
||||
"\n\tgoto sseloop;"), sseloop.rep);
|
||||
}
|
||||
else if (strncmp(directive, U_CONSTANT_TO_PARAM("header")) == 0)
|
||||
{
|
||||
U_ASSERT(vcode.empty())
|
||||
U_ASSERT(http_header.empty())
|
||||
U_INTERNAL_ASSERT_EQUALS(bfirst_pass, false)
|
||||
|
||||
setDirectiveItem(directive, U_CONSTANT_SIZE("header"));
|
||||
|
||||
// NB: we use insert because the possibility of UHTTP::callService() (see chat.usp)...
|
||||
|
||||
if (U_STRING_FIND(token, 0, "Content-Type") != U_NOT_FOUND) (void) output2.assign(U_CONSTANT_TO_PARAM("\n\tU_http_content_type_len = 1;\n\t\n"));
|
||||
|
||||
http_header = UStringExt::dos2unix(token, true);
|
||||
|
||||
(void) http_header.append(U_CONSTANT_TO_PARAM("\r\n\r\n"));
|
||||
|
||||
uint32_t n = http_header.size();
|
||||
|
||||
UString encoded(n * 4);
|
||||
|
||||
UEscape::encode(http_header, encoded);
|
||||
|
||||
U_ASSERT(encoded.isQuoted())
|
||||
|
||||
(void) http_header.reserve(200U + encoded.size());
|
||||
|
||||
(void) http_header.snprintf(U_CONSTANT_TO_PARAM("\n\tU_INTERNAL_ASSERT_EQUALS(UClientImage_Base::wbuffer->findEndHeader(),false)"
|
||||
"\n\tU_http_info.endHeader = %u;"
|
||||
"\n\t(void) UClientImage_Base::wbuffer->insert(0, U_CONSTANT_TO_PARAM(%v));\n\t\n"), n, encoded.rep);
|
||||
}
|
||||
else if (strncmp(directive, U_CONSTANT_TO_PARAM("number")) == 0)
|
||||
{
|
||||
U_INTERNAL_ASSERT_EQUALS(bfirst_pass, false)
|
||||
|
@ -602,6 +699,7 @@ loop: distance = t.getDistance();
|
|||
bsighup, // usp_sighup
|
||||
bfork; // usp_fork
|
||||
|
||||
const char* ptr0 = (sseloop ? "\n\t\tif (UHTTP::bsse) goto sseloop;\n\t" : "");
|
||||
char ptr1[100] = { '\0' };
|
||||
char ptr2[100] = { '\0' };
|
||||
char ptr3[100] = { '\0' };
|
||||
|
@ -686,9 +784,13 @@ loop: distance = t.getDistance();
|
|||
: "\n\t\tif (param >= U_DPAGE_FORK) return;\n");
|
||||
}
|
||||
|
||||
// NB: we check for HTML without HTTP headers...
|
||||
if (bvar)
|
||||
{
|
||||
(void) vars.append(U_CONSTANT_TO_PARAM("\n\tuint32_t usp_sz = 0;"
|
||||
"\n\tchar usp_buffer[10 * 4096];\n\t"));
|
||||
}
|
||||
|
||||
UString output2;
|
||||
// NB: we check for HTML without HTTP headers...
|
||||
|
||||
if (http_header.empty())
|
||||
{
|
||||
|
@ -696,32 +798,8 @@ loop: distance = t.getDistance();
|
|||
|
||||
(void) http_header.append(U_CONSTANT_TO_PARAM("\n\tU_http_info.endHeader = 0;\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
// NB: we use insert because the possibility of UHTTP::callService() (see chat.usp)...
|
||||
|
||||
if (U_STRING_FIND(http_header, 0, "Content-Type") != U_NOT_FOUND) (void) output2.assign(U_CONSTANT_TO_PARAM("\n\t\tU_http_content_type_len = 1;\n\t"));
|
||||
|
||||
http_header = UStringExt::dos2unix(http_header, true);
|
||||
|
||||
(void) http_header.append(U_CONSTANT_TO_PARAM("\r\n\r\n"));
|
||||
|
||||
uint32_t n = http_header.size();
|
||||
|
||||
UString encoded(n * 4);
|
||||
|
||||
UEscape::encode(http_header, encoded);
|
||||
|
||||
U_ASSERT(encoded.isQuoted())
|
||||
|
||||
(void) http_header.reserve(200U + encoded.size());
|
||||
|
||||
(void) http_header.snprintf(U_CONSTANT_TO_PARAM("\n\tU_INTERNAL_ASSERT_EQUALS(UClientImage_Base::wbuffer->findEndHeader(),false)"
|
||||
"\n\tU_http_info.endHeader = %u;"
|
||||
"\n\t(void) UClientImage_Base::wbuffer->insert(0, U_CONSTANT_TO_PARAM(%v));\n\t\n"), n, encoded.rep);
|
||||
}
|
||||
|
||||
UString result(1024U + declaration.size() + http_header.size() + output0.size() + output1.size() + output2.size());
|
||||
UString result(1024U + declaration.size() + http_header.size() + output0.size() + output1.size() + output2.size() + sseloop.size() + vars.size());
|
||||
|
||||
result.snprintf(U_CONSTANT_TO_PARAM(
|
||||
"// %.*s.cpp - dynamic page translation (%.*s.usp => %.*s.cpp)\n"
|
||||
|
@ -729,16 +807,14 @@ loop: distance = t.getDistance();
|
|||
"#include <ulib/net/server/usp_macro.h>\n"
|
||||
"\t\n"
|
||||
"%v"
|
||||
"\t\n"
|
||||
"\t\n"
|
||||
"\n\t\n"
|
||||
"extern \"C\" {\n"
|
||||
"extern U_EXPORT void runDynamicPage_%.*s(int param);\n"
|
||||
" U_EXPORT void runDynamicPage_%.*s(int param)\n"
|
||||
"{\n"
|
||||
"\tU_TRACE(0, \"::runDynamicPage_%.*s(%%d)\", param)\n"
|
||||
"\t\n"
|
||||
"%s"
|
||||
"\t\n"
|
||||
"%v"
|
||||
"\tif (param)\n"
|
||||
"\t\t{\n"
|
||||
"%s"
|
||||
|
@ -747,6 +823,7 @@ loop: distance = t.getDistance();
|
|||
"%s"
|
||||
"%s"
|
||||
"%s"
|
||||
"%s"
|
||||
"\t\t}\n"
|
||||
"\t\n"
|
||||
"%v"
|
||||
|
@ -765,9 +842,8 @@ loop: distance = t.getDistance();
|
|||
basename_sz, basename_ptr,
|
||||
basename_sz, basename_ptr,
|
||||
basename_sz, basename_ptr,
|
||||
bvar ? "\n\tuint32_t usp_sz = 0;"
|
||||
"\n\tchar usp_buffer[10 * 4096];\n"
|
||||
: "",
|
||||
vars.rep,
|
||||
ptr0,
|
||||
ptr1,
|
||||
ptr2,
|
||||
ptr3,
|
||||
|
@ -791,7 +867,7 @@ loop: distance = t.getDistance();
|
|||
private:
|
||||
UTokenizer t;
|
||||
UVector<UString> vdefine;
|
||||
UString pinclude, usp, token, output0, output1, declaration, vcode, http_header;
|
||||
UString pinclude, usp, token, output0, output1, output2, declaration, vcode, http_header, sseloop, vars;
|
||||
bool bvar, bsession, bstorage, bfirst_pass, is_html, test_if_html, bpreprocessing_failed;
|
||||
|
||||
U_DISALLOW_COPY_AND_ASSIGN(Application)
|
||||
|
|
|
@ -311,7 +311,7 @@ loop:
|
|||
errno == EADDRINUSE &&
|
||||
++counter <= 3)
|
||||
{
|
||||
UTimeVal::nanosleep(1L);
|
||||
UTimeVal::nanosleep(1000L);
|
||||
|
||||
goto loop;
|
||||
}
|
||||
|
|
|
@ -271,11 +271,11 @@ loop:
|
|||
|
||||
// First create a vector out of all keys
|
||||
|
||||
uint8_t keys[20];
|
||||
UFlatBufferValue keys;
|
||||
|
||||
CreateVector(start, len, 2, true, false, (UFlatBufferValue*)keys);
|
||||
CreateVector(start, len, 2, true, false, &keys);
|
||||
|
||||
pkeys = (UFlatBufferValue*)keys;
|
||||
pkeys = &keys;
|
||||
|
||||
CreateVector(start+1, len, 2, false, false, U_NULLPTR);
|
||||
|
||||
|
|
|
@ -881,7 +881,7 @@ void UStringRep::_release()
|
|||
{
|
||||
if (_capacity != U_NOT_FOUND)
|
||||
{
|
||||
# if defined(USE_LIBTDB) || defined(USE_MONGODB)
|
||||
# if defined(USE_LIBZOPFLI) || defined(USE_LIBTDB) || defined(USE_MONGODB)
|
||||
if (_capacity == U_TO_FREE) { U_SYSCALL_VOID(free, "%p", (void*)str); }
|
||||
else
|
||||
# endif
|
||||
|
@ -1199,53 +1199,6 @@ void UString::setBuffer(uint32_t n)
|
|||
U_INTERNAL_ASSERT(invariant())
|
||||
}
|
||||
|
||||
void UString::moveToBeginDataInBuffer(uint32_t n)
|
||||
{
|
||||
U_TRACE(1, "UString::moveToBeginDataInBuffer(%u)", n)
|
||||
|
||||
U_INTERNAL_ASSERT_MAJOR(rep->_length, n)
|
||||
U_INTERNAL_ASSERT_RANGE(1, n, max_size())
|
||||
U_INTERNAL_ASSERT_MAJOR(rep->_capacity, n)
|
||||
|
||||
#if defined(DEBUG) && !defined(U_SUBSTR_INC_REF)
|
||||
U_INTERNAL_ASSERT(rep->references == 0)
|
||||
#endif
|
||||
|
||||
rep->_length -= n;
|
||||
|
||||
(void) U_SYSCALL(memmove, "%p,%p,%u", (void*)rep->str, rep->str + n, rep->_length);
|
||||
|
||||
U_INTERNAL_ASSERT(invariant())
|
||||
}
|
||||
|
||||
void UString::_reserve(UString& buffer, uint32_t n)
|
||||
{
|
||||
U_TRACE(0, "UString::_reserve(%V,%u)", buffer.rep, n)
|
||||
|
||||
UStringRep* rep = buffer.rep;
|
||||
|
||||
U_INTERNAL_DUMP("rep = %p rep->parent = %p rep->references = %u rep->child = %d rep->_length = %u rep->_capacity = %u",
|
||||
rep, rep->parent, rep->references, rep->child, rep->_length, rep->_capacity)
|
||||
|
||||
U_ASSERT(rep->space() < n)
|
||||
U_INTERNAL_ASSERT(n <= max_size())
|
||||
|
||||
uint32_t need = rep->_length + n;
|
||||
|
||||
if (need < U_CAPACITY) need = U_CAPACITY;
|
||||
else if (need > U_CAPACITY)
|
||||
{
|
||||
if (need < 2*1024*1024) need = (need * 2) + (PAGESIZE * 2);
|
||||
|
||||
need += PAGESIZE; // NB: to avoid duplication on realloc...
|
||||
}
|
||||
|
||||
buffer._set(UStringRep::create(rep->_length, need, rep->str));
|
||||
|
||||
U_INTERNAL_ASSERT(buffer.invariant())
|
||||
U_INTERNAL_ASSERT(buffer.space() >= n)
|
||||
}
|
||||
|
||||
// manage UString as memory mapped area...
|
||||
|
||||
void UString::mmap(const char* map, uint32_t len)
|
||||
|
@ -1983,7 +1936,7 @@ void UString::printKeyValue(const char* key, uint32_t keylen, const char* _data,
|
|||
n += u_buffer_len;
|
||||
}
|
||||
|
||||
if (rep->space() < n) _reserve(*this, n);
|
||||
if (rep->space() < n) _reserve(*this, rep->_length + n);
|
||||
|
||||
char* ptr = (char*)rep->str + rep->_length;
|
||||
|
||||
|
|
|
@ -115,7 +115,7 @@ bool UServices::read(int fd, UString& buffer, uint32_t count, int timeoutMS)
|
|||
|
||||
if (ncount < chunk)
|
||||
{
|
||||
UString::_reserve(buffer, chunk);
|
||||
UString::_reserve(buffer, buffer.getReserveNeed(chunk));
|
||||
|
||||
ncount = buffer.space();
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ read:
|
|||
|
||||
// NB: may be there are available more bytes to read...
|
||||
|
||||
UString::_reserve(buffer, ncount * 2);
|
||||
UString::_reserve(buffer, buffer.getReserveNeed(ncount * 2));
|
||||
|
||||
ptr = buffer.c_pointer(start);
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ bool USocketExt::read(USocket* sk, UString& buffer, uint32_t count, int timeoutM
|
|||
if (UNLIKELY(ncount < chunk))
|
||||
{
|
||||
if (sk == UServer_Base::csocket) UClientImage_Base::manageReadBufferResize(chunk);
|
||||
else UString::_reserve(buffer, chunk);
|
||||
else UString::_reserve(buffer, buffer.getReserveNeed(chunk));
|
||||
|
||||
ncount = buffer.space();
|
||||
}
|
||||
|
@ -193,7 +193,7 @@ error: U_INTERNAL_DUMP("errno = %d", errno)
|
|||
buffer.rep->_length = start + byte_read;
|
||||
|
||||
if (sk == UServer_Base::csocket) UClientImage_Base::manageReadBufferResize(ncount * 2);
|
||||
else UString::_reserve(buffer, ncount * 2);
|
||||
else UString::_reserve(buffer, buffer.getReserveNeed(ncount * 2));
|
||||
|
||||
ptr = buffer.c_pointer(start);
|
||||
ncount = buffer.space();
|
||||
|
|
|
@ -36,6 +36,10 @@
|
|||
# include <pwd.h>
|
||||
#endif
|
||||
|
||||
#ifndef U_LOG_DISABLE
|
||||
const char* UStringExt::deflate_agent = "gzip";
|
||||
#endif
|
||||
|
||||
#ifdef USE_LIBSSL
|
||||
UString UStringExt::BIOtoString(BIO* bio)
|
||||
{
|
||||
|
@ -256,7 +260,7 @@ UString UStringExt::substitute(const char* s, uint32_t n, const char* a, uint32_
|
|||
|
||||
if (x.space() < len2)
|
||||
{
|
||||
UString::_reserve(x, len2);
|
||||
UString::_reserve(x, x.rep->_length + len2);
|
||||
|
||||
p2 = x.pend();
|
||||
}
|
||||
|
@ -290,7 +294,7 @@ UString UStringExt::substitute(const char* s, uint32_t n, const char* a, uint32_
|
|||
if (breserve &&
|
||||
x.space() < n)
|
||||
{
|
||||
UString::_reserve(x, n);
|
||||
UString::_reserve(x, x.rep->_length + n);
|
||||
|
||||
p2 = x.pend();
|
||||
}
|
||||
|
@ -428,7 +432,7 @@ found:
|
|||
|
||||
if (x.space() < len2)
|
||||
{
|
||||
UString::_reserve(x, len2);
|
||||
UString::_reserve(x, x.rep->_length + len2);
|
||||
|
||||
p2 = x.pend();
|
||||
}
|
||||
|
@ -464,7 +468,7 @@ found:
|
|||
if (breserve &&
|
||||
x.space() < len)
|
||||
{
|
||||
UString::_reserve(x, len);
|
||||
UString::_reserve(x, x.rep->_length + len);
|
||||
|
||||
p2 = x.pend();
|
||||
}
|
||||
|
@ -550,7 +554,7 @@ loop:
|
|||
|
||||
if (x.space() < len2)
|
||||
{
|
||||
UString::_reserve(x, len2);
|
||||
UString::_reserve(x, x.rep->_length + len2);
|
||||
|
||||
p2 = x.pend();
|
||||
}
|
||||
|
@ -583,7 +587,7 @@ loop:
|
|||
if (breserve &&
|
||||
x.space() < len)
|
||||
{
|
||||
UString::_reserve(x, len);
|
||||
UString::_reserve(x, x.rep->_length + len);
|
||||
|
||||
p2 = x.pend();
|
||||
}
|
||||
|
@ -1572,42 +1576,15 @@ UString UStringExt::brotli(const char* s, uint32_t len, uint32_t quality, uint32
|
|||
{
|
||||
U_TRACE(1, "UStringExt::brotli(%.*S,%u,%u,%u,%u)", len, s, len, quality, mode, lgwin)
|
||||
|
||||
int rc;
|
||||
size_t sz = U_SYSCALL(BrotliEncoderMaxCompressedSize, "%u", len); /* Get an estimation about the output buffer... */
|
||||
|
||||
if (sz == 0) return UString::getStringNull();
|
||||
|
||||
if (UFile::isAllocableFromPool(sz))
|
||||
{
|
||||
rc = U_SYSCALL(BrotliEncoderCompress, "%u,%u,%u,%u,%p,%p,%p", quality, lgwin, (BrotliEncoderMode)mode, (size_t)len, (uint8_t*)s, &sz, (uint8_t*)UFile::pfree);
|
||||
UString result;
|
||||
bool bpool = UFile::isAllocableFromPool(sz);
|
||||
char* ptr = (bpool ? (result.setConstant(UFile::pfree, sz), UFile::pfree) : (UString::_reserve(result, sz), result.data()));
|
||||
|
||||
ratio = (sz * 100U) / len;
|
||||
|
||||
U_INTERNAL_DUMP("BrotliEncoderCompress() = %d ratio = %u (%u%%)", rc, ratio, 100-ratio)
|
||||
|
||||
if (rc == 0 ||
|
||||
ratio > ratio_threshold)
|
||||
{
|
||||
return UString::getStringNull();
|
||||
}
|
||||
|
||||
U_INTERNAL_DUMP("BrotliEncoderCompress() = %#.4S", UFile::pfree)
|
||||
|
||||
len = UFile::getSizeAligned(sz);
|
||||
|
||||
UString result(sz, len, UFile::pfree);
|
||||
|
||||
UFile::pfree += len;
|
||||
UFile::nfree -= len;
|
||||
|
||||
// U_INTERNAL_ASSERT(isBrotli(result)) // check magic byte
|
||||
|
||||
U_RETURN_STRING(result);
|
||||
}
|
||||
|
||||
UString r(sz);
|
||||
|
||||
rc = U_SYSCALL(BrotliEncoderCompress, "%u,%u,%u,%u,%p,%p,%p", quality, lgwin, (BrotliEncoderMode)mode, (size_t)len, (uint8_t*)s, &sz, (uint8_t*)r.data());
|
||||
int rc = U_SYSCALL(BrotliEncoderCompress, "%u,%u,%u,%u,%p,%p,%p", quality, lgwin, (BrotliEncoderMode)mode, (size_t)len, (uint8_t*)s, &sz, (uint8_t*)ptr);
|
||||
|
||||
ratio = (sz * 100U) / len;
|
||||
|
||||
|
@ -1619,13 +1596,19 @@ UString UStringExt::brotli(const char* s, uint32_t len, uint32_t quality, uint32
|
|||
return UString::getStringNull();
|
||||
}
|
||||
|
||||
U_INTERNAL_DUMP("BrotliEncoderCompress() = %#.4S", r.data())
|
||||
result.rep->_length = sz;
|
||||
|
||||
r.rep->_length = sz;
|
||||
if (bpool)
|
||||
{
|
||||
len = UFile::getSizeAligned(sz);
|
||||
|
||||
// U_INTERNAL_ASSERT(isBrotli(r)) // check magic byte
|
||||
UFile::pfree += len;
|
||||
UFile::nfree -= len;
|
||||
}
|
||||
|
||||
U_RETURN_STRING(r);
|
||||
// U_INTERNAL_ASSERT(isBrotli(result)) // check magic byte
|
||||
|
||||
U_RETURN_STRING(result);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1673,77 +1656,77 @@ UString UStringExt::deflate(const char* s, uint32_t len, uint32_t quality) // .g
|
|||
{
|
||||
U_TRACE(1, "UStringExt::deflate(%.*S,%u,%u)", len, s, len, quality)
|
||||
|
||||
// The zlib documentation states that destination buffer size must be at least 0.1% larger than avail_in plus 12 bytes
|
||||
|
||||
uint32_t sz = len + (len / 10) + 12U;
|
||||
|
||||
if (UFile::isAllocableFromPool(sz))
|
||||
#ifdef USE_LIBZOPFLI
|
||||
if (quality == 0)
|
||||
{
|
||||
# ifdef USE_LIBZOPFLI
|
||||
if (quality == 0)
|
||||
{
|
||||
size_t outsize = 0;
|
||||
ZopfliOptions options;
|
||||
unsigned char* out = U_NULLPTR;
|
||||
size_t outsize = 0;
|
||||
ZopfliOptions options;
|
||||
unsigned char* out = U_NULLPTR;
|
||||
|
||||
U_SYSCALL_VOID(ZopfliInitOptions, "%p", &options);
|
||||
|
||||
U_SYSCALL_VOID(ZopfliCompress, "%p,%d,%p,%u,%p,%p", &options, ZOPFLI_FORMAT_GZIP, (unsigned char*)s, (size_t)len, &out, &outsize);
|
||||
|
||||
ratio = (outsize * 100U) / len;
|
||||
|
||||
U_INTERNAL_DUMP("ZopfliCompress(%u) = %u ratio = %u (%u%%)", len, outsize, ratio, 100-ratio)
|
||||
|
||||
if (ratio > ratio_threshold) return UString::getStringNull();
|
||||
|
||||
U_MEMCPY(UFile::pfree, out, sz = outsize);
|
||||
|
||||
U_SYSCALL_VOID(free, "%p", out);
|
||||
}
|
||||
else
|
||||
# ifndef U_LOG_DISABLE
|
||||
deflate_agent = "zopfli";
|
||||
# endif
|
||||
{
|
||||
sz = u_gz_deflate(s, len, UFile::pfree, (quality ? quality : Z_BEST_COMPRESSION));
|
||||
|
||||
ratio = (sz * 100U) / len;
|
||||
U_SYSCALL_VOID(ZopfliInitOptions, "%p", &options);
|
||||
|
||||
U_INTERNAL_DUMP("u_gz_deflate(%u) = %u ratio = %u (%u%%)", len, sz, ratio, 100-ratio)
|
||||
U_SYSCALL_VOID(ZopfliCompress, "%p,%d,%p,%u,%p,%p", &options, ZOPFLI_FORMAT_GZIP, (unsigned char*)s, (size_t)len, &out, &outsize);
|
||||
|
||||
if (ratio > ratio_threshold) return UString::getStringNull();
|
||||
ratio = (outsize * 100U) / len;
|
||||
|
||||
U_INTERNAL_DUMP("ZopfliCompress(%u) = %u ratio = %u (%u%%)", len, outsize, ratio, 100-ratio)
|
||||
|
||||
if (ratio > ratio_threshold)
|
||||
{
|
||||
U_SYSCALL_VOID(free, "%p", out);
|
||||
|
||||
return UString::getStringNull();
|
||||
}
|
||||
|
||||
UString str((const char*)out, outsize);
|
||||
|
||||
str.rep->_capacity = U_TO_FREE;
|
||||
|
||||
U_RETURN_STRING(str);
|
||||
}
|
||||
#endif
|
||||
|
||||
UString result(sz, len = UFile::getSizeAligned(sz), UFile::pfree);
|
||||
UString result;
|
||||
uint32_t sz = len + (len / 10) + 12U; // The zlib documentation states that destination buffer size must be at least 0.1% larger than avail_in plus 12 bytes
|
||||
bool bpool = UFile::isAllocableFromPool(sz);
|
||||
char* ptr = (bpool ? (result.setConstant(UFile::pfree, sz), UFile::pfree) : (UString::_reserve(result, sz), result.data()));
|
||||
|
||||
UFile::pfree += len;
|
||||
UFile::nfree -= len;
|
||||
#ifndef U_LOG_DISABLE
|
||||
deflate_agent = "gzip";
|
||||
#endif
|
||||
|
||||
U_INTERNAL_ASSERT(isGzip(result)) // check magic byte
|
||||
ratio = ((sz = u_gz_deflate(s, len, ptr, (quality ? quality : Z_BEST_COMPRESSION))) * 100U) / len;
|
||||
|
||||
U_RETURN_STRING(result);
|
||||
}
|
||||
|
||||
UString r(sz);
|
||||
|
||||
r.rep->_length = u_gz_deflate(s, len, r.rep->data(), (quality ? quality : Z_BEST_COMPRESSION));
|
||||
|
||||
ratio = (r.rep->_length * 100U) / len;
|
||||
|
||||
U_INTERNAL_DUMP("u_gz_deflate(%u) = %u ratio = %u (%u%%)", len, r.rep->_length, ratio, 100-ratio)
|
||||
U_INTERNAL_DUMP("u_gz_deflate(%u) = %u ratio = %u (%u%%)", len, sz, ratio, 100-ratio)
|
||||
|
||||
if (ratio > ratio_threshold) return UString::getStringNull();
|
||||
|
||||
result.rep->_length = sz;
|
||||
|
||||
if (bpool)
|
||||
{
|
||||
len = UFile::getSizeAligned(sz);
|
||||
|
||||
UFile::pfree += len;
|
||||
UFile::nfree -= len;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
uint32_t* psize_original = (uint32_t*)r.c_pointer(r.size() - 4);
|
||||
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
uint32_t* psize_original = (uint32_t*)result.c_pointer(sz - 4);
|
||||
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
U_INTERNAL_DUMP("size original = %u (LE)", *psize_original)
|
||||
# else
|
||||
# else
|
||||
U_INTERNAL_DUMP("size original = %u (BE)", u_invert32(*psize_original))
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
U_INTERNAL_ASSERT(isGzip(r)) // check magic byte
|
||||
U_INTERNAL_ASSERT(isGzip(result)) // check magic byte
|
||||
|
||||
U_RETURN_STRING(r);
|
||||
U_RETURN_STRING(result);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1827,7 +1810,7 @@ next:
|
|||
|
||||
do { ++ptr_header_value; } while (u__isspace(*ptr_header_value));
|
||||
|
||||
U_INTERNAL_DUMP("ptr_header_value = %.*S", 20, ptr_header_value)
|
||||
U_INTERNAL_DUMP("ptr_header_value = %.20S", ptr_header_value)
|
||||
|
||||
return ptr_header_value;
|
||||
}
|
||||
|
|
|
@ -122,6 +122,7 @@ UModProxyService* UHTTP::service;
|
|||
UVector<UString>* UHTTP::vmsg_error;
|
||||
UVector<UString>* UHTTP::form_name_value;
|
||||
UHashMap<UString>* UHTTP::prequestHeader;
|
||||
UHTTP::UServletPage* UHTTP::usp;
|
||||
UVector<UModProxyService*>* UHTTP::vservice;
|
||||
UVector<UHTTP::UServletPage*>* UHTTP::vusp;
|
||||
URDBObjectHandler<UDataStorage*>* UHTTP::db_session;
|
||||
|
@ -167,6 +168,9 @@ USSLSession* UHTTP::data_session_ssl;
|
|||
UVector<UIPAllow*>* UHTTP::vallow_IP;
|
||||
URDBObjectHandler<UDataStorage*>* UHTTP::db_session_ssl;
|
||||
#endif
|
||||
#ifdef U_SSE_ENABLE // SERVER SENT EVENTS (SSE)
|
||||
bool UHTTP::bsse;
|
||||
#endif
|
||||
#ifdef USE_LOAD_BALANCE
|
||||
UClient<USSLSocket>* UHTTP::client_http;
|
||||
#endif
|
||||
|
@ -4453,14 +4457,14 @@ file_in_cache:
|
|||
# endif
|
||||
{
|
||||
# ifndef U_COVERITY_FALSE_POSITIVE // FORWARD_NULL
|
||||
UServletPage* usp = (UServletPage*)file_data->ptr;
|
||||
usp = (UServletPage*)file_data->ptr;
|
||||
|
||||
U_INTERNAL_ASSERT_POINTER(usp)
|
||||
U_INTERNAL_ASSERT_POINTER(usp->runDynamicPage)
|
||||
|
||||
U_SET_MODULE_NAME(usp);
|
||||
|
||||
U_DUMP("U_http_info.nResponseCode = %u", U_http_info.nResponseCode)
|
||||
U_INTERNAL_DUMP("U_http_info.nResponseCode = %u", U_http_info.nResponseCode)
|
||||
|
||||
usp->runDynamicPage(0);
|
||||
# endif
|
||||
|
@ -4819,7 +4823,7 @@ U_NO_EXPORT inline bool UHTTP::compress(const UString& body)
|
|||
|
||||
ext->rep->_length = U_CONSTANT_SIZE("Content-Encoding: gzip\r\n");
|
||||
|
||||
U_SRV_LOG("dynamic response: %u bytes - (%u%%) gzip compression ratio", UClientImage_Base::body->size(), 100-UStringExt::ratio);
|
||||
U_SRV_LOG("dynamic response: %u bytes - (%u%%) %s compression ratio", UClientImage_Base::body->size(), 100-UStringExt::ratio, UStringExt::deflate_agent);
|
||||
|
||||
U_RETURN(true);
|
||||
}
|
||||
|
@ -5307,6 +5311,33 @@ void UHTTP::setEndRequestProcessing()
|
|||
U_INTERNAL_DUMP("U_ClientImage_request = %b U_http_info.nResponseCode = %u U_ClientImage_request_is_cached = %b U_http_info.startHeader = %u",
|
||||
U_ClientImage_request, U_http_info.nResponseCode, U_ClientImage_request_is_cached, U_http_info.startHeader)
|
||||
|
||||
#ifdef U_SSE_ENABLE
|
||||
U_INTERNAL_DUMP("bsse = %b", bsse)
|
||||
|
||||
if (bsse)
|
||||
{
|
||||
U_INTERNAL_DUMP("Accept: = %.*S", U_HTTP_ACCEPT_TO_TRACE)
|
||||
|
||||
U_INTERNAL_ASSERT_EQUALS(u_get_unalignedp64(U_http_info.accept+8), U_MULTICHAR_CONSTANT64('n','t','-','s','t','r','e','a'))
|
||||
|
||||
if (UServer_Base::startParallelization())
|
||||
{
|
||||
// parent
|
||||
|
||||
bsse = false;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
U_INTERNAL_ASSERT_POINTER(usp)
|
||||
U_INTERNAL_ASSERT_POINTER(usp->runDynamicPage)
|
||||
|
||||
U_SET_MODULE_NAME(sse);
|
||||
|
||||
usp->runDynamicPage(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef U_CACHE_REQUEST_DISABLE
|
||||
if (isGETorHEAD() &&
|
||||
UClientImage_Base::isRequestCacheable() &&
|
||||
|
@ -7097,6 +7128,19 @@ void UHTTP::setDynamicResponse()
|
|||
}
|
||||
# endif
|
||||
|
||||
# ifdef U_SSE_ENABLE
|
||||
U_INTERNAL_DUMP("bsse = %b", bsse)
|
||||
|
||||
if (bsse)
|
||||
{
|
||||
*ext = *UClientImage_Base::wbuffer;
|
||||
|
||||
handlerResponse();
|
||||
|
||||
return;
|
||||
}
|
||||
# endif
|
||||
|
||||
if (bcompress == false)
|
||||
{
|
||||
(void) UClientImage_Base::body->replace(pEndHeader + U_http_info.endHeader, clength);
|
||||
|
@ -7217,7 +7261,7 @@ U_NO_EXPORT bool UHTTP::processAuthorization(const char* request, uint32_t sz, c
|
|||
const char* ptr;
|
||||
uint32_t pos = 0;
|
||||
bool result = false, bpass = false;
|
||||
UString buffer(100U), fpasswd, content, tmp;
|
||||
UString buffer(U_CAPACITY), fpasswd, content, tmp;
|
||||
|
||||
if (pattern)
|
||||
{
|
||||
|
@ -7267,8 +7311,12 @@ U_NO_EXPORT bool UHTTP::processAuthorization(const char* request, uint32_t sz, c
|
|||
|
||||
ptr = getHeaderValuePtr(U_CONSTANT_TO_PARAM("Authorization"), false);
|
||||
|
||||
U_INTERNAL_DUMP("ptr = %p", ptr)
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
U_INTERNAL_DUMP("ptr = %.20S", ptr)
|
||||
|
||||
if (digest_authentication)
|
||||
{
|
||||
if (u_get_unalignedp32(ptr) != U_MULTICHAR_CONSTANT32('D','i','g','e')) goto end;
|
||||
|
@ -7465,10 +7513,8 @@ U_NO_EXPORT bool UHTTP::processAuthorization(const char* request, uint32_t sz, c
|
|||
|
||||
result = (ha3 == response);
|
||||
}
|
||||
else
|
||||
else if (content.size() < 1000) // Authorization: Basic cy5jYXNhenphOnN0ZWZhbm8x==
|
||||
{
|
||||
// Authorization: Basic cy5jYXNhenphOnN0ZWZhbm8x==
|
||||
|
||||
UBase64::decode(content, buffer);
|
||||
|
||||
if (buffer)
|
||||
|
@ -7476,12 +7522,12 @@ U_NO_EXPORT bool UHTTP::processAuthorization(const char* request, uint32_t sz, c
|
|||
t.setData(buffer);
|
||||
t.setDelimiter(":");
|
||||
|
||||
UString password(100U);
|
||||
UString password(1000U);
|
||||
|
||||
if (t.next(*user_authentication, (bool*)U_NULLPTR) &&
|
||||
t.next(password, (bool*)U_NULLPTR))
|
||||
{
|
||||
UString line(100U), output(100U);
|
||||
UString line(1000U), output(1000U);
|
||||
|
||||
UServices::generateDigest(U_HASH_SHA1, 0, password, output, true);
|
||||
|
||||
|
@ -8240,7 +8286,7 @@ next:
|
|||
}
|
||||
#endif
|
||||
|
||||
U_SRV_LOG("File cached: %V - %u bytes - compression ratio (gzip %u%%, brotli %u%%)", pathname->rep, file_data->size, 100-ratio1, 100-ratio2);
|
||||
U_SRV_LOG("File cached: %V - %u bytes - compression ratio (%s %u%%, brotli %u%%)", pathname->rep, file_data->size, UStringExt::deflate_agent, 100-ratio1, 100-ratio2);
|
||||
}
|
||||
|
||||
void UHTTP::checkFileForCache()
|
||||
|
@ -8611,9 +8657,9 @@ U_NO_EXPORT void UHTTP::manageDataForCache(const UString& basename, const UStrin
|
|||
|
||||
struct stat st;
|
||||
char buffer[U_PATH_MAX];
|
||||
UServletPage* usp = getUSP(basename_ptr, name_len);
|
||||
bool usp_found = getUSP(basename_ptr, name_len);
|
||||
|
||||
if (usp)
|
||||
if (usp_found)
|
||||
{
|
||||
if (usp_dll &&
|
||||
usp->isPath(file_ptr, len) == false)
|
||||
|
@ -8639,7 +8685,7 @@ U_NO_EXPORT void UHTTP::manageDataForCache(const UString& basename, const UStrin
|
|||
if (compileUSP(file_ptr, len) == false) goto error;
|
||||
}
|
||||
|
||||
if (usp == U_NULLPTR)
|
||||
if (usp_found == false)
|
||||
{
|
||||
U_NEW(UHTTP::UServletPage, usp, UHTTP::UServletPage(file_ptr, len, basename_ptr, name_len));
|
||||
}
|
||||
|
@ -11207,9 +11253,10 @@ bool UHTTP::checkIfSourceHasChangedAndCompileUSP()
|
|||
#if defined(DEBUG) && !defined(U_STATIC_ONLY)
|
||||
UString suffix = file->getSuffix();
|
||||
const char* ptr = file->getPathRelativ();
|
||||
UServletPage* usp = (UServletPage*)file_data->ptr;
|
||||
uint32_t len = file->getPathRelativLen()-suffix.size()-1; // NB: we must avoid the point '.' before the suffix...
|
||||
|
||||
usp = (UServletPage*)file_data->ptr;
|
||||
|
||||
U_INTERNAL_DUMP("pathname = %V file = %.*S suffix = %V usp = %p", pathname->rep, U_FILE_TO_TRACE(*file), suffix.rep, usp)
|
||||
|
||||
if (suffix.empty())
|
||||
|
@ -11259,7 +11306,7 @@ err: setInternalError();
|
|||
U_RETURN(true);
|
||||
}
|
||||
|
||||
UHTTP::UServletPage* UHTTP::getUSP(const char* key, uint32_t key_len)
|
||||
bool UHTTP::getUSP(const char* key, uint32_t key_len)
|
||||
{
|
||||
U_TRACE(0+256, "UHTTP::getUSP(%.*S,%u)", key_len, key, key_len)
|
||||
|
||||
|
@ -11267,10 +11314,9 @@ UHTTP::UServletPage* UHTTP::getUSP(const char* key, uint32_t key_len)
|
|||
U_INTERNAL_ASSERT_POINTER(vusp)
|
||||
U_INTERNAL_ASSERT_MAJOR(key_len, 0)
|
||||
|
||||
UServletPage* usp;
|
||||
int32_t high = vusp->size();
|
||||
int32_t high;
|
||||
|
||||
if (high == 0) U_RETURN_POINTER(U_NULLPTR, UHTTP::UServletPage);
|
||||
if ((high = vusp->size()) == 0) U_RETURN(false);
|
||||
|
||||
U_INTERNAL_DUMP("bcallInitForAllUSP = %b", bcallInitForAllUSP)
|
||||
|
||||
|
@ -11286,11 +11332,11 @@ UHTTP::UServletPage* UHTTP::getUSP(const char* key, uint32_t key_len)
|
|||
{
|
||||
U_INTERNAL_DUMP("USP found(%u) = %V", i, usp->basename.rep)
|
||||
|
||||
U_RETURN_POINTER(usp, UHTTP::UServletPage);
|
||||
U_RETURN(true);
|
||||
}
|
||||
}
|
||||
|
||||
U_RETURN_POINTER(U_NULLPTR, UHTTP::UServletPage);
|
||||
U_RETURN(false);
|
||||
}
|
||||
|
||||
UString x;
|
||||
|
@ -11319,7 +11365,7 @@ UHTTP::UServletPage* UHTTP::getUSP(const char* key, uint32_t key_len)
|
|||
if (low == -1 ||
|
||||
vusp->at(low)->basename.equal(key, key_len) == false)
|
||||
{
|
||||
U_RETURN_POINTER(U_NULLPTR, UHTTP::UServletPage);
|
||||
U_RETURN(false);
|
||||
}
|
||||
|
||||
probe = low;
|
||||
|
@ -11329,7 +11375,7 @@ found:
|
|||
|
||||
U_INTERNAL_DUMP("USP found(%u) = %V", probe, usp->basename.rep)
|
||||
|
||||
U_RETURN_POINTER(usp, UHTTP::UServletPage);
|
||||
U_RETURN(true);
|
||||
}
|
||||
|
||||
bool UHTTP::checkForUSP()
|
||||
|
@ -11343,10 +11389,8 @@ bool UHTTP::checkForUSP()
|
|||
if (u_get_unalignedp16(ptr) == U_MULTICHAR_CONSTANT16(' ','/'))
|
||||
{
|
||||
static uint32_t old_sz;
|
||||
static UServletPage* old_usp;
|
||||
|
||||
uint32_t sz;
|
||||
UServletPage* usp;
|
||||
unsigned char* ptr1 = (ptr += 2);
|
||||
|
||||
loop: while (u__isalpha(*++ptr1)) {}
|
||||
|
@ -11359,45 +11403,38 @@ loop: while (u__isalpha(*++ptr1)) {}
|
|||
|
||||
if (sz == old_sz)
|
||||
{
|
||||
U_ASSERT(old_usp->basename.equal((const char*)ptr, sz))
|
||||
|
||||
usp = old_usp;
|
||||
U_ASSERT(usp->basename.equal((const char*)ptr, sz))
|
||||
|
||||
goto next;
|
||||
}
|
||||
|
||||
if (u_get_unalignedp64(ptr) != U_MULTICHAR_CONSTANT64('p','l','a','i','n','t','e','x'))
|
||||
if (u_get_unalignedp64(ptr) != U_MULTICHAR_CONSTANT64('p','l','a','i','n','t','e','x') &&
|
||||
getUSP((const char*)ptr, sz))
|
||||
{
|
||||
usp = getUSP((const char*)ptr, sz);
|
||||
old_sz = sz;
|
||||
|
||||
if (usp)
|
||||
next: if (*ptr1 == '?')
|
||||
{
|
||||
old_sz = sz;
|
||||
old_usp = usp;
|
||||
U_http_info.query = (const char*)(ptr1 += U_CONSTANT_SIZE("?queries"));
|
||||
|
||||
next: if (*ptr1 == '?')
|
||||
{
|
||||
U_http_info.query = (const char*)(ptr1 += U_CONSTANT_SIZE("?queries"));
|
||||
while (*++ptr1 != ' ') {}
|
||||
|
||||
while (*++ptr1 != ' ') {}
|
||||
U_http_info.query_len = (const char*)ptr1 - U_http_info.query;
|
||||
|
||||
U_http_info.query_len = (const char*)ptr1 - U_http_info.query;
|
||||
|
||||
U_INTERNAL_DUMP("query = %.*S", U_HTTP_QUERY_TO_TRACE)
|
||||
}
|
||||
|
||||
U_http_content_type_len = 0;
|
||||
|
||||
U_http_info.nResponseCode = HTTP_OK;
|
||||
|
||||
usp->runDynamicPage(0);
|
||||
|
||||
setDynamicResponse();
|
||||
|
||||
(void) UServer_Base::pClientImage->writeResponse();
|
||||
|
||||
U_RETURN(true);
|
||||
U_INTERNAL_DUMP("query = %.*S", U_HTTP_QUERY_TO_TRACE)
|
||||
}
|
||||
|
||||
U_http_content_type_len = 0;
|
||||
|
||||
U_http_info.nResponseCode = HTTP_OK;
|
||||
|
||||
usp->runDynamicPage(0);
|
||||
|
||||
setDynamicResponse();
|
||||
|
||||
(void) UServer_Base::pClientImage->writeResponse();
|
||||
|
||||
U_RETURN(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11410,8 +11447,6 @@ void UHTTP::callInitForAllUSP()
|
|||
|
||||
U_INTERNAL_ASSERT_POINTER(vusp)
|
||||
|
||||
UServletPage* usp;
|
||||
|
||||
for (uint32_t i = 0, n = vusp->size(); i < n; ++i)
|
||||
{
|
||||
usp = vusp->at(i);
|
||||
|
@ -11431,8 +11466,6 @@ void UHTTP::callEndForAllUSP()
|
|||
U_INTERNAL_ASSERT_POINTER(vusp)
|
||||
U_INTERNAL_ASSERT(bcallInitForAllUSP)
|
||||
|
||||
UServletPage* usp;
|
||||
|
||||
for (uint32_t i = 0, n = vusp->size(); i < n; ++i)
|
||||
{
|
||||
usp = vusp->at(i);
|
||||
|
@ -11452,8 +11485,6 @@ void UHTTP::callSigHUPForAllUSP()
|
|||
U_INTERNAL_ASSERT_POINTER(vusp)
|
||||
U_INTERNAL_ASSERT(bcallInitForAllUSP)
|
||||
|
||||
UServletPage* usp;
|
||||
|
||||
for (uint32_t i = 0, n = vusp->size(); i < n; ++i)
|
||||
{
|
||||
usp = vusp->at(i);
|
||||
|
@ -11473,8 +11504,6 @@ void UHTTP::callAfterForkForAllUSP()
|
|||
U_INTERNAL_ASSERT_POINTER(vusp)
|
||||
U_INTERNAL_ASSERT(bcallInitForAllUSP)
|
||||
|
||||
UServletPage* usp;
|
||||
|
||||
for (uint32_t i = 0, n = vusp->size(); i < n; ++i)
|
||||
{
|
||||
usp = vusp->at(i);
|
||||
|
|
|
@ -4,7 +4,7 @@ MAINTAINERCLEANFILES = Makefile.in
|
|||
|
||||
DEFAULT_INCLUDES = -I. -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/examples/http_header/include
|
||||
|
||||
EXTRA_DIST = inp ok CA CSP LCSP TSA RSIGN XAdES nocat wi-auth WAGSM RA IR/WEB IR/benchmark IR/doc_dir *.cfg .htpasswd .htdigest python \
|
||||
EXTRA_DIST = inp ok CA CSP LCSP TSA RSIGN XAdES nocat wi-auth WAGSM RA IR/WEB IR/benchmark IR/doc_dir *.cfg .htpasswd .htdigest python sse_example \
|
||||
*.properties *.test *.sh error_msg workflow doc_parse robots.txt alias.txt throttling.txt css js benchmark websocket docroot php.sh test_http_parser.h
|
||||
|
||||
## DEFS = -DU_TEST @DEFS@
|
||||
|
|
|
@ -624,7 +624,7 @@ top_builddir = @top_builddir@
|
|||
top_srcdir = @top_srcdir@
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
DEFAULT_INCLUDES = -I. -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/examples/http_header/include
|
||||
EXTRA_DIST = inp ok CA CSP LCSP TSA RSIGN XAdES nocat wi-auth WAGSM RA IR/WEB IR/benchmark IR/doc_dir *.cfg .htpasswd .htdigest python \
|
||||
EXTRA_DIST = inp ok CA CSP LCSP TSA RSIGN XAdES nocat wi-auth WAGSM RA IR/WEB IR/benchmark IR/doc_dir *.cfg .htpasswd .htdigest python sse_example \
|
||||
*.properties *.test *.sh error_msg workflow doc_parse robots.txt alias.txt throttling.txt css js benchmark websocket docroot php.sh test_http_parser.h
|
||||
|
||||
TESTS = client_server.test test_manager.test IR.test web_server.test \
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 318 B |
Binary file not shown.
Before Width: | Height: | Size: 318 B |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
27
tests/examples/sse_example/get_ticker.usp
Normal file
27
tests/examples/sse_example/get_ticker.usp
Normal file
|
@ -0,0 +1,27 @@
|
|||
<!--#declaration
|
||||
static uint32_t counter;
|
||||
|
||||
static UString getPrice()
|
||||
{
|
||||
U_TRACE_NO_PARAM(5, "::getPrice()")
|
||||
|
||||
static double price = 1.2;
|
||||
|
||||
if (counter++)
|
||||
{
|
||||
price = price + (double)rand() / RAND_MAX * 2.0 - 1;
|
||||
|
||||
if (price <= 0.01) price = 0.01;
|
||||
}
|
||||
|
||||
UString x = UStringExt::numberToString(price);
|
||||
|
||||
U_RETURN_STRING(x);
|
||||
}
|
||||
-->
|
||||
<!--#ssecode
|
||||
UHTTP::writeSSE(1, getPrice());
|
||||
-->
|
||||
<!--#sseloop:5
|
||||
UHTTP::sendSSE(counter, getPrice());
|
||||
-->
|
25
tests/examples/sse_example/index.html
Normal file
25
tests/examples/sse_example/index.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<script type="text/javascript" src="jquery.min.js"></script>
|
||||
<title>SSE example</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Stock Price</h1>
|
||||
<script type="text/javascript">
|
||||
|
||||
function read_data() {
|
||||
var stream = new EventSource('/get_ticker');
|
||||
stream.onmessage = function(e){
|
||||
document.getElementById('price').innerHTML=e.data;
|
||||
};
|
||||
|
||||
stream.onerror = function(e){
|
||||
console.log(e);
|
||||
};
|
||||
}
|
||||
|
||||
read_data();
|
||||
</script>
|
||||
<p>Price: <span id="price"></span></p>
|
||||
</body>
|
4
tests/examples/sse_example/jquery.min.js
vendored
Normal file
4
tests/examples/sse_example/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
@ -4,8 +4,9 @@
|
|||
|
||||
(cd benchmark; rm -f db; creat_link FrameworkBenchmarks/ULib/db db)
|
||||
|
||||
DOC_ROOT=sse_example
|
||||
#DOC_ROOT=ruby/blog
|
||||
DOC_ROOT=benchmark/docroot
|
||||
#DOC_ROOT=benchmark/docroot
|
||||
|
||||
rm -f tmp/usp_compile.sh.err /tmp/*.hpack.* \
|
||||
$DOC_ROOT/web_server.log* \
|
||||
|
@ -66,7 +67,7 @@ userver {
|
|||
#LOAD_BALANCE_CLUSTER 10.30.0.1,10.30.0.2
|
||||
#LOAD_BALANCE_DEVICE_NETWORK enp0s20u1
|
||||
#LOAD_BALANCE_LOADAVG_THRESHOLD 4.0
|
||||
#PREFORK_CHILD 0
|
||||
PREFORK_CHILD 0
|
||||
#CRASH_COUNT 1
|
||||
#CRASH_EMAIL_NOTIFY mail.unirel.com:stefano.casazza@unirel.com
|
||||
#DOS_SITE_COUNT 1
|
||||
|
@ -75,14 +76,17 @@ userver {
|
|||
#REQ_TIMEOUT 300
|
||||
#PLUGIN "ssi http"
|
||||
#ORM_DRIVER "sqlite mysql"
|
||||
ORM_DRIVER sqlite
|
||||
#ORM_DRIVER sqlite
|
||||
DOCUMENT_ROOT sse_example
|
||||
PLUGIN_DIR ../../../src/ulib/net/server/plugin/.libs
|
||||
ORM_DRIVER_DIR ../../../src/ulib/orm/driver/.libs
|
||||
#DOCUMENT_ROOT docroot
|
||||
#PLUGIN_DIR ../../../src/ulib/net/server/plugin/.libs
|
||||
#ORM_DRIVER_DIR ../../../src/ulib/orm/driver/.libs
|
||||
#DOCUMENT_ROOT JONATHAN/docroot
|
||||
DOCUMENT_ROOT benchmark/docroot
|
||||
PLUGIN_DIR ../../../../src/ulib/net/server/plugin/.libs
|
||||
ORM_DRIVER_DIR ../../../../src/ulib/orm/driver/.libs
|
||||
#DOCUMENT_ROOT benchmark/docroot
|
||||
#PLUGIN_DIR ../../../../src/ulib/net/server/plugin/.libs
|
||||
#ORM_DRIVER_DIR ../../../../src/ulib/orm/driver/.libs
|
||||
#DOCUMENT_ROOT .
|
||||
#PLUGIN_DIR ../../src/ulib/net/server/plugin/.libs
|
||||
#ORM_DRIVER_DIR ../../src/ulib/orm/driver/.libs
|
||||
|
@ -101,7 +105,7 @@ http {
|
|||
REQUEST_READ_TIMEOUT 30
|
||||
APACHE_LIKE_LOG /var/log/httpd/access_log
|
||||
LOG_FILE_SZ 10M
|
||||
#DIGEST_AUTHENTICATION yes
|
||||
DIGEST_AUTHENTICATION no
|
||||
#CACHE_FILE_STORE nocat/webif.gz
|
||||
#CACHE_FILE_MASK inp/http/data/file1|*.flv|*.svgz
|
||||
#URI_REQUEST_STRICT_TRANSPORT_SECURITY_MASK *
|
||||
|
|
|
@ -6,11 +6,12 @@ plugin/product1.lo: plugin/product1.cpp /usr/include/stdc-predef.h \
|
|||
../../include/ulib/base/base.h ../../include/ulib/internal/config.h \
|
||||
../../include/ulib/internal/platform.h /usr/include/sys/mman.h \
|
||||
/usr/include/features.h /usr/include/sys/cdefs.h \
|
||||
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
|
||||
/usr/include/gnu/stubs-64.h /usr/include/bits/types.h \
|
||||
/usr/include/bits/typesizes.h /usr/include/bits/mman.h \
|
||||
/usr/include/bits/mman-linux.h /usr/include/stdio.h /usr/include/libio.h \
|
||||
/usr/include/_G_config.h /usr/include/wchar.h \
|
||||
/usr/include/bits/wordsize.h /usr/include/bits/long-double.h \
|
||||
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
|
||||
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
|
||||
/usr/include/bits/mman.h /usr/include/bits/mman-linux.h \
|
||||
/usr/include/stdio.h /usr/include/bits/libc-header-start.h \
|
||||
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
|
||||
/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include/stdarg.h \
|
||||
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
|
||||
/usr/include/bits/stdio.h /usr/include/bits/stdio2.h \
|
||||
|
@ -19,15 +20,21 @@ plugin/product1.lo: plugin/product1.cpp /usr/include/stdc-predef.h \
|
|||
/usr/include/bits/posix_opt.h /usr/include/bits/environments.h \
|
||||
/usr/include/bits/confname.h /usr/include/getopt.h \
|
||||
/usr/include/bits/unistd.h /usr/include/sys/uio.h \
|
||||
/usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
|
||||
/usr/include/sys/types.h /usr/include/bits/types/clock_t.h \
|
||||
/usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \
|
||||
/usr/include/bits/types/timer_t.h /usr/include/endian.h \
|
||||
/usr/include/bits/endian.h /usr/include/bits/byteswap.h \
|
||||
/usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
|
||||
/usr/include/bits/select.h /usr/include/bits/sigset.h \
|
||||
/usr/include/bits/time.h /usr/include/bits/select2.h \
|
||||
/usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
|
||||
/usr/include/bits/uio.h /usr/include/sys/stat.h /usr/include/bits/stat.h \
|
||||
/usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \
|
||||
/usr/include/bits/timex.h /usr/include/xlocale.h \
|
||||
/usr/include/bits/byteswap-16.h /usr/include/bits/uintn-identity.h \
|
||||
/usr/include/sys/select.h /usr/include/bits/select.h \
|
||||
/usr/include/bits/sigset.h /usr/include/bits/types/struct_timeval.h \
|
||||
/usr/include/bits/types/struct_timespec.h /usr/include/bits/select2.h \
|
||||
/usr/include/sys/sysmacros.h /usr/include/bits/sysmacros.h \
|
||||
/usr/include/bits/pthreadtypes.h /usr/include/bits/uio.h \
|
||||
/usr/include/sys/stat.h /usr/include/bits/stat.h /usr/include/pthread.h \
|
||||
/usr/include/sched.h /usr/include/bits/sched.h /usr/include/time.h \
|
||||
/usr/include/bits/time.h /usr/include/bits/timex.h \
|
||||
/usr/include/bits/types/struct_tm.h \
|
||||
/usr/include/bits/types/struct_itimerspec.h /usr/include/xlocale.h \
|
||||
/usr/include/bits/setjmp.h /usr/include/signal.h \
|
||||
/usr/include/bits/signum.h /usr/include/bits/siginfo.h \
|
||||
/usr/include/bits/sigaction.h /usr/include/bits/sigcontext.h \
|
||||
|
@ -46,8 +53,9 @@ plugin/product1.lo: plugin/product1.cpp /usr/include/stdc-predef.h \
|
|||
/usr/include/ctype.h ../../include/ulib/base/replace/replace.h \
|
||||
/usr/src/linux/include/generated/uapi/linux/version.h \
|
||||
/usr/include/openssl/opensslv.h /usr/include/string.h \
|
||||
/usr/include/bits/string3.h /usr/include/fcntl.h \
|
||||
/usr/include/bits/fcntl.h /usr/include/bits/fcntl-linux.h \
|
||||
/usr/include/bits/string3.h /usr/include/bits/strings_fortified.h \
|
||||
/usr/include/fcntl.h /usr/include/bits/fcntl.h \
|
||||
/usr/include/bits/fcntl-linux.h /usr/include/linux/falloc.h \
|
||||
/usr/include/bits/fcntl2.h /usr/include/errno.h \
|
||||
/usr/include/bits/errno.h /usr/include/linux/errno.h \
|
||||
/usr/include/asm/errno.h /usr/include/asm-generic/errno.h \
|
||||
|
@ -191,6 +199,8 @@ plugin/product.h:
|
|||
|
||||
/usr/include/bits/wordsize.h:
|
||||
|
||||
/usr/include/bits/long-double.h:
|
||||
|
||||
/usr/include/gnu/stubs.h:
|
||||
|
||||
/usr/include/gnu/stubs-64.h:
|
||||
|
@ -205,6 +215,8 @@ plugin/product.h:
|
|||
|
||||
/usr/include/stdio.h:
|
||||
|
||||
/usr/include/bits/libc-header-start.h:
|
||||
|
||||
/usr/include/libio.h:
|
||||
|
||||
/usr/include/_G_config.h:
|
||||
|
@ -243,7 +255,13 @@ plugin/product.h:
|
|||
|
||||
/usr/include/sys/types.h:
|
||||
|
||||
/usr/include/time.h:
|
||||
/usr/include/bits/types/clock_t.h:
|
||||
|
||||
/usr/include/bits/types/clockid_t.h:
|
||||
|
||||
/usr/include/bits/types/time_t.h:
|
||||
|
||||
/usr/include/bits/types/timer_t.h:
|
||||
|
||||
/usr/include/endian.h:
|
||||
|
||||
|
@ -253,18 +271,24 @@ plugin/product.h:
|
|||
|
||||
/usr/include/bits/byteswap-16.h:
|
||||
|
||||
/usr/include/bits/uintn-identity.h:
|
||||
|
||||
/usr/include/sys/select.h:
|
||||
|
||||
/usr/include/bits/select.h:
|
||||
|
||||
/usr/include/bits/sigset.h:
|
||||
|
||||
/usr/include/bits/time.h:
|
||||
/usr/include/bits/types/struct_timeval.h:
|
||||
|
||||
/usr/include/bits/types/struct_timespec.h:
|
||||
|
||||
/usr/include/bits/select2.h:
|
||||
|
||||
/usr/include/sys/sysmacros.h:
|
||||
|
||||
/usr/include/bits/sysmacros.h:
|
||||
|
||||
/usr/include/bits/pthreadtypes.h:
|
||||
|
||||
/usr/include/bits/uio.h:
|
||||
|
@ -279,8 +303,16 @@ plugin/product.h:
|
|||
|
||||
/usr/include/bits/sched.h:
|
||||
|
||||
/usr/include/time.h:
|
||||
|
||||
/usr/include/bits/time.h:
|
||||
|
||||
/usr/include/bits/timex.h:
|
||||
|
||||
/usr/include/bits/types/struct_tm.h:
|
||||
|
||||
/usr/include/bits/types/struct_itimerspec.h:
|
||||
|
||||
/usr/include/xlocale.h:
|
||||
|
||||
/usr/include/bits/setjmp.h:
|
||||
|
@ -339,12 +371,16 @@ plugin/product.h:
|
|||
|
||||
/usr/include/bits/string3.h:
|
||||
|
||||
/usr/include/bits/strings_fortified.h:
|
||||
|
||||
/usr/include/fcntl.h:
|
||||
|
||||
/usr/include/bits/fcntl.h:
|
||||
|
||||
/usr/include/bits/fcntl-linux.h:
|
||||
|
||||
/usr/include/linux/falloc.h:
|
||||
|
||||
/usr/include/bits/fcntl2.h:
|
||||
|
||||
/usr/include/errno.h:
|
||||
|
|
|
@ -6,11 +6,12 @@ plugin/product2.lo: plugin/product2.cpp /usr/include/stdc-predef.h \
|
|||
../../include/ulib/base/base.h ../../include/ulib/internal/config.h \
|
||||
../../include/ulib/internal/platform.h /usr/include/sys/mman.h \
|
||||
/usr/include/features.h /usr/include/sys/cdefs.h \
|
||||
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
|
||||
/usr/include/gnu/stubs-64.h /usr/include/bits/types.h \
|
||||
/usr/include/bits/typesizes.h /usr/include/bits/mman.h \
|
||||
/usr/include/bits/mman-linux.h /usr/include/stdio.h /usr/include/libio.h \
|
||||
/usr/include/_G_config.h /usr/include/wchar.h \
|
||||
/usr/include/bits/wordsize.h /usr/include/bits/long-double.h \
|
||||
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
|
||||
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
|
||||
/usr/include/bits/mman.h /usr/include/bits/mman-linux.h \
|
||||
/usr/include/stdio.h /usr/include/bits/libc-header-start.h \
|
||||
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
|
||||
/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include/stdarg.h \
|
||||
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
|
||||
/usr/include/bits/stdio.h /usr/include/bits/stdio2.h \
|
||||
|
@ -19,15 +20,21 @@ plugin/product2.lo: plugin/product2.cpp /usr/include/stdc-predef.h \
|
|||
/usr/include/bits/posix_opt.h /usr/include/bits/environments.h \
|
||||
/usr/include/bits/confname.h /usr/include/getopt.h \
|
||||
/usr/include/bits/unistd.h /usr/include/sys/uio.h \
|
||||
/usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
|
||||
/usr/include/sys/types.h /usr/include/bits/types/clock_t.h \
|
||||
/usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \
|
||||
/usr/include/bits/types/timer_t.h /usr/include/endian.h \
|
||||
/usr/include/bits/endian.h /usr/include/bits/byteswap.h \
|
||||
/usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
|
||||
/usr/include/bits/select.h /usr/include/bits/sigset.h \
|
||||
/usr/include/bits/time.h /usr/include/bits/select2.h \
|
||||
/usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
|
||||
/usr/include/bits/uio.h /usr/include/sys/stat.h /usr/include/bits/stat.h \
|
||||
/usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \
|
||||
/usr/include/bits/timex.h /usr/include/xlocale.h \
|
||||
/usr/include/bits/byteswap-16.h /usr/include/bits/uintn-identity.h \
|
||||
/usr/include/sys/select.h /usr/include/bits/select.h \
|
||||
/usr/include/bits/sigset.h /usr/include/bits/types/struct_timeval.h \
|
||||
/usr/include/bits/types/struct_timespec.h /usr/include/bits/select2.h \
|
||||
/usr/include/sys/sysmacros.h /usr/include/bits/sysmacros.h \
|
||||
/usr/include/bits/pthreadtypes.h /usr/include/bits/uio.h \
|
||||
/usr/include/sys/stat.h /usr/include/bits/stat.h /usr/include/pthread.h \
|
||||
/usr/include/sched.h /usr/include/bits/sched.h /usr/include/time.h \
|
||||
/usr/include/bits/time.h /usr/include/bits/timex.h \
|
||||
/usr/include/bits/types/struct_tm.h \
|
||||
/usr/include/bits/types/struct_itimerspec.h /usr/include/xlocale.h \
|
||||
/usr/include/bits/setjmp.h /usr/include/signal.h \
|
||||
/usr/include/bits/signum.h /usr/include/bits/siginfo.h \
|
||||
/usr/include/bits/sigaction.h /usr/include/bits/sigcontext.h \
|
||||
|
@ -46,8 +53,9 @@ plugin/product2.lo: plugin/product2.cpp /usr/include/stdc-predef.h \
|
|||
/usr/include/ctype.h ../../include/ulib/base/replace/replace.h \
|
||||
/usr/src/linux/include/generated/uapi/linux/version.h \
|
||||
/usr/include/openssl/opensslv.h /usr/include/string.h \
|
||||
/usr/include/bits/string3.h /usr/include/fcntl.h \
|
||||
/usr/include/bits/fcntl.h /usr/include/bits/fcntl-linux.h \
|
||||
/usr/include/bits/string3.h /usr/include/bits/strings_fortified.h \
|
||||
/usr/include/fcntl.h /usr/include/bits/fcntl.h \
|
||||
/usr/include/bits/fcntl-linux.h /usr/include/linux/falloc.h \
|
||||
/usr/include/bits/fcntl2.h /usr/include/errno.h \
|
||||
/usr/include/bits/errno.h /usr/include/linux/errno.h \
|
||||
/usr/include/asm/errno.h /usr/include/asm-generic/errno.h \
|
||||
|
@ -191,6 +199,8 @@ plugin/product.h:
|
|||
|
||||
/usr/include/bits/wordsize.h:
|
||||
|
||||
/usr/include/bits/long-double.h:
|
||||
|
||||
/usr/include/gnu/stubs.h:
|
||||
|
||||
/usr/include/gnu/stubs-64.h:
|
||||
|
@ -205,6 +215,8 @@ plugin/product.h:
|
|||
|
||||
/usr/include/stdio.h:
|
||||
|
||||
/usr/include/bits/libc-header-start.h:
|
||||
|
||||
/usr/include/libio.h:
|
||||
|
||||
/usr/include/_G_config.h:
|
||||
|
@ -243,7 +255,13 @@ plugin/product.h:
|
|||
|
||||
/usr/include/sys/types.h:
|
||||
|
||||
/usr/include/time.h:
|
||||
/usr/include/bits/types/clock_t.h:
|
||||
|
||||
/usr/include/bits/types/clockid_t.h:
|
||||
|
||||
/usr/include/bits/types/time_t.h:
|
||||
|
||||
/usr/include/bits/types/timer_t.h:
|
||||
|
||||
/usr/include/endian.h:
|
||||
|
||||
|
@ -253,18 +271,24 @@ plugin/product.h:
|
|||
|
||||
/usr/include/bits/byteswap-16.h:
|
||||
|
||||
/usr/include/bits/uintn-identity.h:
|
||||
|
||||
/usr/include/sys/select.h:
|
||||
|
||||
/usr/include/bits/select.h:
|
||||
|
||||
/usr/include/bits/sigset.h:
|
||||
|
||||
/usr/include/bits/time.h:
|
||||
/usr/include/bits/types/struct_timeval.h:
|
||||
|
||||
/usr/include/bits/types/struct_timespec.h:
|
||||
|
||||
/usr/include/bits/select2.h:
|
||||
|
||||
/usr/include/sys/sysmacros.h:
|
||||
|
||||
/usr/include/bits/sysmacros.h:
|
||||
|
||||
/usr/include/bits/pthreadtypes.h:
|
||||
|
||||
/usr/include/bits/uio.h:
|
||||
|
@ -279,8 +303,16 @@ plugin/product.h:
|
|||
|
||||
/usr/include/bits/sched.h:
|
||||
|
||||
/usr/include/time.h:
|
||||
|
||||
/usr/include/bits/time.h:
|
||||
|
||||
/usr/include/bits/timex.h:
|
||||
|
||||
/usr/include/bits/types/struct_tm.h:
|
||||
|
||||
/usr/include/bits/types/struct_itimerspec.h:
|
||||
|
||||
/usr/include/xlocale.h:
|
||||
|
||||
/usr/include/bits/setjmp.h:
|
||||
|
@ -339,12 +371,16 @@ plugin/product.h:
|
|||
|
||||
/usr/include/bits/string3.h:
|
||||
|
||||
/usr/include/bits/strings_fortified.h:
|
||||
|
||||
/usr/include/fcntl.h:
|
||||
|
||||
/usr/include/bits/fcntl.h:
|
||||
|
||||
/usr/include/bits/fcntl-linux.h:
|
||||
|
||||
/usr/include/linux/falloc.h:
|
||||
|
||||
/usr/include/bits/fcntl2.h:
|
||||
|
||||
/usr/include/errno.h:
|
||||
|
|
|
@ -23,7 +23,7 @@ static bool WaitNValue(int value)
|
|||
{
|
||||
if (n == value) U_RETURN(true);
|
||||
|
||||
UThread::nanosleep(10);
|
||||
UThread::nanosleep(100);
|
||||
}
|
||||
|
||||
U_RETURN(false);
|
||||
|
@ -39,7 +39,7 @@ static bool WaitChangeNValue(int value)
|
|||
{
|
||||
if (n != value) U_RETURN(true);
|
||||
|
||||
UThread::nanosleep(10);
|
||||
UThread::nanosleep(100);
|
||||
}
|
||||
|
||||
U_RETURN(false);
|
||||
|
|
Loading…
Reference in New Issue
Block a user