Ejemplo n.º 1
0
/*! \brief Release the connection's resources */
static void hc_delete(HttpConnection* connection) {
    //HttpServer* server = connection->server;

    log(INFO, "Http connection closed socket=%p", connection->sock);

    /* call the close callback if there is any */
    if(connection->close_callback != NULL) {
        connection->close_callback(connection->close_data);
    }

    /* delete the socket */
    sock_delete(connection->sock);

    /* erase the connection from the list of connections */
	list_erase(connection->it);

    /* free header */
    if(connection->header != NULL) {
        http_delete(connection->header);
        connection->header = NULL;
    }

    /* free memory */
    HttpConnection_free(connection);
}
Ejemplo n.º 2
0
/*(*** http_connection_delete */
void http_connection_delete(void *svd, connection *cn)
{
  server *sv;
  http *ht;

  sv = svd;
  ht = cn->cn_data;

  http_delete(ht);
}
Ejemplo n.º 3
0
/*! \brief Process an incoming message */
static void hc_process(HttpConnection* connection) {
    const char* tmp;
    const char* data;
    int content_size, header_size;
	HttpRequest hr;
    HttpServer* server = connection->server;

    /* get the content lenght */
    tmp = http_get_field(connection->header, "Content-Length");
    if(tmp == NULL) {
        content_size = 0;
    } else {
        content_size = atoi(tmp);
    }

    /* find the beginning of the content */
    data = strstr(connection->buffer, HTTP_LINE_SEP HTTP_LINE_SEP) + 4;

    header_size = data - connection->buffer;


    /* check if the message is bigger than current buffer size */
    if(content_size + header_size >= MAX_BUFFER_SIZE) {
        log(WARNING, "Message is too big");
        hc_report_error(connection, "Message is too big");
        return;
    }

    /* check if everything is here */
    if(connection->buffer_size >= header_size + content_size) {

        log(INFO, "Processing request Content-Length=%d", content_size);

        /* inform the request */
		hr.connection = connection;
		hr.header = connection->header;
		hr.data = data;
		hr.data_size = content_size;
		server->callback(server->user_data, &hr);

        /* free the header, we don't need it anymore */
		http_delete(connection->header);
		connection->header = NULL;

        /* move the buffer */
        if(connection->buffer_size > header_size + content_size) {
            memmove(connection->buffer, connection->buffer + header_size +
                    content_size, connection->buffer_size - header_size -
                    content_size);
            connection->buffer_size -= header_size + content_size;
        } else {
            connection->buffer_size = 0;
        }
    }
}
Ejemplo n.º 4
0
int main(int argc,char* argv[]) 
{
	int  ret,lg,blocksize,r,i;
	char typebuf[70];
	char *data=NULL,*filename=NULL,*proxy=NULL;
	int data_len = 0;
	char *type = NULL;
	enum {
		ERR,
		DOPUT,
		DOGET,
		DODEL,
		DOHEA,
		DOPOST
	} todo=ERR;
	
	if (argc!=3) {
		fprintf(stderr,"usage: http <cmd> <url>\n\tby <*****@*****.**>\n");
		return 1;
	}

	i=1;
	 
	if (!strcasecmp(argv[i],"put")) {
		todo=DOPUT;
	} else if (!strcasecmp(argv[i],"get")) {
		todo=DOGET;
	} else if (!strcasecmp(argv[i],"delete")) {
		todo=DODEL;
	} else if (!strcasecmp(argv[i],"head")) {
		todo=DOHEA;
	} else if (!strcasecmp(argv[i],"post")) {
		todo=DOPOST;
	}

	if (todo==ERR) {
		fprintf(stderr,
			"Invalid <cmd> '%s',\nmust be "
			"'put', 'get', 'post', 'delete', or 'head'\n",
			argv[i]
		);
		return 2;
	}

	i++;
	
	if ((proxy=getenv("http_proxy"))) {
		ret=http_proxy_url(proxy);
		if (ret<0) { 
			return ret;
		}
	}
	
	ret=http_parse_url(argv[i],&filename);
	if (ret<0) {
		return ret;
	}
	
	switch (todo) {
	/* *** PUT  *** */
	case DOPUT:
		fprintf(stderr,"reading stdin...\n");
		/* read stdin into memory */
		blocksize=16384;
		lg=0;  

		if (!(data=malloc(blocksize))) {
			return 3;
		}

		while (1) {
			r=read(0,data+lg,blocksize-lg);
			if (r<=0) break; 
			lg+=r;
			if ((3*lg/2)>blocksize) {
				blocksize *= 4;
				fprintf(stderr,
				"read to date: %9d bytes, reallocating buffer to %9d\n",
				lg,blocksize);	
				if (!(data=realloc(data,blocksize))) {
					return 4;
				}
			}
		}

		fprintf(stderr,"read %d bytes\n",lg);
		ret=http_put(filename,data,lg,0,NULL);
		fprintf(stderr,"res=%d\n",ret);
		break;
	/* *** GET  *** */
	case DOGET:
		ret=http_get(filename,&data,&lg,typebuf);
		fprintf(stderr,"res=%d,type='%s',lg=%d\n",ret,typebuf,lg);
		fwrite(data,lg,1,stdout);
		fprintf(stderr, "%s\n", data);
		break;
	/* *** HEAD  *** */
	case DOHEA:
		ret=http_head(filename,&lg,typebuf);
		fprintf(stderr,"res=%d,type='%s',lg=%d\n",ret,typebuf,lg);
		break;
	/* *** DELETE  *** */
	case DODEL:
		ret=http_delete(filename);
		fprintf(stderr,"res=%d\n",ret);
		break;
	case DOPOST:
		ret = http_post(filename, "your_name=1", 11, NULL, &data, &data_len, &type);
		fprintf(stderr,"res=%d\n",ret);
		fprintf(stderr,"%s\n", type);
		fprintf(stderr,"data: %s\n", data);
		break;
	/* impossible... */
	default:
		fprintf(stderr,"impossible todo value=%d\n",todo);
		return 5;
	}
	
	if (type) {
		free(type);
	}

	if (data) {
		 free(data);
	}

	free(filename);
	 
	return ( (ret==201) || (ret==200) ) ? 0 : ret;
}