void download_file(void)
{
- char buf[256];
+ wcsession *WCC = WC;
+ StrBuf *Buf;
off_t bytes;
- char content_type[256];
- char *content = NULL;
+ StrBuf *ContentType = NewStrBufPlain(HKEY("application/octet-stream"));
/* Setting to nonzero forces a MIME type of application/octet-stream */
int force_download = 1;
- safestrncpy(buf, ChrPtr(WC->UrlFragment2), sizeof buf);
- unescape_input(buf);
- serv_printf("OPEN %s", buf);
- serv_getln(buf, sizeof buf);
- if (buf[0] == '2') {
- bytes = extract_long(&buf[4], 0);
- content = malloc(bytes + 2);
- if (force_download) {
- strcpy(content_type, "application/octet-stream");
- }
- else {
- extract_token(content_type, &buf[4], 3, '|', sizeof content_type);
+ Buf = NewStrBuf();
+ StrBufUnescape(WCC->UrlFragment2, 1);
+ serv_printf("OPEN %s", ChrPtr(WCC->UrlFragment2));
+ StrBuf_ServGetlnBuffered(Buf);
+ if (GetServerStatus(Buf, NULL) == 2) {
+ StrBufCutLeft(Buf, 4);
+ bytes = StrBufExtract_long(Buf, 0, '|');
+ if (!force_download) {
+ StrBufExtract_token(ContentType, Buf, 3, '|');
}
output_headers(0, 0, 0, 0, 0, 0);
- read_server_binary(WC->WBuf, bytes);
+ read_server_binary(WCC->WBuf, bytes, Buf);
serv_puts("CLOS");
- serv_getln(buf, sizeof buf);
- http_transmit_thing(content_type, 0);
- free(content);
+ StrBuf_ServGetlnBuffered(Buf);
+ http_transmit_thing(ChrPtr(ContentType), 0);
} else {
- hprintf("HTTP/1.1 404 %s\n", &buf[4]);
+ StrBufCutLeft(Buf, 4);
+ hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf));
output_headers(0, 0, 0, 0, 0, 0);
hprintf("Content-Type: text/plain\r\n");
- wprintf(_("An error occurred while retrieving this file: %s\n"), &buf[4]);
+ wprintf(_("An error occurred while retrieving this file: %s\n"),
+ ChrPtr(Buf));
end_burst();
}
+ FreeStrBuf(&ContentType);
+ FreeStrBuf(&Buf);
}
*/
void output_image(void)
{
- char blank_gif[SIZ];
+ StrBuf *Buf;
wcsession *WCC = WC;
- char buf[SIZ];
off_t bytes;
const char *MimeType;
+ Buf = NewStrBuf();
serv_printf("OIMG %s|%s", bstr("name"), bstr("parm"));
- serv_getln(buf, sizeof buf);
- if (buf[0] == '2') {
- bytes = extract_long(&buf[4], 0);
+ StrBuf_ServGetlnBuffered(Buf);
+ if (GetServerStatus(Buf, NULL) == 2) {
+ StrBufCutLeft(Buf, 4);
+ bytes = StrBufExtract_long(Buf, 0, '|');
/** Read it from the server */
- if (read_server_binary(WCC->WBuf, bytes) > 0) {
+ if (read_server_binary(WCC->WBuf, bytes, Buf) > 0) {
serv_puts("CLOS");
- serv_getln(buf, sizeof buf);
+ StrBuf_ServGetlnBuffered(Buf);
MimeType = GuessMimeType (ChrPtr(WCC->WBuf), StrLength(WCC->WBuf));
/** Write it to the browser */
* Instead of an ugly 404, send a 1x1 transparent GIF
* when there's no such image on the server.
*/
- snprintf (blank_gif, SIZ, "%s%s", static_dirs[0], "/blank.gif");
- output_static(blank_gif);
+ StrBufPrintf (Buf, "%s%s", static_dirs[0], "/blank.gif");
+ output_static(ChrPtr(Buf));
+ FreeStrBuf(&Buf);
}
void
void mimepart(int force_download)
{
wcsession *WCC = WC;
-
- char buf[256];
+ StrBuf *Buf;
off_t bytes;
- char content_type[256];
- const char *ContentType = &content_type[0];
+ StrBuf *ContentType = NewStrBufPlain(HKEY("application/octet-stream"));
+ const char *CT;
+ Buf = NewStrBuf();
serv_printf("OPNA %s|%s", ChrPtr(WCC->UrlFragment2), ChrPtr(WCC->UrlFragment3));
- serv_getln(buf, sizeof buf);
- if (buf[0] == '2') {
- bytes = extract_long(&buf[4], 0);
- if (force_download) {
- strcpy(content_type, "application/octet-stream");
- }
- else {
- extract_token(content_type, &buf[4], 3, '|', sizeof content_type);
+ StrBuf_ServGetlnBuffered(Buf);
+ if (GetServerStatus(Buf, NULL) == 2) {
+ StrBufCutLeft(Buf, 4);
+ bytes = StrBufExtract_long(Buf, 0, '|');
+ if (!force_download) {
+ StrBufExtract_token(ContentType, Buf, 3, '|');
}
- read_server_binary(WCC->WBuf, bytes);
+ read_server_binary(WCC->WBuf, bytes, Buf);
serv_puts("CLOS");
- serv_getln(buf, sizeof buf);
+ StrBuf_ServGetlnBuffered(Buf);
+ CT = ChrPtr(ContentType);
if (!force_download) {
- if (!strcasecmp(ContentType, "application/octet-stream")) {
- ContentType = GuessMimeByFilename(SKEY(WCC->UrlFragment4));
+ if (!strcasecmp(ChrPtr(ContentType), "application/octet-stream")) {
+ CT = GuessMimeByFilename(SKEY(WCC->UrlFragment4));
}
- if (!strcasecmp(ContentType, "application/octet-stream")) {
- ContentType = GuessMimeType(SKEY(WCC->WBuf));
+ if (!strcasecmp(ChrPtr(ContentType), "application/octet-stream")) {
+ CT = GuessMimeType(SKEY(WCC->WBuf));
}
}
output_headers(0, 0, 0, 0, 0, 0);
- http_transmit_thing(ContentType, 0);
+ http_transmit_thing(CT, 0);
} else {
- hprintf("HTTP/1.1 404 %s\n", &buf[4]);
+ StrBufCutLeft(Buf, 4);
+ hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf));
output_headers(0, 0, 0, 0, 0, 0);
hprintf("Content-Type: text/plain\r\n");
- wprintf(_("An error occurred while retrieving this part: %s\n"), &buf[4]);
+ wprintf(_("An error occurred while retrieving this part: %s\n"),
+ ChrPtr(Buf));
end_burst();
}
+ FreeStrBuf(&ContentType);
+ FreeStrBuf(&Buf);
}
* server READ commands.
* \return the read content as StrBuf
*/
-int read_server_binary(StrBuf *Ret, size_t total_len)
+int read_server_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf)
{
char buf[SIZ];
size_t bytes = 0;
size_t thisblock = 0;
- StrBuf *Buf;
- Buf = NewStrBuf();
if (Ret == NULL)
return -1;
}
}
serv_printf("READ %d|%d", (int)bytes, (int)thisblock);
- if (StrBuf_ServGetln(Buf) > 0)
+ if (StrBuf_ServGetlnBuffered(Buf) > 0)
{
if (GetServerStatus(Buf, NULL) == 6)
{
- StrBufCutLeft(Buf, 4); /*/ TODO : thisblock = (size_t)atoi(&buf[4]); */
+ StrBufCutLeft(Buf, 4);
thisblock = StrTol(Buf);
if (!WC->connected) {
FlushStrBuf(Ret);
FreeStrBuf(&Buf);
return -1;
}
- StrBuf_ServGetBLOB(Ret, thisblock);
+ StrBuf_ServGetBLOBBuffered(Ret, thisblock);
bytes += thisblock;
}
else {
}
}
}
- FreeStrBuf(&Buf);
return StrLength(Ret);
}
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
- lprintf(1, "Can't create socket: %s\n",
+ lprintf(1, "Can't create socket[%s]: %s\n",
+ sockpath,
strerror(errno));
return(-1);
}
if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
- lprintf(1, "Can't connect: %s\n",
+ lprintf(1, "Can't connect [%s]: %s\n",
+ sockpath,
strerror(errno));
close(s);
return(-1);
/*
* dump out static pages from disk
*/
-void output_static(char *what)
+void output_static(const char *what)
{
int fd;
struct stat statbuf;
void output_custom_content_header(const char *ctype);
void wprintf(const char *format,...)__attribute__((__format__(__printf__,1,2)));
void hprintf(const char *format,...)__attribute__((__format__(__printf__,1,2)));
-void output_static(char *what);
+void output_static(const char *what);
void print_menu_box(char* Title, char *Class, int nLines, ...);
long stresc(char *target, long tSize, char *strbuf, int nbsp, int nolinebreaks);
extern char *months[];
extern char *days[];
-int read_server_binary(StrBuf *Ret, size_t total_len);
+int read_server_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf);
int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize);
int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize);
int read_server_text(StrBuf *Buf, long *nLines);