Example #1
0
void
inject_control_javascript(struct evbuffer *buffer)
{
	struct evbuffer *scratch = evbuffer_new();
	char *data, *p;
	size_t data_len, prefix_len;
	assert(scratch != NULL);

	/* simple swap */
	evbuffer_add_buffer(scratch, buffer);
	
	data = (char *)EVBUFFER_DATA(scratch);
	data_len = EVBUFFER_LENGTH(scratch);

	/* try to find the html tag */
	p = find_pointer(data, data_len);
	if (p == NULL) {
		/* 
		 * although, the content typed said text/html, we can't inject
		 * here.  for example, if the response looks like xml data.
		 */
		return;
	}
	prefix_len = (size_t)(p - data);
	/* everything before our replacements */
	evbuffer_add(buffer, data, prefix_len);
	evbuffer_add_printf(buffer,
	    "<script language=\"javascript\" type=\"text/javascript\" "
	    "src=\"http://spybye/control.js\"></script>");
	evbuffer_add(buffer, data + prefix_len, data_len - prefix_len);
	evbuffer_free(scratch);
}
Example #2
0
	static void
readcbout(struct bufferevent *bev_out, void *ctx_in)
{
	struct bufferevent *partner_in = ctx_in;
	struct evbuffer *src, *dst;
	size_t len;
	src = bufferevent_get_input(bev_out);
	len = evbuffer_get_length(src);
	if (!partner_in) {
		fprintf(stderr, "partner_in == NULL");
		evbuffer_drain(src, len);
		return;
	}
	dst = bufferevent_get_output(partner_in);
	evbuffer_add_buffer(dst, src);

	if (evbuffer_get_length(dst) >= MAX_OUTPUT_C2P) {
		/* We're giving the other side data faster than it can
		 * pass it on.  Stop reading here until we have drained the
		 * other side to MAX_OUTPUT_C2P/2 bytes. */
		fprintf(stderr, "adjust the wartermark of <client-proxy>\n");
		bufferevent_setcb(partner_in, readcbin, drained_writecbin, eventcbin, bev_out);
		bufferevent_setwatermark(partner_in, EV_WRITE, MAX_OUTPUT_C2P/2, MAX_OUTPUT_C2P);
		bufferevent_disable(bev_out, EV_READ);
	}
}
Example #3
0
void server_event_read(struct bufferevent *bev, void *arg)
{
    client_t *client = (client_t*) arg;

    char data[4096];
    int res;
    char *line;

    memset(data, 0, 4096);


    res = evbuffer_add_buffer(client->buf, bufferevent_get_input(bev));

    while((line = evbuffer_readln(client->buf, NULL, EVBUFFER_EOL_CRLF)) != NULL)
    {
        log_debug(__FILE__, __LINE__, "Socket #%d - message - (%d) %s", client->socket, strlen(line), line);
        res = message_process(client, line);

        if(res == REQ_PROC_DISCONNECT)
        {
            log_debug(__FILE__, __LINE__, "Closing client connection. socket #%d", client->socket);
            client->server->cur_cons--;
            client_free(client);
            return;
        }
    }
    
    return;
}
Example #4
0
static void
readcb(struct bufferevent *bev, void *ctx)
{
	struct bufferevent *partner = ctx;
	struct evbuffer *src, *dst;
	size_t len;
	src = bufferevent_get_input(bev);
	len = evbuffer_get_length(src);
	if (!partner) {
		evbuffer_drain(src, len);
		return;
	}
	dst = bufferevent_get_output(partner);
	evbuffer_add_buffer(dst, src);

	if (evbuffer_get_length(dst) >= MAX_OUTPUT) {
		/* We're giving the other side data faster than it can
		 * pass it on.  Stop reading here until we have drained the
		 * other side to MAX_OUTPUT/2 bytes. */
		bufferevent_setcb(partner, readcb, drained_writecb,
		    eventcb, bev);
		bufferevent_setwatermark(partner, EV_WRITE, MAX_OUTPUT/2,
		    MAX_OUTPUT);
		bufferevent_disable(bev, EV_READ);
	}
}
/* Write a buffer, adding a terminal newline. Empties buffer. */
void
control_write_buffer(struct client *c, struct evbuffer *buffer)
{
	evbuffer_add_buffer(c->stdout_data, buffer);
	evbuffer_add(c->stdout_data, "\n", 1);
	server_push_stdout(c);
}
Example #6
0
/*
 * Read the data out of a bufferevent into a buffer.  Older versions of
 * libevent only have bufferevent_read, so we have to pull out the buffer and
 * then copy the data.
 */
int
bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf)
{
    struct evbuffer *source;

    source = bufferevent_get_input(bufev);
    return evbuffer_add_buffer(buf, source);
}
Example #7
0
int
bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf)
{
	if (evbuffer_add_buffer(bufev->output, buf) == -1)
		return (-1);

	return 0;
}
Example #8
0
void on_input_data_cb (HttpClient *http, struct evbuffer *input_buf, gpointer ctx)
{
    struct evbuffer *in_buf = (struct evbuffer *) ctx;
    LOG_debug (HTTP_TEST, "CLN:  >>>> got %zd bytes! Total: %ld length.", 
        evbuffer_get_length (input_buf), http_client_get_input_length (http));
    evbuffer_add_buffer (in_buf, input_buf);
    LOG_debug (HTTP_TEST, "CLN: Resulting buf: %zd", evbuffer_get_length (in_buf));
}
Example #9
0
void
evbuffer_add_netstring_buffer(struct evbuffer *buf, struct evbuffer *string, bool drain_src)
{
	evbuffer_add_printf(buf, "%d:", (int)evbuffer_get_length(string));
	if(drain_src)
		evbuffer_remove_buffer(string, buf, evbuffer_get_length(string));
	else
		evbuffer_add_buffer(buf, string);
}
Example #10
0
void read_cb( struct bufferevent *buf_ev, void *arg )
{
  	struct evbuffer *input = bufferevent_get_input( buf_ev );

  	if(arg != NULL) {
  		struct evbuffer *output = bufferevent_get_output( (struct bufferevent *)arg );
  		evbuffer_add_buffer( output, input );
  	}	
}
Example #11
0
void JtEventListen::echo_read_cb(struct bufferevent *bev, void *ctx)
{
        /* This callback is invoked when there is data to read on bev. */
        struct evbuffer *input = bufferevent_get_input(bev);
        struct evbuffer *output = bufferevent_get_output(bev);

        /* Copy all the data from the input buffer to the output buffer. */
        evbuffer_add_buffer(output, input);
}
Example #12
0
void
evtag_marshal_buffer(struct evbuffer *evbuf, ev_uint32_t tag,
    struct evbuffer *data)
{
	evtag_encode_tag(evbuf, tag);
	/* XXX support more than UINT32_MAX data */
	evtag_encode_int(evbuf, (ev_uint32_t)evbuffer_get_length(data));
	evbuffer_add_buffer(evbuf, data);
}
Example #13
0
static void
echo_readcb(struct bufferevent *bev, void *ctx)
{
	struct evbuffer *input = bufferevent_get_input(bev);
	struct evbuffer *output = bufferevent_get_output(bev);

	evbuffer_add_buffer(output, input);
	if (evbuffer_get_length(output) > 1024000)
		bufferevent_disable(bev, EV_READ);
}
Example #14
0
/* Marshaling for integers */
void
tag_marshal_int(struct evbuffer *evbuf, uint8_t tag, uint32_t integer)
{
	evbuffer_drain(_buf, EVBUFFER_LENGTH(_buf));
	encode_int(_buf, integer);

	evbuffer_add(evbuf, &tag, sizeof(tag));
	encode_int(evbuf, EVBUFFER_LENGTH(_buf));
	evbuffer_add_buffer(evbuf, _buf);
}
Example #15
0
void RequestSend(Server *pServer, u32 type, struct evbuffer *evSend) {
    struct Poll *poll = pServer->poll;
    //#define COMPRESS
    struct evbuffer *evReq = evbuffer_new();
    struct Request Req, *pReq;
    bzero((char *) & Req, Size_Request);

    evbuffer_add(evReq, (char *) & Req, Size_Request);

    if (evSend > 0) {
        evbuffer_add_buffer(evReq, evSend);
    }

    debug("len:%d to %s:%d 0x%08x", evbuffer_get_length(evReq), pServer->host, pServer->port, pServer->poll->bev);

    pReq = (struct Request *) (EVBUFFER_DATA(evReq));
    pReq->sizes.UncmprSize = evbuffer_get_length(evReq) - Size_Request_sizes;
    pReq->hdr.TesterId = config.testerid;
    pReq->hdr.ReqType = type;


#ifdef COMPRESS
    if (pReq->sizes.UncmprSize > 200) {
        int lenAlloc = (pReq->sizes.UncmprSize)*1.01 + 12 + Size_Request_sizes;
        int lenCmpr = lenAlloc - Size_Request_sizes;
        char *ptrCmpr;
        ptrCmpr = getNulledMemory(lenAlloc);
        memcpy(ptrCmpr, pReq, Size_Request_sizes);
        compress2((Bytef *) ptrCmpr + Size_Request_sizes, (uLongf *) & lenCmpr, (Bytef *) & pReq->hdr, evbuffer_get_length(evReq) - Size_Request_sizes, Z_DEFAULT_COMPRESSION);
        evbuffer_free(evReq);

        evReq = evbuffer_new();
        evbuffer_add(evReq, ptrCmpr, lenCmpr + Size_Request_sizes);
        free(ptrCmpr);
        pReq = (struct Request *) EVBUFFER_DATA(evReq);
        pReq->sizes.CmprSize = lenCmpr;
    }

#endif
    pReq->sizes.crc = crc32(0xffffffff, (const Bytef *) pReq, evbuffer_get_length(evReq));
    /*
        #ifdef DEBUG
            printf(cBLUE"\treq->sizes.CmprSize=%d"cEND, pReq->sizes.CmprSize);
            printf(cBLUE"\treq->sizes.UncmprSize=%d"cEND, pReq->sizes.UncmprSize);
            printf(cBLUE"\treq->sizes.crc=0x%08x\n"cEND, pReq->sizes.crc);
        #ifdef HEXPRINT
            hexPrint((char *) EVBUFFER_DATA(evReq), evbuffer_get_length(evReq));
        #endif
        #endif
     */

    bufferevent_write_buffer(poll->bev, evReq);
    evbuffer_free(evReq);
}
Example #16
0
static void on_output_timer (evutil_socket_t fd, short event, void *ctx)
{
    OutData *out = (OutData *) ctx;
    struct timeval tv;
    struct evbuffer *out_buf;
    char *buf;
    char c;

    LOG_debug (HTTP_TEST, "SRV: on output timer ..");

    if (out->test_id < TID_body && out->timer_count >= evbuffer_get_length (out->out_buf)) {
        bufferevent_free (out->bev);
        evconnlistener_disable (out->listener);
        event_base_loopbreak (out->evbase);
        LOG_debug (HTTP_TEST, "SRV: All headers data sent !! ");
        return;
    }
    
    out_buf = evbuffer_new ();

    if (out->test_id < TID_body) {
        buf = (char *)evbuffer_pullup (out->out_buf, -1);
        c = buf[out->timer_count];

        evbuffer_add (out_buf, &c, sizeof (c));
        out->timer_count++;
        LOG_debug (HTTP_TEST, "SRV: Sending %zd bytes:\n>>%s<<\n", evbuffer_get_length (out_buf), evbuffer_pullup (out_buf, -1));
    } else {
        if (!out->header_sent) {
            evbuffer_add_buffer (out_buf, out->out_buf);
            out->header_sent = TRUE;
        }
        /*
        if (evbuffer_get_length (out->in_file) < 1) {
            bufferevent_free (out->bev);
            evconnlistener_disable (out->listener);
            event_base_loopbreak (out->evbase);
            LOG_debug (HTTP_TEST, "SRV: All data sent !! ");
            return;
        }*/
        evbuffer_remove_buffer (out->in_file, out_buf, 1024*100);

        LOG_debug (HTTP_TEST, "SRV: Sending BODY %zd bytes", evbuffer_get_length (out_buf));
    }

    bufferevent_write_buffer (out->bev, out_buf);
    evbuffer_free (out_buf);
    
    evutil_timerclear(&tv);
    tv.tv_sec = 0;
    tv.tv_usec = 500;
    event_add(out->timeout, &tv);
}
Example #17
0
static void
echo_read_cb(struct bufferevent *bev, void *ctx)
{
    struct stat *stat = ctx;
    /* This callback is invoked when there is data to read on bev. */
    struct evbuffer *input = bufferevent_get_input(bev);
    struct evbuffer *output = bufferevent_get_output(bev);

    /* Copy all the data from the input buffer to the output buffer. */
    evbuffer_add_buffer(output, input);
    stat->pps++;
}
Example #18
0
static void readcb(struct bufferevent *bev, void *ctx)
{
  /* This callback is invoked when there is data to read on bev. */
  struct evbuffer *input = bufferevent_get_input(bev);
  struct evbuffer *output = bufferevent_get_output(bev);

  ++total_messages_read;
  total_bytes_read += evbuffer_get_length(input);

  /* Copy all the data from the input buffer to the output buffer. */
  evbuffer_add_buffer(output, input);
}
static void echo_read_cb(struct bufferevent *bev, void *context)
{
    struct evbuffer *input = bufferevent_get_input(bev);
    struct evbuffer *output = bufferevent_get_output(bev);
    
    size_t length = evbuffer_get_length(input);
    char *data;
    data = malloc(length);
    evbuffer_copyout(input, data, length);
    printf("data: %s\n", data);
    
    evbuffer_add_buffer(output, input);
    free(data);
}
Example #20
0
/**
 * This method sends a handshake to a connected server via proxy
 * The sever connection is handled with player->bev
 * 
 * @remarks Scope: private
 * 
 * @param player player struct to connect with
 */
void send_proxyhandshake(struct PL_entry *player)
{
  struct evbuffer *output = bufferevent_get_output(player->sev);
  struct evbuffer *tempbuf = evbuffer_new();
  
  uint8_t pid = PID_HANDSHAKE;
  int16_t n_ulen = htons(player->username->slen);
  
  evbuffer_add(tempbuf, &pid, sizeof(pid));
  evbuffer_add(tempbuf, &n_ulen, sizeof(n_ulen));
  evbuffer_add(tempbuf, player->username->data, player->username->slen);
  
  evbuffer_add_buffer(output,tempbuf);
  evbuffer_free(tempbuf);
}
Example #21
0
/**
 * This method sends a chat message to a connected server via proxy
 * The sever connection is handled with player->bev
 * 
 * @remarks Scope: private
 * 
 * @param player player struct to connect with
 * @param message bstring message to conenct with
 */
void send_proxychat(struct PL_entry *player,bstring message)
{
  struct evbuffer *output = bufferevent_get_output(player->sev);
  struct evbuffer *tempbuf = evbuffer_new();
  
  uint8_t pid = PID_CHAT;
  int16_t mlen = htons(message->slen);

  evbuffer_add(tempbuf, &pid, sizeof(pid));
  evbuffer_add(tempbuf, &mlen, sizeof(mlen));
  evbuffer_add(tempbuf, message->data, message->slen);

  evbuffer_add_buffer(output, tempbuf);
  evbuffer_free(tempbuf);
  
}
Example #22
0
File: article.c Project: ptt/pttbbs
static int
evbuffer_slice(struct evbuffer *buf, int offset, int size)
{
    int len = evbuffer_get_length(buf);
    if (offset + size > len)
	return -1;

    struct evbuffer *back = evbuffer_new();
    evbuffer_add_buffer(back, buf);

    if (evbuffer_add_reference(buf, evbuffer_pullup(back, len) + offset,
			       size, cleanup_evbuffer, back) == 0)
	return 0;

    evbuffer_free(back);
    return -1;
}
Example #23
0
File: hppm.cpp Project: hdhog/hppm
static void
readcb (struct bufferevent *bev, void *ctx)
{
  pcallback_info
    pcbi = (pcallback_info) ctx;
  struct bufferevent *
    partner = getpartner (bev, pcbi);
  struct evbuffer *
  src, *
    dst;
  char *
    data_out = NULL;
  size_t
    len;

  src = bufferevent_get_input (bev);
  len = evbuffer_get_length (src);
  if (!partner)
    {
      evbuffer_drain (src, len);
      return;
    }

  data_out = (char *) calloc (len + 1, sizeof (char));
  evbuffer_copyout (src, data_out, len);

  if (pcbi->logging)
    {
      logging_action (bev, pcbi, data_out);
    }
  if (pcbi->filtering)
    {
      filtering_action (bev, pcbi, data_out);
    }
  free (data_out);
  dst = bufferevent_get_output (partner);
  pcbi->packet_counter++;
  evbuffer_add_buffer (dst, src);
  if (evbuffer_get_length (dst) >= MY_MAX_OUTPUT)
  {
   bufferevent_setcb (partner, readcb, drained_writecb, eventcb, bev);
   bufferevent_setwatermark (partner, EV_WRITE, MY_MAX_OUTPUT / 2, MY_MAX_OUTPUT);
   bufferevent_disable (bev, EV_READ);
  }
}
Example #24
0
File: mhf.c Project: hehbhehb/mhf
int prepare_sample_page(CONN *conn, int code, const char *reason)
{
#define SAMPLE_FORMAT "<HTML><HEAD>\n" \
	    "<TITLE></TITLE>\n" \
	    "</HEAD><BODY>\n" \
	    "<H1>%d %s</H1>\n" \
	    "</BODY></HTML>\n"

	struct evbuffer *buf = evbuffer_new();
	evbuffer_add_printf(buf, SAMPLE_FORMAT, code, reason);	
	mhf_clear_headers(conn->output_headers);
	mhf_response_code(conn, code, reason);
	mhf_add_header(conn->output_headers, "Content-Type", "text/html");
 	evbuffer_add_buffer(conn->output_buffer, buf);	
	evbuffer_free(buf);
	return 0;
#undef SAMPLE_FORMAT
}
Example #25
0
void HttpServer::readCallback(struct bufferevent *bev, void *ctx)
{
    /* This callback is invoked when there is data to read on bev. */
    struct evbuffer *input = bufferevent_get_input(bev);
    struct evbuffer *output = bufferevent_get_output(bev);
    
    char *rawRequest = (char *)calloc(MAX_HTTP_REQUEST, sizeof(char));
    evbuffer_copyout(input, rawRequest, evbuffer_get_length(input));
    
    HttpRequest* request = new HttpRequest(rawRequest);
    evbuffer* response = request->parseHttp();
    
    delete request;
    free(rawRequest);
    
    /* Copy all the data response buffer to the output buffer. */
    evbuffer_add_buffer(output, response);
    evbuffer_free(response);
}
Example #26
0
static void readcb(struct bufferevent *bev, void *ctx)
{
        struct bufferevent *partner = ctx;
        struct evbuffer *src, *dst;
		char reader[MAXBUF];
        char *strtmp;

		src = bufferevent_get_input(bev);
        dst = bufferevent_get_output(partner);

		const size_t n = evbuffer_get_length(src);
		evbuffer_copyout(src, reader, n);

        printf("test : %s\n", reader);
		evbuffer_add_buffer(dst, src);
        
        if (evbuffer_get_length(dst) >= MAXBUF)
                bufferevent_setcb(partner, readcb, NULL, NULL, bev);
}
Example #27
0
static inline int trans_ack_data(struct evbuffer *out, spie_header_t *pro, struct evbuffer *buf){
    assert((out != NULL) && (pro != NULL));

    if(buf != NULL){
        pro->size = evbuffer_get_length(buf);
    }else{
        pro->size = 0;
    }

    log_info("cmd:%d ecode:%d size:%d %s\n", pro->cmdcode, pro->errcode, pro->size,
	    (buf == NULL)? "NULL":"buf");

    header_pack(pro);

    evbuffer_add(out, pro, sizeof(*pro));

    if(buf != NULL)
        evbuffer_add_buffer(out, buf);

    return 0;
}
Example #28
0
/**
 * This method sends login packets to a connected server via proxy
 * The sever connection is handled with player->bev
 * 
 * @remarks Scope: private
 * 
 * @param player player struct to connect with
 */
void send_proxylogin(struct PL_entry *player)
{
  struct evbuffer *output = bufferevent_get_output(player->sev);
  struct evbuffer *tempbuf = evbuffer_new();
  
  uint8_t pid = PID_LOGIN;
  int32_t entityid = htonl(8);
  int16_t l_su = htons(player->username->slen);
  int16_t unused2 = htons(0); // Future MOTD? mcstring.
  int64_t mapseed = 0;
  int8_t dimension = 0;
  
  evbuffer_add(tempbuf, &pid, sizeof(pid));
  evbuffer_add(tempbuf, &entityid, sizeof(entityid));
  evbuffer_add(tempbuf, &l_su, sizeof(l_su));
  evbuffer_add(tempbuf, player->username->data, player->username->slen);
  evbuffer_add(tempbuf, &unused2, sizeof(unused2));
  evbuffer_add(tempbuf, &mapseed, sizeof(mapseed));
  evbuffer_add(tempbuf, &dimension, sizeof(dimension));
  
  evbuffer_add_buffer(output, tempbuf);
  evbuffer_free(tempbuf);
}
Example #29
0
int
bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf)
{
	return (evbuffer_add_buffer(buf, bufev->input));
}
Example #30
0
static void
add_response (struct evhttp_request * req,
              struct tr_rpc_server  * server,
              struct evbuffer       * out,
              struct evbuffer       * content)
{
  const char * key = "Accept-Encoding";
  const char * encoding = evhttp_find_header (req->input_headers, key);
  const int do_compress = encoding && strstr (encoding, "gzip");

  if (!do_compress)
    {
      evbuffer_add_buffer (out, content);
    }
  else
    {
      int state;
      struct evbuffer_iovec iovec[1];
      void * content_ptr = evbuffer_pullup (content, -1);
      const size_t content_len = evbuffer_get_length (content);

      if (!server->isStreamInitialized)
        {
          int compressionLevel;

          server->isStreamInitialized = true;
          server->stream.zalloc = (alloc_func) Z_NULL;
          server->stream.zfree = (free_func) Z_NULL;
          server->stream.opaque = (voidpf) Z_NULL;

          /* zlib's manual says: "Add 16 to windowBits to write a simple gzip header
           * and trailer around the compressed data instead of a zlib wrapper." */
#ifdef TR_LIGHTWEIGHT
          compressionLevel = Z_DEFAULT_COMPRESSION;
#else
          compressionLevel = Z_BEST_COMPRESSION;
#endif
          deflateInit2 (&server->stream, compressionLevel, Z_DEFLATED, 15+16, 8, Z_DEFAULT_STRATEGY);
        }

      server->stream.next_in = content_ptr;
      server->stream.avail_in = content_len;

      /* allocate space for the raw data and call deflate () just once --
       * we won't use the deflated data if it's longer than the raw data,
       * so it's okay to let deflate () run out of output buffer space */
      evbuffer_reserve_space (out, content_len, iovec, 1);
      server->stream.next_out = iovec[0].iov_base;
      server->stream.avail_out = iovec[0].iov_len;
      state = deflate (&server->stream, Z_FINISH);

      if (state == Z_STREAM_END)
        {
          iovec[0].iov_len -= server->stream.avail_out;

#if 0
          fprintf (stderr, "compressed response is %.2f of original (raw==%zu bytes; compressed==%zu)\n",
                   (double)evbuffer_get_length (out)/content_len,
                   content_len, evbuffer_get_length (out));
#endif
          evhttp_add_header (req->output_headers,
                             "Content-Encoding", "gzip");
        }
      else
        {
          memcpy (iovec[0].iov_base, content_ptr, content_len);
          iovec[0].iov_len = content_len;
        }

      evbuffer_commit_space (out, iovec, 1);
      deflateReset (&server->stream);
    }
}