Exemple #1
0
void random_slice(DskBuffer* buf)
{
  DskBuffer tmpbuf;
  char *copy, *copy_at;
  unsigned orig_size = buf->size;
  dsk_buffer_init (&tmpbuf);
  copy = dsk_malloc (buf->size);
  copy_at = copy;
  while (1)
    {
      int r;
      r = (rand () % 16384) + 1;
      r = dsk_buffer_read (buf, r, copy_at);
      dsk_buffer_append (&tmpbuf, r, copy_at);
      if (r == 0)
	break;
    }
  dsk_assert (copy_at == copy + orig_size);
  dsk_assert (buf->size == 0);
  dsk_assert (tmpbuf.size == orig_size);
  copy_at = dsk_malloc (orig_size);
  dsk_assert (dsk_buffer_read (&tmpbuf, orig_size, copy_at) == orig_size);
  dsk_assert (dsk_buffer_read (&tmpbuf, orig_size, copy_at) == 0);
  dsk_assert (memcmp (copy, copy_at, orig_size) == 0);
  dsk_free (copy);
  dsk_free (copy_at);
}
Exemple #2
0
void count(DskBuffer* buf, int start, int end)
{
  char b[1024];
  while (start <= end)
    {
      sprintf (b, "%d\n", start++);
      dsk_buffer_append (buf, strlen (b), b);
    }
}
Exemple #3
0
static dsk_boolean
dsk_xml_escaper_process (DskOctetFilter *filter,
                        DskBuffer      *out,
                        unsigned        in_length,
                        const uint8_t  *in_data,
                        DskError      **error)
{
  DSK_UNUSED (filter);
  DSK_UNUSED (error);
  while (in_length > 0)
    {
      unsigned n = 0;
      while (n < in_length && in_data[n] != '<' && in_data[n] != '>'
             && in_data[n] != '&')
        n++;
      if (n)
        dsk_buffer_append (out, n, in_data);
      in_data += n;
      in_length -= n;
      while (in_length > 0)
        if (*in_data == '<')
          {
            in_data++;
            in_length--;
            dsk_buffer_append (out, 4, "&lt;");
          }
        else if (*in_data == '>')
          {
            in_data++;
            in_length--;
            dsk_buffer_append (out, 4, "&gt;");
          }
        else if (*in_data == '&')
          {
            in_data++;
            in_length--;
            dsk_buffer_append (out, 5, "&amp;");
          }
        else
          break;
    }
  return DSK_TRUE;
}
Exemple #4
0
static DskHttpRequest *
try_parse_request_from_string (const char *str,
                               DskError  **error)
{
  unsigned len = strlen (str);
  DskBuffer buffer = DSK_BUFFER_INIT;
  DskHttpRequest *rv;
  dsk_buffer_append (&buffer, len, str);
  rv = dsk_http_request_parse_buffer (&buffer, len, error);
  dsk_buffer_clear (&buffer);
  return rv;
}
Exemple #5
0
static void
handle_bad_char (DskUtf8Fixer *fixer,
                 DskBuffer    *out,
                 uint8_t       c)
{
  char buf[6];
  switch (fixer->mode)
    {
    case DSK_UTF8_FIXER_DROP:
      break;
    case DSK_UTF8_FIXER_LATIN1:
      dsk_buffer_append (out, dsk_utf8_encode_unichar (buf, c), buf);
      break;
    }
}
Exemple #6
0
static DskIOResult
dsk_memory_sink_write (DskOctetSink   *sink,
                       unsigned        max_len,
                       const void     *data_out,
                       unsigned       *n_written_out,
                       DskError      **error)
{
  DskMemorySink *msink = DSK_MEMORY_SINK (sink);
  DSK_UNUSED (error);
  if (msink->buffer.size >= msink->max_buffer_size)
    return DSK_IO_RESULT_AGAIN;
  if (msink->buffer.size + max_len <= msink->max_buffer_size)
    *n_written_out = max_len;
  else
    *n_written_out = msink->max_buffer_size - msink->buffer.size;
  dsk_buffer_append (&msink->buffer, *n_written_out, data_out);
  dsk_hook_set_idle_notify (&msink->buffer_nonempty, DSK_TRUE);
  return DSK_IO_RESULT_SUCCESS;
}
Exemple #7
0
int main(int argc, char** argv)
{

  DskBuffer gskbuffer;
  char buf[1024];
  char *str;

  dsk_cmdline_init ("test dsk-buffer code", "test DskBuffer", NULL, 0);
  dsk_cmdline_process_args (&argc, &argv);

  dsk_buffer_init (&gskbuffer);
  dsk_assert (gskbuffer.size == 0);
  dsk_buffer_append (&gskbuffer, 5, "hello");
  dsk_assert (gskbuffer.size == 5);
  dsk_assert (dsk_buffer_read (&gskbuffer, sizeof (buf), buf) == 5);
  dsk_assert (memcmp (buf, "hello", 5) == 0);
  dsk_assert (gskbuffer.size == 0);
  dsk_buffer_clear (&gskbuffer);

  dsk_buffer_init (&gskbuffer);
  count (&gskbuffer, 1, 100000);
  decount (&gskbuffer, 1, 100000);
  dsk_assert (gskbuffer.size == 0);
  dsk_buffer_clear (&gskbuffer);

  dsk_buffer_init (&gskbuffer);
  dsk_buffer_append_string (&gskbuffer, "hello\na\nb");
  str = dsk_buffer_read_line (&gskbuffer);
  dsk_assert (str);
  dsk_assert (strcmp (str, "hello") == 0);
  dsk_free (str);
  str = dsk_buffer_read_line (&gskbuffer);
  dsk_assert (str);
  dsk_assert (strcmp (str, "a") == 0);
  dsk_free (str);
  dsk_assert (gskbuffer.size == 1);
  dsk_assert (dsk_buffer_read_line (&gskbuffer) == NULL);
  dsk_buffer_append_byte (&gskbuffer, '\n');
  str = dsk_buffer_read_line (&gskbuffer);
  dsk_assert (str);
  dsk_assert (strcmp (str, "b") == 0);
  dsk_free (str);
  dsk_assert (gskbuffer.size == 0);
  dsk_buffer_clear (&gskbuffer);

  dsk_buffer_init (&gskbuffer);
  dsk_buffer_append (&gskbuffer, 5, "hello");
  dsk_buffer_append_foreign (&gskbuffer, 4, "test", NULL, NULL);
  dsk_buffer_append (&gskbuffer, 5, "hello");
  dsk_assert (gskbuffer.size == 14);
  dsk_assert (dsk_buffer_read (&gskbuffer, sizeof (buf), buf) == 14);
  dsk_assert (memcmp (buf, "hellotesthello", 14) == 0);
  dsk_assert (gskbuffer.size == 0);

  /* Test that the foreign data really is not being stored in the DskBuffer */
  {
    char test_str[5];
    strcpy (test_str, "test");
    dsk_buffer_init (&gskbuffer);
    dsk_buffer_append (&gskbuffer, 5, "hello");
    dsk_buffer_append_foreign (&gskbuffer, 4, test_str, NULL, NULL);
    dsk_buffer_append (&gskbuffer, 5, "hello");
    dsk_assert (gskbuffer.size == 14);
    dsk_assert (dsk_buffer_peek (&gskbuffer, sizeof (buf), buf) == 14);
    dsk_assert (memcmp (buf, "hellotesthello", 14) == 0);
    test_str[1] = '3';
    dsk_assert (gskbuffer.size == 14);
    dsk_assert (dsk_buffer_read (&gskbuffer, sizeof (buf), buf) == 14);
    dsk_assert (memcmp (buf, "hellot3sthello", 14) == 0);
    dsk_buffer_clear (&gskbuffer);
  }

  /* Test str_index_of */
  {
    DskBuffer buffer = DSK_BUFFER_INIT;
    dsk_buffer_append_foreign (&buffer, 3, "abc", NULL, NULL);
    dsk_buffer_append_foreign (&buffer, 3, "def", NULL, NULL);
    dsk_buffer_append_foreign (&buffer, 3, "gad", NULL, NULL);
#if 0
    dsk_assert (dsk_buffer_str_index_of (&buffer, "cdefg") == 2);
    dsk_assert (dsk_buffer_str_index_of (&buffer, "ad") == 7);
    dsk_assert (dsk_buffer_str_index_of (&buffer, "ab") == 0);
    dsk_assert (dsk_buffer_str_index_of (&buffer, "a") == 0);
    dsk_assert (dsk_buffer_str_index_of (&buffer, "g") == 6);
#endif
    dsk_buffer_clear (&buffer);
  }

  static const char *before_strs[] = {
    "",
    "foo",
    NULL, NULL
  };
  before_strs[2] = generate_str (100, 1000);
  before_strs[3] = generate_str (10000, 100000);
  static const char *placeholder_strs[] = {
    "",
    "bar",
    NULL, NULL, NULL
  };
  placeholder_strs[2] = generate_str (100, 1000);
  placeholder_strs[3] = generate_str (10000, 100000);
  placeholder_strs[4] = generate_str (100000, 1000000);
  static const char *after_strs[] = {
    "",
    "foo",
    NULL, NULL
  };
  after_strs[2] = generate_str (100, 1000);
  after_strs[3] = generate_str (10000, 100000);
  unsigned bi, pi, ai;
  for (bi = 0; bi < DSK_N_ELEMENTS (before_strs); bi++)
    for (pi = 0; pi < DSK_N_ELEMENTS (placeholder_strs); pi++)
      for (ai = 0; ai < DSK_N_ELEMENTS (after_strs); ai++)
        {
          DskBuffer buffer = DSK_BUFFER_INIT;
          const char *pi_str = placeholder_strs[pi];
          DskBufferPlaceholder placeholder;
          dsk_buffer_append_string (&buffer, before_strs[bi]);
          dsk_buffer_append_placeholder (&buffer, strlen (pi_str), &placeholder);
          dsk_buffer_append_string (&buffer, after_strs[ai]);
          dsk_buffer_placeholder_set (&placeholder, pi_str);
          dsk_assert (try_initial_remove (&buffer, before_strs[bi]));
          dsk_assert (try_initial_remove (&buffer, pi_str));
          dsk_assert (try_initial_remove (&buffer, after_strs[ai]));
          dsk_assert (buffer.size == 0);
        }

  return 0;
}
Exemple #8
0
static dsk_boolean
dsk_utf8_fixer_process  (DskOctetFilter *filter,
                         DskBuffer      *out,
                         unsigned        in_length,
                         const uint8_t  *in_data,
                         DskError      **error)
{
  DskUtf8Fixer *fixer = (DskUtf8Fixer *) filter;
  DSK_UNUSED (error);
retry_spare:
  if (fixer->spare_len)
    {
      unsigned used = 6 - fixer->spare_len;
      unsigned u;
      if (used < in_length)
        used = in_length;
      memcpy (fixer->spare + fixer->spare_len, in_data, used);
      switch (dsk_utf8_validate (fixer->spare_len + used, (char*) fixer->spare, &u))
        {
        case DSK_UTF8_VALIDATION_SUCCESS:
          dsk_buffer_append (out, fixer->spare_len, fixer->spare);
          in_length -= used;
          in_data += used;
          fixer->spare_len = 0;
          break;
        case DSK_UTF8_VALIDATION_PARTIAL:
          dsk_assert (u > fixer->spare_len);
          dsk_buffer_append (out, u, fixer->spare);
          in_length -= u - fixer->spare_len;
          in_data += u - fixer->spare_len;
          fixer->spare_len = 0;
          break;
        case DSK_UTF8_VALIDATION_INVALID:
          dsk_buffer_append (out, u, fixer->spare);
          if (u < fixer->spare_len)
            {
              handle_bad_char (fixer, out, fixer->spare[u]);
              u++;
              memmove (fixer->spare, fixer->spare + u, fixer->spare_len - u);
              fixer->spare_len -= u;
              goto retry_spare;
            }
          else
            {
              in_length -= u - fixer->spare_len;
              in_data += u - fixer->spare_len;
              fixer->spare_len = 0;
            }
          break;
        }
    }
  while (in_length)
    {
      unsigned used;
      switch (dsk_utf8_validate (in_length, (char*) in_data, &used))
        {
        case DSK_UTF8_VALIDATION_SUCCESS:
          dsk_buffer_append (out, used, in_data);
          return DSK_TRUE;
        case DSK_UTF8_VALIDATION_PARTIAL:
          dsk_assert (in_length - used <= 6);
          dsk_buffer_append (out, used, in_data);
          fixer->spare_len = in_length - used;
          memcpy (fixer->spare, in_data, fixer->spare_len);
          return DSK_TRUE;
        case DSK_UTF8_VALIDATION_INVALID:
          if (used > 0)
            {
              dsk_buffer_append (out, used, in_data);
              in_data += used;
              in_length -= used;
            }
          dsk_assert (in_length > 0);
          dsk_assert (*in_data >= 128);
          handle_bad_char (fixer, out, *in_data);
          in_length--;
          in_data++;
          break;
        }
    }
  return DSK_TRUE;
}