Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
// 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;
}