hnakra/protocol/gemini.go

113 lines
3.2 KiB
Go
Raw Permalink Normal View History

2023-05-25 16:08:56 -06:00
package protocol
import "io"
// MessageGeminiRequest represents a gemini request. It is sent from the router
// to the service.
type MessageGeminiRequest struct {
ID
Address string
URL string
}
func ReadMessageGeminiRequest (reader io.Reader) (message MessageGeminiRequest, err error) {
message.ID, err = ReadID(reader)
if err != nil { return }
message.Address, err = ReadString8(reader)
if err != nil { return }
message.URL, err = ReadString16(reader)
return
}
func (message MessageGeminiRequest) Serialize (writer io.Writer) (err error) {
err = message.ID.Serialize(writer)
if err != nil { return }
err = WriteString8(writer, message.Address)
if err != nil { return }
return WriteString16(writer, message.URL)
}
func (message MessageGeminiRequest) Send (writer io.Writer) (err error) {
err = TypeGeminiRequest.Serialize(writer)
if err != nil { return }
return message.Serialize(writer)
}
// MessageGeminiResponse represents a gemini response. It is sent from the
// service to the router.
type MessageGeminiResponse struct {
ID
Status uint8
Meta string
}
func ReadMessageGeminiResponse (reader io.Reader) (message MessageGeminiResponse, err error) {
message.ID, err = ReadID(reader)
if err != nil { return }
message.Status, err = ReadU8(reader)
if err != nil { return }
message.Meta, err = ReadString16(reader)
return
}
func (message MessageGeminiResponse) Serialize (writer io.Writer) (err error) {
err = message.ID.Serialize(writer)
if err != nil { return }
err = WriteU8(writer, message.Status)
if err != nil { return }
return WriteString16(writer, message.Meta)
}
func (message MessageGeminiResponse) Send (writer io.Writer) (err error) {
err = TypeGeminiResponse.Serialize(writer)
if err != nil { return }
return message.Serialize(writer)
}
// MessageGeminiBodySegment is a segment of a gemini response body. It is sent
// from the service to the router.
type MessageGeminiBodySegment struct {
ID
Data []byte
}
func ReadMessageGeminiBodySegment (reader io.Reader) (message MessageGeminiBodySegment, err error) {
message.ID, err = ReadID(reader)
if err != nil { return }
message.Data, err = ReadBuf16(reader)
return
}
func (message MessageGeminiBodySegment) Serialize (writer io.Writer) (err error) {
err = message.ID.Serialize(writer)
if err != nil { return }
return WriteBuf16(writer, message.Data)
}
func (message MessageGeminiBodySegment) Send (writer io.Writer) (err error) {
err = TypeGeminiBodySegment.Serialize(writer)
if err != nil { return }
return message.Serialize(writer)
}
// MessageGeminiBodyEnd denotes the end of a gemini response body. It is sent
// from the service to the router. This must always be sent by the service to
// properly close the sequence, even if no response body segments were sent.
type MessageGeminiBodyEnd struct {
ID
}
func ReadMessageGeminiBodyEnd (reader io.Reader) (message MessageGeminiBodyEnd, err error) {
message.ID, err = ReadID(reader)
return
}
func (message MessageGeminiBodyEnd) Serialize (writer io.Writer) (err error) {
return message.ID.Serialize(writer)
}
func (message MessageGeminiBodyEnd) Send (writer io.Writer) (err error) {
err = TypeGeminiBodyEnd.Serialize(writer)
if err != nil { return }
return message.Serialize(writer)
}