зеркало из https://github.com/mozilla/gecko-dev.git
134 строки
3.7 KiB
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;
|
|
}
|