int main(int argc, char **argv) { httpc_conn_t *conn; /* Client connection object */ hresponse_t *res; /* Response object **/ herror_t status; FILE *f; size_t size; char url[50], file[50], id[50], content_type[50]; char buffer[MAX_BUFFER_SIZE+1]; /* Check usage */ if (argc < 5) { fprintf(stderr, "usage %s <url> <file> <id> <content-type>\n", argv[0]); exit(1); } /* Set log level to see more information written by the library */ // log_set_level(NANOHTTP_LOG_VERBOSE); /* Initialize httpc module */ if ((status = httpc_init(argc, argv)) != H_OK) { fprintf(stderr, "Cannot init httpc (%s)\n", herror_message(status)); herror_release(status); return 1; } /* Create the client connection object */ conn = httpc_new(); httpc_set_header(conn, HEADER_TRANSFER_ENCODING, TRANSFER_ENCODING_CHUNKED); /* Open connection for mime */ if ((status = httpc_mime_begin(conn, argv[1], argv[3], "", argv[4])) != H_OK) { fprintf(stderr, "Can not start MIME: %s\n", herror_message(status)); herror_release(status); exit(1); } if (!send_file(conn, argv[2], argv[3], argv[4])) { fprintf(stderr, "send_file failed\n"); exit(1); } while (1) { printf("Enter filename ['.' for finish]: "); gets(file); if (!strcmp(file, ".")) break; printf("Enter part id:"); gets(id); printf("Enter content-type:"); gets(content_type); if (!send_file(conn, file, id, content_type)) exit(1); } if ((status = httpc_mime_end(conn, &res)) != H_OK) { fprintf(stderr, "httpc_mime_end failed (%s)\n", herror_message(status)); herror_release(status); exit(1); } /* Show response */ show_response(res); /* clean up*/ hresponse_free(res); httpc_free(conn); return 0; }
herror_t hresponse_new_from_socket(hsocket_t *sock, hresponse_t ** out) { int i = 0, count; herror_t status; hresponse_t *res; attachments_t *mimeMessage; char buffer[MAX_HEADER_SIZE + 1]; read_header: /* for errorcode: 100 (continue) */ /* Read header */ while (i < MAX_HEADER_SIZE) { if ((status = hsocket_read(sock, &(buffer[i]), 1, 1, &count)) != H_OK) { log_error("Socket read error"); return status; } buffer[i + 1] = '\0'; /* for strmp */ if (i > 3) { if (!strcmp(&(buffer[i - 1]), "\n\n") || !strcmp(&(buffer[i - 2]), "\n\r\n")) break; } i++; } /* Create response */ res = _hresponse_parse_header(buffer); if (res == NULL) { log_error("Header parse error"); return herror_new("hresponse_new_from_socket", GENERAL_HEADER_PARSE_ERROR, "Can not parse response header"); } /* Chec for Errorcode: 100 (continue) */ if (res->errcode == 100) { hresponse_free(res); i = 0; goto read_header; } /* Create input stream */ res->in = http_input_stream_new(sock, res->header); /* Check for MIME message */ if ((res->content_type && !strcmp(res->content_type->type, "multipart/related"))) { status = mime_get_attachments(res->content_type, res->in, &mimeMessage); if (status != H_OK) { /* TODO (#1#): Handle error */ hresponse_free(res); return status; } else { res->attachments = mimeMessage; http_input_stream_free(res->in); res->in = http_input_stream_new_from_file(mimeMessage->root_part->filename); if (!res->in) { /* TODO (#1#): Handle error */ } else { /* res->in->deleteOnExit = 1; */ } } } *out = res; return H_OK; }