Exemplo n.º 1
0
//*************************************************
int http_parse_request_body(http_request_t *request) {
    char ch, *p, *q;
    
    enum {
        header_start = 0,
        header_key,
        spaces_before_colon,
        spaces_after_colon,
        header_value,
        header_cr,
        header_crlf,
        header_crlfcr
    } state;
    
    state = request->state;
    debug("ready to parese request body, start = %d, last= %d", (int)request->pos, (int)request->last);
    
    http_header_t *hd;
    
    for (p = request->pos; p < request->last; p++) {
        ch = *p;
        
        switch (state) {
        case header_start:
            if (ch == CR || ch == LF)
                break;
            request->cur_header_key_start = p;
            state = header_key;
            break;
        
        case header_key:
            if (ch == ' ') {
                request->cur_header_key_end = p;
                state = spaces_before_colon;
                break;
            }
            if (ch == ':') {
                request->cur_header_key_end = p;
                state = spaces_after_colon;
                break;
            }
            break;
            
        case spaces_before_colon:
            if (ch == ' ')
                break;
            else if (ch == ':') {
                state = spaces_after_colon;
                break;
            }
            else
                return HTTP_PARSE_INVALID_HEADER;
                
        case spaces_after_colon:
            if (ch == ' ')
                break;
            state = header_value;
            request->cur_header_value_start = p;
            break;
            
        case header_value:
            if (ch == CR) {
                request->cur_header_value_end = p;
                state = header_cr;
            }
            if (ch == LF) {
                request->cur_header_value_end = p;
                state = header_crlf;
            }
            break;
            
        case header_cr:
            if (ch == LF) {
                state = header_crlf;
                hd = (http_header_t *)malloc(sizeof(http_header_t));
                hd->key_start = request->cur_header_key_start;
                hd->key_end = request->cur_header_key_end;
                hd->value_start = request->cur_header_value_start;
                hd->value_end = request->cur_header_value_end;
                list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t));
                node->ptr = (void *)hd;
                list_tail_add(request->head, node);
                request->num_headers++;
                break;
            }
            else {
                return HTTP_PARSE_INVALID_HEADER;
            }
            
        case header_crlf:
            if (ch == CR) {
                state = header_crlfcr;
            }
            else {
                request->cur_header_key_start = p;
                state = header_key;
            }
            break;
            
        case header_crlfcr:
            switch (ch) {
            case LF:
                goto done;
            default:
                return HTTP_PARSE_INVALID_HEADER;
            }
            break;
        }
    }
    
    request->pos = p;
    request->state = state;
    return SERVER_AGAIN;
    
done:
    request->pos = p + 1;
    request->state = header_start;
    return SERVER_OK;
}
Exemplo n.º 2
0
os_status  osTasksInitialize(int max_task)
{
    int counter;
    os_ecb_t *new_event;
    os_status status;
 
    /* Always reserve task idle for background. */
    g_total_tasks_number = (uint32_t)max_task;
 
    OS_ASSERT_COND(TASK_IDLE_ID == 0);
 
    INIT_LIST_OBJECT(&g_unused_tasks_list);
    INIT_LIST_OBJECT(&g_unused_events_list);
    INIT_LIST_OBJECT(&g_sorted_expiration_list);

    /* Perform core specific tasks initializations */
    status = coreTasksInitialize();
    OS_ASSERT_COND(status == OS_SUCCESS);

    /* Initialize a task with dummy lowest + 1priority to prevent if != NULL in taskHighestSet. */
    g_running_task = osMalloc(sizeof(os_tcb_t), OS_MEM_LOCAL);
 
    if(g_running_task == NULL)
    {
        RETURN_ERROR(OS_ERR_NO_MEMORY);
    }
 
    g_running_task->priority = 32;

    /* Allocate ECB structures. */
    if(g_total_events_number > 0)
    {
        g_all_events_array = osMalloc(g_total_events_number * sizeof(os_ecb_t), OS_MEM_LOCAL);

        if (g_all_events_array == NULL)
        {
            RETURN_ERROR(OS_ERR_NO_MEMORY);
        }
    }

    /* Connect all the ECBs in a doubly linked list. */
    for (counter = 0; counter < g_total_events_number; counter++)
    {
        new_event = ((os_ecb_t *)g_all_events_array) + counter;
        new_event->event_id = (uint32_t)counter;
        new_event->event_type = EVENT_TYPE_UNUSED;
        list_tail_add(&new_event->event_list, &g_unused_events_list);
    }

    /* Allocate TCB structures. */
    g_all_tasks_array =  osMalloc(g_total_tasks_number * sizeof(os_tcb_t), OS_MEM_LOCAL);

    if (g_all_tasks_array == NULL)
    {
        RETURN_ERROR(OS_ERR_NO_MEMORY);
    }

    /* Connect all the TCBs in a doubly linked list. */
    /* first one is reserved for background. */

    g_all_tasks_array [TASK_IDLE_ID].task_event      = NULL;
    g_all_tasks_array [TASK_IDLE_ID].task_message    = 0;
    g_all_tasks_array [TASK_IDLE_ID].task_status     = OS_TASK_ACQUIRED;
    g_all_tasks_array [TASK_IDLE_ID].expiration_tick = 0;
    g_all_tasks_array [TASK_IDLE_ID].task_id         = TASK_IDLE_ID;
    g_all_tasks_array [TASK_IDLE_ID].task_handle     = 0;
    g_all_tasks_array [TASK_IDLE_ID].private_data    = 0;
 
    /* TASK_IDLE_ID must be 0 in order to refrain from holes in the linked list */
    OS_ASSERT_COMPILER_COND(TASK_IDLE_ID == 0);

    OS_ASSERT_COMPILER_COND(g_total_tasks_number > 0);
    for (counter = (TASK_IDLE_ID + 1); counter < g_total_tasks_number ; counter++)
    {
        g_all_tasks_array [counter].task_event      = NULL;
        g_all_tasks_array [counter].task_message    = 0;
        g_all_tasks_array [counter].task_status     = OS_TASK_UNUSED;
        g_all_tasks_array [counter].expiration_tick = 0;
        g_all_tasks_array [counter].task_id         = (uint32_t)(counter+1) ;
        g_all_tasks_array [counter].task_handle     = (os_task_handle)counter;
        g_all_tasks_array [counter].private_data    = 0;
        list_tail_add(&(g_all_tasks_array + counter)->pend_list, &g_unused_tasks_list);
    }

    /* Init empty ready list for each priority. */
    for (counter = 0; counter < OS_NUM_OF_PRIORITIES; counter++)
    {
        INIT_LIST_OBJECT(&g_ready_tasks[counter]);
    }

    return OS_SUCCESS;
}