Exemple #1
0
static int new_lua( lua_State *L )
{
    lhttp_t *h = NULL;
    int maxurilen = (int)luaL_optinteger( L, 1, DEFAULT_MAX_URILEN );
    int maxhdrlen = (int)luaL_optinteger( L, 2, DEFAULT_MAX_HDRLEN );
    int maxhdr = (int)luaL_optinteger( L, 3, DEFAULT_MAX_HDR );

    if( maxurilen > UINT16_MAX ){
        return luaL_argerror( L, 1, "maxurilen must be less than UINT16_MAX" );
    }
    else if( maxhdrlen > UINT16_MAX ){
        return luaL_argerror( L, 2, "maxhdrlen must be less than UINT16_MAX" );
    }
    else if( maxhdr > UINT8_MAX ){
        return luaL_argerror( L, 3, "maxhdr must be less than UINT8_MAX" );
    }
    else if( ( h = lua_newuserdata( L, sizeof( lhttp_t ) ) ) &&
             ( h->r = http_alloc( maxhdr ) ) ){
        h->maxurilen = maxurilen;
        h->maxhdrlen = maxhdrlen;
        luaL_getmetatable( L, MODULE_MT );
        lua_setmetatable( L, -2 );
        return 1;
    }

    // got error
    lua_pushnil( L );
    lua_pushstring( L, strerror( errno ) );

    return 2;
}
Exemple #2
0
static void parse_response( void )
{
    char res[] =
        "HTTP/1.1 200 OK\r\n"
        "Server: GitHub.com\r\n"
        "Date: Sat, 27 Jun 2015 04:10:06 GMT\r\n"
        "Content-Type: text/html; charset=utf-8\r\n"
        "Transfer-Encoding: chunked\r\n"
        "Status: 200 OK\r\n"
        "Content-Security-Policy: default-src *; script-src assets-cdn.github.com collector-cdn.github.com; object-src assets-cdn.github.com; style-src 'self' 'unsafe-inline' 'unsafe-eval' assets-cdn.github.com; img-src 'self' data: assets-cdn.github.com identicons.github.com www.google-analytics.com collector.githubapp.com *.githubusercontent.com *.gravatar.com *.wp.com; media-src 'none'; frame-src 'self' render.githubusercontent.com gist.github.com www.youtube.com player.vimeo.com checkout.paypal.com; font-src assets-cdn.github.com; connect-src 'self' live.github.com wss://live.github.com uploads.github.com status.github.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com\r\n"
        "Cache-Control: no-cache\r\n"
        "Vary: X-PJAX\r\n"
        "X-UA-Compatible: IE=Edge,chrome=1\r\n"
        "Set-Cookie: logged_in=no; domain=.github.com; path=/; expires=Wed, 27 Jun 2035 04:10:06 -0000; secure; HttpOnly\r\n"
        "X-Request-Id: 8ea8d359ded1d2d30094d38b2a4e73d3\r\n"
        "X-Runtime: 0.037659\r\n"
        "X-GitHub-Request-Id: 999DDDE5:0A3A:102882A:558E221D\r\n"
        "Strict-Transport-Security: max-age=31536000; includeSubdomains; preload\r\n"
        "X-Content-Type-Options: nosniff\r\n"
        "X-XSS-Protection: 1; mode=block\r\n"
        "X-Frame-Options: deny\r\n"
        "Vary: Accept-Encoding\r\n"
        "X-Served-By: 1868c9f28a71d80b2987f48dbd1824a0\r\n"
        "\r\n";
    size_t len = sizeof( res );
    uint64_t i = 0;
    int rc = 0;
    float start = 0, end = 0, elapsed = 0;
    uint16_t maxhdrlen = UINT16_MAX;
    http_t *r = http_alloc(20);
    
    start = (float)clock()/CLOCKS_PER_SEC;
    for( i = 0; i < NLOOP; i++ ){
        rc = http_res_parse( r, res, len, maxhdrlen );
        assert( rc == HTTP_SUCCESS );
        assert( http_version(r) == HTTP_V11 );
        assert( http_status(r) == HTTP_OK );
        assert( r->nheader == 19 );
        http_init( r );
    }
    end = (float)clock()/CLOCKS_PER_SEC;
    elapsed = end - start;
    
    http_free( r );
    
    printf("\tElapsed %f seconds.\n", elapsed );
    printf("\t%0.9f -> %f req/sec.\n", elapsed / NLOOP, 1.00000 / ( elapsed / NLOOP ) );
}
Exemple #3
0
static void parse_request( void )
{
    char req[] = 
        "GET /mah0x211/libhttp HTTP/1.1\r\n"
        "Host: github.com\r\n"
        "Connection: keep-alive\r\n"
        "Keep-Alive: 115\r\n"
        "Cache-Control: max-age=0\r\n"
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"
        "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36\r\n"
        "Accept-Encoding: gzip, deflate, sdch\r\n"
        "Accept-Language: ja,en-US;q=0.8,en;q=0.6\r\n"
        "Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\n"
        "Cookie: __utma=xxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.x; _octo=XXX.X.XXXXXXXX.XXXXXXXXXX; logged_in=XX; _ga=XXX.X.XXXXXXXXX.XXXXXXXXXX\r\n"
        "\r\n";
    size_t len = sizeof( req ) + 1;
    uint64_t i = 0;
    int rc = 0;
    float start = 0, end = 0, elapsed = 0;
    uint16_t maxurilen = UINT16_MAX;
    uint16_t maxhdrlen = UINT16_MAX;
    uint8_t nheader = 20;
    http_t *r = http_alloc( nheader );
    
    start = (float)clock()/CLOCKS_PER_SEC;
    for( i = 0; i < NLOOP; i++ ){
        rc = http_req_parse( r, req, len, maxurilen, maxhdrlen );
        assert( rc == HTTP_SUCCESS );
        assert( http_method(r) == HTTP_MGET );
        assert( http_version(r) == HTTP_V11 );
        assert( r->nheader == 10 );
        //keys( r, req );
        http_init( r );
    }
    end = (float)clock()/CLOCKS_PER_SEC;
    elapsed = end - start;
    
    http_free( r );
    
    printf("\tElapsed %f seconds.\n", elapsed );
    printf("\t%0.9f -> %f req/sec.\n", elapsed / NLOOP, 1.00000 / ( elapsed / NLOOP ) );
}
Exemple #4
0
int http_parse_packet(char *tcp_payload, int length, http_packet *http_t){
	
	if(length == 0 || http_t == NULL || tcp_payload == NULL)
		return -1;
		
	http_alloc(http_t);
	int no_data = 0;
	char *aux_hdr = NULL;
	struct _internal_http_packet *http = *http_t;
	http->headers = NULL;
	http->data = NULL;
	http->op = http_which_method(tcp_payload);
	if(http->op == ERR){
		return -1;
	}
	
	char *cadena = (char*) calloc(length+1, sizeof(char));
	strncpy(cadena, tcp_payload, length);
	tcp_payload = cadena;

	if(http->op != RESPONSE){
		sscanf(tcp_payload, "%32s %2048s %32s\r\nHost: %256s\r\n", http->method, http->uri, http->version, http->host);
	}else{
		strcpy(http->method, "RESPONSE");
		sscanf(tcp_payload, "%32s %d %[^\n]\r\n", http->version, &http->response_code, http->response_msg);
		char *hdr = strstr(tcp_payload, "\r\n");
		if(hdr == NULL){ 
			return -1;
		}
		
		char *data = strstr(tcp_payload, "\r\n\r\n");
		if(data == NULL){
			no_data = 1;
			data = tcp_payload+strlen(tcp_payload);
		}

		//Copy HTTP headers
		if(no_data == 0){
			data+=2; //Jump \r\n, THE HEADERS MUST END WITH \r\n
		}
		
		hdr+=2; //Jump \r\n
		aux_hdr = (char*) calloc(((data-hdr)+1),sizeof(char));
		if(aux_hdr == NULL){
			return -1;
		}
		memcpy(aux_hdr, hdr, data-hdr);
		
		if(no_data == 0 && *data == '\r')
			data+=2;	//Jump \r\n of the empty line

		http->headers = (http_header *) calloc(sizeof(http_header), 1);
		if(http->headers == NULL){
			return -1;
		}
		
		if(getLines(aux_hdr, http->headers) == -1){
			return -1;
		}
		
		if(no_data == 0){
			//Copy HTTP data
			// http->data = strdup(data);
			// if(http->data == NULL){
			// 	return -1;
			// }
		}
	}
	free(cadena);
	return 0;
}