Ethernet Shield slow communication

Hello,
I am using code below for communication between Ethernet Shield and PC and there is problem with speed.
Do you have any idea what is wrong?

bool ServiceClient(EthernetClient *client){ //ETHERNET
static boolean currentLineIsBlank = true;
char cl_char;
// file name from request including path + 1 of null terminator
char file_name[FILE_NAME_LEN + 1] = {0};  // requested file name
char http_req_type = 0;
char req_file_type = FILE_INVALID;
const char *file_types[] = {"text/html", "image/x-icon", "text/css", "application/javascript", "image/jpeg", "image/png", "image/gif", "text/plain"};
static char req_line_1[40] = {0};  // stores the first line of the HTTP request
static unsigned char req_line_index = 0;
static bool got_line_1 = false;
 if (client->available()) {   // client data available to read
 cl_char = client->read();
  if ((req_line_index < 39) && (got_line_1 == false)) {
   if ((cl_char != '\r') && (cl_char != '\n')) {
    req_line_1[req_line_index] = cl_char;
    req_line_index++;
    }
   else {
    got_line_1 = true;
    req_line_1[39] = 0;
   }
   }
 if ((cl_char == '\n') && currentLineIsBlank) {
// get HTTP request type, file name and file extension type index
  http_req_type = GetRequestedHttpResource(req_line_1, file_name, &req_file_type);
  if (http_req_type == HTTP_GET) {         // HTTP GET request
   if (req_file_type < FILE_INVALID) {      // valid file type
    webFile.open(file_name);        // open requested file
     if (webFile.available()) {
// send a standard http response header
      client->println("HTTP/1.1 200 OK");
      client->print("Content-Type: ");
      client->println(file_types[req_file_type]);
      client->println("Connection: close");
      client->println();
// send web page
       while(webFile.available()) {
        int num_bytes_read;
        char byte_buffer[255];
// get bytes from requested file
        num_bytes_read = webFile.read(byte_buffer,255);
// send the file bytes to the client
        client->write(byte_buffer, num_bytes_read);
        }
      webFile.close();
      }
      else { // failed to open file
      }
     }
     else { // invalid file type
     }
  }
  else if (http_req_type == HTTP_POST) { // a POST HTTP request was received
  }
  else { // unsupported HTTP request received
  }
req_line_1[0] = 0;
req_line_index = 0;
got_line_1 = false; // finished sending response and web page
return 1;
 }
 if (cl_char == '\n') {
  currentLineIsBlank = true;
  }
  else if (cl_char != '\r') {
   currentLineIsBlank = false;
   }
  }  // if (client.available())
return 0;
}

// extract file name from first line of HTTP request
char GetRequestedHttpResource(char *req_line, char *file_name, char *file_type){
char request_type = HTTP_invalid;  // 1 = GET, 2 = POST. 0 = invalid
char *str_token;
*file_type = FILE_INVALID;
str_token =  strtok(req_line, " ");    // get the request type
 if (strcmp(str_token, "GET") == 0) {
  request_type = HTTP_GET;
  str_token =  strtok(NULL, " ");      // get the file name
   if (strcmp(str_token, "/") == 0) {
    strcpy(file_name, "index.htm");
     *file_type = FILE_HTML;
   }
   else if (strlen(str_token) <= FILE_NAME_LEN) {
// file name is within allowed length
    strcpy(file_name, str_token);
// get the file extension
    str_token = strtok(str_token, ".");
    str_token = strtok(NULL, ".");
     if      (strcmp(str_token, "htm") == 0) {*file_type = 0;}
      else if (strcmp(str_token, "php") == 0) {*file_type = 1;}
      else if (strcmp(str_token, "css") == 0) {*file_type = 2;}
      else if (strcmp(str_token, "js")  == 0) {*file_type = 3;}
      else if (strcmp(str_token, "jpg") == 0) {*file_type = 4;}
      else if (strcmp(str_token, "csv") == 0) {*file_type = 5;}
      else if (strcmp(str_token, "txt") == 0) {*file_type = 6;}
      else {*file_type = 8;}
   }
   else { // file name too long
   }
 }
 else if (strcmp(str_token, "POST") == 0) {
  request_type = HTTP_POST;
 }
return request_type;
}

What size files are you uploading? How long does it take? The ethernet shield server will be significantly slower than a Linux/Apache server.

Sorry I forgot to wrote about details. I am generating .csv file with sensor data and time (RTC) and then generating graph using dygraphs. One graph is "dynamic" - I can choose refresh time and can stop refreshing. Second below is "drawing" history data if it is needed. Csv files are not too big - 15-20kb max. For example if I choose 20s refresh time on dynamic version I wait around 50-60s for generated graph.

Is it generating the cab file or sending it?

SurferTim: Is it generating the cab file or sending it?

For now it is generating temp .csv file and sending it to browser when I start refreshing graph on web page.