HTTP-Server-EV
view release on metacpan or search on metacpan
start_listen ( self )
SV* self
CODE:
MAGIC *mg ;
for (mg = SvMAGIC (self); mg; mg = mg->mg_moremagic) {
if (mg->mg_type == PERL_MAGIC_ext && mg->mg_virtual == NULL){
ev_io_start(EV_DEFAULT, (ev_io *) mg->mg_ptr);
break;
}
}
void
stop_req( saved_to )
int saved_to
CODE:
struct req_state *state = accepted[saved_to];
state->reading |= 1 << 7; // 7 bit set - suspended
if (state->timeout != 0.) ev_timer_stop(EV_DEFAULT, &state->timer);
ev_io_stop(EV_DEFAULT, &(state->io));
SV*
start_req( saved_to )
int saved_to
CODE:
struct req_state *state = accepted[saved_to];
state->reading &= ~(1 << 7); // 7 bit null - working
ev_io_start(EV_DEFAULT, &(state->io));
if (state->timeout != 0.) ev_timer_again(EV_DEFAULT, &state->timer);
// if(state->buffer_pos)
// ev_feed_fd_event(EV_DEFAULT, &(state->io), 0);
// No ev_feed_fd_event in EV XS API :(
// Pass fd and do it from perl
RETVAL = state->buffer_pos ? newSViv(state->io.fd) : newSV(0);
OUTPUT:
RETVAL
void
drop_req( saved_to )
int saved_to
CODE:
accepted[saved_to]->reading = REQ_DROPED_BY_PERL;
ev_io_start(EV_DEFAULT, &(accepted[saved_to]->io));
#define URLDECODE_READ_CHAR 2
#define URLDECODE_READ_FIRST_PART 3
#define URLDECODE_READ_SECOND_PART 4
void
url_decode( encoded )
SV* encoded
PPCODE:
SV* output = newSV( 100 );
STRLEN len;
char *input = SvPV(encoded, len);
char state = URLDECODE_READ_CHAR;
char byte = (char)NULL;
int pos = 0;
for(; pos < len ; pos++){
if( input[pos] == '%' ){
state = URLDECODE_READ_FIRST_PART;
byte = (char)NULL;
}else
if(state == URLDECODE_READ_CHAR){
sv_catpvn(output, input+pos, 1);
}else{
if(state == URLDECODE_READ_FIRST_PART){
byte = (isdigit(input[pos]) ? input[pos] - '0' : tolower(input[pos]) - 'a' + 10) << 4;
state = URLDECODE_READ_SECOND_PART;
}else{ // state == URLDECODE_READ_SECOND_PART
byte |= (isdigit(input[pos]) ? input[pos] - '0' : tolower(input[pos]) - 'a' + 10);
sv_catpvn(output, &byte, 1);
byte = (char)NULL;
state = URLDECODE_READ_CHAR;
}
}
};
STRLEN out_len;
char *out_ptr = SvPV(output, out_len);
XPUSHs(sv_2mortal(output));
XPUSHs(sv_2mortal(newSViv( is_utf8_string( out_ptr , out_len) )));
( run in 0.967 second using v1.01-cache-2.11-cpan-5511b514fd6 )