Hi,
Yes - it is MIT license in the webpage. Might be a good thing to
mention that in the created header file too.
- Timo
On Fri, 20 Dec 2013 12:08:10 +0100
Daniel-Constantin Mierla <miconda@gmail.com> wrote:
> getting rid of libunistring is good, indeed, thanks.
>
> One thing that has to be cared with the websocket module is the need
> to link against libssl, so if the new included code is gpl we need to
> have an exception for it to comply with official debian packaging
> requirements.
>
> The page lists a different license than gpl, it seems to be MIT,
> which I guess is all fine, being compatible with GPL and allowing
> linking with libssl. But I wanted to highlight in case anyone else
> has different opinion/more details.
>
> Cheers,
> Daniel
>
>
> On 20/12/13 11:47, Timo Teräs wrote:
> > libunistring is old, slow, messy code and uncompilable on new
> > systems. remove the sole user of it, and replace it with inline
> > utf8 decoder implementation from
> > http://bjoern.hoehrmann.de/utf-8/decoder/dfa/.
> >
> > improves performance and portability as libunistring is not needed.
> > ---
> > @Peter, Hugh: Would it be ok for me to push this?
> >
> > modules/websocket/Makefile | 2 +-
> > modules/websocket/README | 1 -
> > modules/websocket/doc/websocket_admin.xml | 3 --
> > modules/websocket/utf8_decode.h | 52
> > +++++++++++++++++++++++++++++++
> > modules/websocket/ws_frame.c | 4 +-- 5 files changed,
> > 55 insertions(+), 7 deletions(-) create mode 100644
> > modules/websocket/utf8_decode.h
> >
> > diff --git a/modules/websocket/Makefile b/modules/websocket/Makefile
> > index bb7c809..c686a82 100644
> > --- a/modules/websocket/Makefile
> > +++ b/modules/websocket/Makefile
> > @@ -27,7 +27,7 @@ else
> > # E.g.: make TLS_HOOKS=1 TLS_EXTRA_LIBS="-lz -lkrb5"
> > endif
> >
> > -LIBS+= $(TLS_EXTRA_LIBS) -lunistring
> > +LIBS+= $(TLS_EXTRA_LIBS)
> >
> > # Static linking, if you'd like to use TLS and WEBSOCKET at the
> > same time #
> > diff --git a/modules/websocket/README b/modules/websocket/README
> > index 49d8693..bdba3e4 100644
> > --- a/modules/websocket/README
> > +++ b/modules/websocket/README
> > @@ -316,7 +316,6 @@ onreply_route[WS_REPLY] {
> > The following libraries must be installed before running
> > Kamailio with this module loaded:
> > * OpenSSL.
> > - * GNU libunistring.
> >
> > 4. Parameters
> >
> > diff --git a/modules/websocket/doc/websocket_admin.xml
> > b/modules/websocket/doc/websocket_admin.xml index fa7d300..e40dc09
> > 100644 --- a/modules/websocket/doc/websocket_admin.xml
> > +++ b/modules/websocket/doc/websocket_admin.xml
> > @@ -262,9 +262,6 @@ onreply_route[WS_REPLY] {
> > <listitem>
> > <para><emphasis>OpenSSL</emphasis>.</para>
> > </listitem>
> > - <listitem>
> > - <para><emphasis>GNU libunistring</emphasis>.</para>
> > - </listitem>
> > </itemizedlist>
> > </para>
> > </section>
> > diff --git a/modules/websocket/utf8_decode.h
> > b/modules/websocket/utf8_decode.h new file mode 100644
> > index 0000000..b274fe7
> > --- /dev/null
> > +++ b/modules/websocket/utf8_decode.h
> > @@ -0,0 +1,52 @@
> > +#include <stdint.h>
> > +#include <stddef.h>
> > +
> > +// Copyright (c) 2008-2010 Bjoern Hoehrmann <bjoern@hoehrmann.de>
> > +// See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details.
> > +
> > +#define UTF8_ACCEPT 0
> > +#define UTF8_REJECT 12
> > +
> > +static const uint8_t utf8d[] = {
> > + // The first part of the table maps bytes to character classes
> > that
> > + // to reduce the size of the transition table and create
> > bitmasks.
> > + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> > + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> > + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> > + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
> > + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
> > 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
> > + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
> > 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
> > + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
> > 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
> > + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,
> > 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, +
> > + // The second part is a transition table that maps a combination
> > + // of a state of the automaton and a character class to a state.
> > + 0,12,24,36,60,96,84,12,12,12,48,72,
> > 12,12,12,12,12,12,12,12,12,12,12,12,
> > + 12, 0,12,12,12,12,12, 0,12, 0,12,12,
> > 12,24,12,12,12,12,12,24,12,24,12,12,
> > + 12,12,12,12,12,12,12,24,12,12,12,12,
> > 12,24,12,12,12,12,12,12,12,24,12,12,
> > + 12,12,12,12,12,12,12,36,12,36,12,12,
> > 12,36,12,12,12,12,12,36,12,36,12,12,
> > + 12,36,12,12,12,12,12,12,12,12,12,12,
> > +};
> > +
> > +static inline uint32_t decode(uint32_t* state, uint32_t* codep,
> > uint32_t byte) +{
> > + uint32_t type = utf8d[byte];
> > +
> > + *codep = (*state != UTF8_ACCEPT) ?
> > + (byte & 0x3fu) | (*codep << 6) :
> > + (0xff >> type) & (byte);
> > +
> > + *state = utf8d[256 + *state + type];
> > + return *state;
> > +}
> > +
> > +static inline int IsUTF8(uint8_t* s, size_t len)
> > +{
> > + uint32_t codepoint, state = 0;
> > +
> > + while (len--)
> > + decode(&state, &codepoint, *s++);
> > +
> > + return state == UTF8_ACCEPT;
> > +}
> > +
> > diff --git a/modules/websocket/ws_frame.c
> > b/modules/websocket/ws_frame.c index a3a4cef..3562437 100644
> > --- a/modules/websocket/ws_frame.c
> > +++ b/modules/websocket/ws_frame.c
> > @@ -22,7 +22,7 @@
> > */
> >
> > #include <limits.h>
> > -#include <unistr.h>
> > +#include "utf8_decode.h"
> > #include "../../events.h"
> > #include "../../receive.h"
> > #include "../../stats.h"
> > @@ -695,7 +695,7 @@ int ws_frame_transmit(void *data)
> > frame.fin = 1;
> > /* Can't be sure whether this message is UTF-8 or not so
> > check to see if it "might" be UTF-8 and send as binary if it
> > definitely isn't */
> > - frame.opcode = (u8_check((uint8_t *) wsev->buf, wsev->len)
> > == NULL) ?
> > + frame.opcode = IsUTF8((uint8_t *) wsev->buf, wsev->len) ?
> > OPCODE_TEXT_FRAME :
> > OPCODE_BINARY_FRAME; frame.payload_len = wsev->len;
> > frame.payload_data = wsev->buf;
>
>