static int
send_file_to_socket(const char *file, int fd)
{
    FILE *fp;
    char buffer[MAX_BUF_SIZE];
    int bytes_read;
    int bytes_written;
    int err;
    size_t file_size;
    const char *end_of_msg = "\r\n";
    const char *file_not_found = "<html><head><title>ERROR 404</title><body><p>I ain't got this file dude</p></body><html>";
    err = 0;
    fp = fopen(file, "r");
    if (fp) {
        fseek(fp, 0, SEEK_END);
        file_size = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        err = write_response_header(fd, 
                                    file_size, 
                                    "200 OK", 
                                    "HTTP/1.1",
                                    "text/html", 
                                    "close");
        if (!err) {
            do {
                bytes_read = fread(buffer, 
                                   1, 
                                   sizeof(buffer),
                                   fp);
                if (bytes_read <= 0) {
                    if (bytes_read < 0) {
                        perror("mod_file - fread");
                    }
                    break;
                } else {
                    bytes_written = write(fd, buffer, bytes_read);
                    if (bytes_written <= 0) {
                        perror("mod_file - write\n");
                        break;
                    }
                }
            } while (1);
        }
        fclose(fp);
    } else {
        err = write_response_header(fd,
                                    strlen(file_not_found),
                                    "404 Not Found",
                                    "HTTP/1.1",
                                    "text/html",
                                    "close");
        err = (write(fd, file_not_found, strlen(file_not_found)) <= 0 ? 1 : 0);
    }

    if (!err) {
        err = (write(fd, end_of_msg, strlen(end_of_msg)) <= 0 ? 1 : 0);
    }

    return err;
}
Exemple #2
0
void ws_connection::read_header() {

  if (!tcp_connection_.read()) {
    return;
  }

  if (tcp_connection_.read_bytes() > max_header_size) {
    LOG(ERROR) << "client header too long, closing connection";
    tcp_connection_.close_connection = true;
    return;
  }

  std::string header(read_ws_header(tcp_connection_));

  if (!ws_util_.find_header_end(header))
  {
    return;
  }

  if (ws_util_.parse_header(header)) {
    write_response_header();
  } else {
    tcp_connection_.close_connection = true;
  }
}
Exemple #3
0
static int parse_request(struct fd_state *state) {
    assert(state && state->read_buf);
	//printf("%s", state->read_buf);
    char *path = strchr(state->read_buf, '/');
    if (path == NULL)
        return -1;
    
    char *scookies = strstr(path, "Cookie: ");
    if (scookies)
        scookies += 8;
    char *space = strchr(path, ' ');
    if (space) {
        *space = 0;
    }
    char *question = strchr(path, '?');
    if (question)
        *question = 0;
    urldecode(path);
    
    char *sparams = NULL;
    if (question)
        sparams = question + 1;
    
    int iscalled = call_callback(state, path, sparams, scookies);
    if (iscalled) {
        return 0;
    }
    const char *dot = strrchr(path, '.');
    if (dot) {  //file
        const char *ext = dot + 1;
        const char *mime = "text/plain";
        if (strcmp(ext, "html") == 0 || strcmp(ext, "htm") == 0) {
            mime = "text/html";
        } else if (strcmp(ext, "css") == 0) {
            mime = "text/css";
        } else if (strcmp(ext, "js") == 0) {
            mime = "text/javascript";
        } else if (strcmp(ext, "png") == 0) {
            mime = "image/png";
        } else if (strcmp(ext, "jpeg") == 0 || strcmp(ext, "jpg") == 0 || strcmp(ext, "jpe") == 0 ) {
            mime = "image/jpeg";
        } else if (strcmp(ext, "gif") == 0) {
            mime = "image/gif";
        }
        char abspath[1024];
        strncpy(abspath, _root_dir, sizeof(abspath));
        strncat(abspath, path, sizeof(abspath)-strlen(path));
        state->pf = fopen(abspath, "r");
        if (state->pf) {
            fseek(state->pf, 0, SEEK_END);
            write_response_header(state, mime, ftell(state->pf), "");
            rewind(state->pf);
        } else {
            write_response_error(state);
        }
    } else { //func
        write_response_error(state);
    }
    return 0;
}
Exemple #4
0
int call_callback(struct fd_state *state, const char *path, char *sparams, char *scookies) {
    assert(state && path);
    struct callback_elem *elem = callback_head;
    while (elem) {
        if (strcmp(path, elem->path) == 0) {
            struct lh_response response;
            response.header[0] = 0;
            response.header_len = 0;
			response.body[0] = 0;
			response.body_len = 0;
            
            struct lh_kv_elem *params = parse_url_params(sparams);
            struct lh_kv_elem *cookies = parse_cookies(scookies);
            elem->callback(params, cookies, &response);
            free_kvs(params);
            free_kvs(cookies);
            
            write_response_header(state, "application/json", response.body_len, response.header);
			if (response.header_len > 0)
				write_to_buf(state, response.header, response.header_len);
            if (response.body_len > 0)
                write_to_buf(state, response.body, response.body_len);
            return 1;
        }
        elem = elem->next;
    }
    return 0;
}