/*! \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); }
/*(*** http_connection_delete */ void http_connection_delete(void *svd, connection *cn) { server *sv; http *ht; sv = svd; ht = cn->cn_data; http_delete(ht); }
/*! \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; } } }
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; }