(* Draft ISL HTTP-NG specification. Derived from Simon Spero's 9/24/95 document. This is the public interface for clients of HTTP servers. Authors: Jim Gettys Dan Connolly *) INTERFACE Client BRAND "ng-v1" IMPORTS HTTPTypes END; (* Contexts present ISL interesting problems: they will need to be resent when transport failures occur, so I need to retain state on the client side and retransmit before any pending operations. How do I do this in ILU/ISL? I'd like contexts to be full fledged objects, but to make them so would force round trips for their creation, a dead loss, as I read the current ISL specification. I'd also like to shadow them on the client, but I don't know how to do so. Question: Is there anyway to get resource ID's assigned on the client side? Question: what is the best way to get a bit vector? There is no fundamental type, so I guess I'll use array of BYTE for now. Question: How do I generate protocol transport errors for bad Tags? This would be a buggy client, but the server needs to indicate the bug back to a client in some form. *) (* shorthand so the method declarations don't get unwieldy *) TYPE ServerContextID = HTTPTypes.ServerContextID; TYPE URIOpt = HTTPTypes.URIOpt; TYPE Tag = HTTPTypes.Tag; TYPE TagList = HTTPTypes.TagList; TYPE TaggedListOpt = HTTPTypes.TaggedListOpt; TYPE Value = HTTPTypes.Value; TYPE Option = HTTPTypes.Option; (* TYPE Set = HTTPTypes.Set;*) TYPE VariableName = HTTPTypes.VariableName; TYPE OptionName = HTTPTypes.OptionName; TYPE OptionLevel = HTTPTypes.OptionLevel; TYPE CancelOrSuspend = HTTPTypes.CancelOrSuspend; TYPE DateOpt = HTTPTypes.DateOpt; TYPE BasicMetaInformation = HTTPTypes.BasicMetaInformation; TYPE MetaInfoFields = HTTPTypes.MetaInfoFields; TYPE MetaInfoFieldsOpt = HTTPTypes.MetaInfoFieldsOpt; TYPE Range = HTTPTypes.Range; TYPE BoolSeq = HTTPTypes.BoolSeq; TYPE MessageID = HTTPTypes.MessageID; TYPE MessageOpt = HTTPTypes.MessageOpt; TYPE TaggedList = HTTPTypes.TaggedList; TYPE HTTP1XMessage = HTTPTypes.HTTP1XMessage; TYPE InlinesMetaInfoSeqOpt = HTTPTypes.InlinesMetaInfoSeqOpt; (* Some of the Document objects's methods get called to deliver data from the server. The messageID gets generated by the client interface to these methods and returned from the call. Question: should these calls also take a Boolean IN argument to cause synchronous behavior? This would allow a client a VERY simple interface to the Web, for naive applications or scripts. Question: Why should cancelOrSuspend take a ServerContextID? I don't think it cares. Doesn't hurt much, but it seems superfluous. Same thing goes for deliverCancelOrSuspend. I've made delivery of metadata separate methods so as to make the interface closer to what a likely implementation would actually want to do. Question, should genericError's result code be an integer? *) TYPE ClientDocument = OBJECT METHODS simpleGet( IN context: ServerContextID, IN metaInformationOnly: BOOLEAN, IN ifModifiedSince: DateOpt, IN referer: URIOpt, IN callback: ClientDocument): MessageID, get( IN context: ServerContextID, IN metaInformationOnly: BOOLEAN, IN ifModifiedSince: DateOpt, IN referer: URIOpt, IN range: Range, IN metainfoFields: MetaInfoFields, IN variantspec: TaggedListOpt): MessageID, cancelOrSuspend( IN context: ServerContextID, IN messageID: MessageID, IN cancelOrSuspend: CancelOrSuspend) MessageID, resume( IN context: ServerContextID, IN messageID: MessageID): MessageID, httpTOS( IN context: ServerContextID, IN cacheHeaders: BOOLEAN, IN requestStream: HTTP1XMessage): MessageID, (* The following methods are called by the server in response to requests made by the client *) ASYNCHRONOUS deliverBasicMeta( IN messageID: MessageID, IN context: ServerContextID, IN opt: TaggedListOpt, IN metaInfo: BasicMetaInformation), ASYNCHRONOUS deliverData( IN messageID: MessageID, IN context: ServerContextID, IN opt: TaggedListOpt, IN data: HTTPTypes.OctetSeq), ASYNCHRONOUS deliverInlinesMeta( IN messageID: MessageID, IN context: ServerContextID, IN opt: TaggedListOpt, IN extendedMetaInformation: TaggedListOpt, IN inlines: InlinesMetaInfoSeqOpt), ASYNCHRONOUS deliverCancelOrSuspend( IN messageID: MessageID, IN context: ServerContextID, IN opt: TaggedListOpt, IN suspended: BOOLEAN), ASYNCHRONOUS deliverResume( IN messageID: MessageID, IN context: ServerContextID), ASYNCHRONOUS deliverGenericError( IN messageID: MessageID, IN context: ServerContextID, IN opt: TaggedListOpt, IN resultCode: INTEGER, IN extraInfo: TaggedList, IN message: MessageOpt), ASYNCHRONOUS deliverNegotiationResponse( IN messageID: MessageID, IN context: ServerContextID, IN opt: TaggedListOpt, IN response: BoolSeq), (* Question, does deliverPleaseNegotiate need to exist? It is NULL in Simon's spec*) ASYNCHRONOUS deliverPleaseNegotiate( IN messageID: MessageID, IN context: ServerContextID, IN opt: TaggedListOpt) END; (* TYPE ClientContext = OBJECT METHODS newContext(IN contextID: ServerContextID, IN uri: URIOpt): ClientContext, saveProfile(IN contextID: ServerContextID, IN uri: URIOpt), deleteContext(IN contextID: ServerContextID), cloneContext(IN contextID: ServerContextID): ClientContext, defineValue(IN tag: Tag, IN value: Option), deleteValue(IN tag: Tag), defineSet(IN tag: Tag, IN set: Set), defineList(IN tag: Tag, IN tagList: TagList), setVariable(IN name: VariableName, IN value: Value), setOption(IN name: OptionName, IN level: OptionLevel), pleaseNegotiate() END;*)