bool MultipartParser::parse(const uint8_t *d, size_t l, const String &ct, bool files) { Reader r(ct.c_str(), ct.length()); if (!parseContentType(r)) { return false; } readFiles = files; data = Reader((const char *)d, l); origData = Reader((const char *)d, l); return parseBody(); }
bool MultipartParser::parse(const uint8_t *d, size_t l, bool files) { data = Reader((const char *)d, l); origData = Reader((const char *)d, l); Reader str = readLine(); while (!str.empty()) { if (str.is("Content-Type:")) { str.offset("Content-Type:"_len); if (!parseContentType(str)) { return false; } } str = readLine(); } if (contentType.empty() || boundary.empty()) { return false; } readFiles = files; return parseBody(); }
// Worker thread function void * worker(void * arg) { request_queue_t job; char buf[MAX_FILE_SIZE]; char contentType[50]; ssize_t bytes_read; int num_jobs = 0; int fd; int offset = 0; while(1){ if( retrieve_request (&job)) { num_jobs++; //increment job count if (job.m_szRequest[0] == '/'){ offset=1; } fd = open(job.m_szRequest + offset, O_RDONLY); if( (bytes_read = read(fd, buf, MAX_FILE_SIZE) ) == -1){ pthread_mutex_lock(&log_mtx); if( (web_server_log = fopen("web_server_log","a") ) == NULL){ perror("Failed to open file"); } if(!fprintf(web_server_log,"[%u][%d][%d][%s][%d]\n", pthread_self(), num_jobs, job.m_socket, job.m_szRequest, "File could not be read." )){ perror("fprintf failed: "); } fclose(web_server_log); pthread_mutex_unlock(&log_mtx); return_error(job.m_socket, buf); perror("File could not be read."); } else { switch ( parseContentType(job.m_szRequest) ) { case 0: strcpy(contentType, "text/html"); break; case 1: strcpy(contentType, "image/jpeg"); break; case 2: strcpy(contentType, "image/gif"); break; case 3: strcpy(contentType, "text/plain"); break; default: perror("retrieve_request failed miserably."); } pthread_mutex_lock(&log_mtx); if( (web_server_log = fopen("web_server_log","a") ) == NULL){ perror("Failed to open file"); } if(!fprintf(web_server_log,"[%u][%d][%d][%s][%d]\n", pthread_self(), num_jobs, job.m_socket, job.m_szRequest, bytes_read )){ perror("fprintf failed: "); } fclose(web_server_log); pthread_mutex_unlock(&log_mtx); close(fd); return_result(job.m_socket, contentType, buf, bytes_read); } } } }
// returns false on bad mime bool HttpMime::parse(char *mime, int32_t mimeLen, Url *url) { #ifdef _VALGRIND_ VALGRIND_CHECK_MEM_IS_DEFINED(mime,mimeLen); #endif // reset locUrl to 0 m_locUrl.reset(); // return if we have no valid complete mime if (mimeLen == 0) { return false; } // status is on first line m_status = -1; // skip HTTP/x.x till we hit a space char *p = mime; char *pend = mime + mimeLen; while (p < pend && !is_wspace_a(*p)) p++; // then skip over spaces while (p < pend && is_wspace_a(*p)) p++; // return false on a problem if (p == pend) return false; // then read in the http status m_status = atol2(p, pend - p); // if no Content-Type: mime field was provided, assume html m_contentType = CT_HTML; // assume default charset m_charset = NULL; m_charsetLen = 0; // skip over first line getNextLine(); while (getNextLine()) { const char *field = NULL; size_t fieldLen = 0; if (getField(&field, &fieldLen)) { if (parseContentEncoding(field, fieldLen)) { continue; } if (parseContentLength(field, fieldLen)) { continue; } if (parseContentType(field, fieldLen)) { continue; } if (parseLocation(field, fieldLen, url)) { continue; } if (parseSetCookie(field, fieldLen)) { continue; } // add parsing of other header here } } return true; }