HTTP-Server-EV

 view release on metacpan or  search on metacpan

EV.xs  view on Meta::CPAN

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 )