pjs/network/cnvts/cvproxy.c

134 строки
3.7 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "xp.h"
#include "netutils.h"
#include "mkselect.h"
#include "mktcp.h"
#include "mkgeturl.h"
#include "mkstream.h"
typedef struct _ProxyObj {
PRBool past_first_line;
PRBool definately_send_headers;
char *content_type;
char *content_encoding;
} ProxyObj;
PRIVATE int net_proxy_write (NET_StreamClass *stream, CONST char* s, int32 len)
{
ProxyObj *obj=stream->data_object;
/* send HTTP headers if not already getting an HTTP doc
*/
if(!obj->past_first_line)
{
if(obj->definately_send_headers || strncmp(s, "HTTP/", len >= 5 ? 5 : len))
{
write(1, "HTTP/1.0 200 OK\r\n",17);
write(1, "Content-type: ",14);
write(1, obj->content_type, PL_strlen(obj->content_type));
if(obj->content_encoding)
{
write(1, "\r\nContent-encoding: ",18);
write(1, obj->content_encoding, PL_strlen(obj->content_encoding));
}
write(1, "\r\nServer: MKLib proxy agent\r\n",29);
write(1, "\r\n", 2); /* finish it */
}
obj->past_first_line = PR_TRUE;
}
write(1, s, len);
return(1);
}
PRIVATE unsigned int net_proxy_WriteReady (NET_StreamClass *stream)
{
return(MAX_WRITE_READY); /* always ready for writing */
}
PRIVATE void net_proxy_complete (NET_StreamClass *stream)
{
ProxyObj *obj=stream->data_object;
FREEIF(obj->content_type);
FREEIF(obj->content_encoding);
FREE(obj);
return;
}
PRIVATE void net_proxy_abort (NET_StreamClass *stream, int status)
{
ProxyObj *obj=stream->data_object;
FREEIF(obj->content_type);
FREEIF(obj->content_encoding);
FREE(obj);
return;
}
PUBLIC NET_StreamClass *
NET_ProxyConverter(int format_out,
void *data_obj,
URL_Struct *URL_s,
MWContext *window_id)
{
NET_StreamClass* stream;
ProxyObj * obj;
TRACEMSG(("Setting up display stream. Have URL: %s \n%s\n",
URL_s->address, URL_s->content_type));
stream = PR_NEW(NET_StreamClass);
if(stream == NULL)
return(NULL);
obj = PR_NEW(ProxyObj);
if(obj == NULL)
{
FREE(stream);
return(NULL);
}
memset(obj, 0, sizeof(ProxyObj));
stream->data_object = obj;
stream->name = "ProxyWriter";
stream->complete = (MKStreamCompleteFunc) net_proxy_complete;
stream->abort = (MKStreamAbortFunc) net_proxy_abort;
stream->put_block = (MKStreamWriteFunc) net_proxy_write;
stream->is_write_ready = (MKStreamWriteReadyFunc) net_proxy_WriteReady;
stream->window_id = window_id;
TRACEMSG(("Returning stream from display_converter\n"));
/* send HTTP headers if not already getting an HTTP doc
*/
if(PL_strncasecmp(URL_s->address,"http:",5))
{
obj->definately_send_headers = TRUE;
}
StrAllocCopy(obj->content_type, URL_s->content_type);
StrAllocCopy(obj->content_encoding, URL_s->content_encoding);
return stream;
}