本文整理汇总了Golang中net/textproto.Conn.DotWriter方法的典型用法代码示例。如果您正苦于以下问题:Golang Conn.DotWriter方法的具体用法?Golang Conn.DotWriter怎么用?Golang Conn.DotWriter使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类net/textproto.Conn
的用法示例。
在下文中一共展示了Conn.DotWriter方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: handleStreaming
// handle streaming event
// this function should send only
func (self *nntpConnection) handleStreaming(daemon NNTPDaemon, reader bool, conn *textproto.Conn) (err error) {
for err == nil {
ev := <-self.stream
log.Println(self.name, ev)
if ValidMessageID(ev.MessageID()) {
cmd, msgid := ev.Command(), ev.MessageID()
if cmd == "TAKETHIS" {
fname := daemon.store.GetFilename(msgid)
if CheckFile(fname) {
f, err := os.Open(fname)
if err == nil {
err = conn.PrintfLine("%s", ev)
// time to send
dw := conn.DotWriter()
_, err = io.Copy(dw, f)
err = dw.Close()
f.Close()
}
} else {
log.Println(self.name, "didn't send", msgid, "we don't have it locally")
}
} else if cmd == "CHECK" {
conn.PrintfLine("%s", ev)
} else {
log.Println("invalid stream command", ev)
}
}
}
return
}
示例2: handleList
func handleList(args []string, s *session, c *textproto.Conn) error {
ltype := "active"
if len(args) > 0 {
ltype = strings.ToLower(args[0])
}
if ltype == "overview.fmt" {
dw := c.DotWriter()
defer dw.Close()
return handleListOverviewFmt(dw, c)
}
groups, err := s.backend.ListGroups(-1)
if err != nil {
return err
}
c.PrintfLine("215 list of newsgroups follows")
dw := c.DotWriter()
defer dw.Close()
for _, g := range groups {
switch ltype {
case "active":
fmt.Fprintf(dw, "%s %d %d %v\r\n",
g.Name, g.High, g.Low, g.Posting)
case "newsgroups":
fmt.Fprintf(dw, "%s %s\r\n", g.Name, g.Description)
}
}
return nil
}
示例3: handleStreaming
// handle streaming event
// this function should send only
func (self nntpConnection) handleStreaming(daemon NNTPDaemon, reader bool, conn *textproto.Conn) (err error) {
select {
case msgid := <-self.check:
log.Println(self.name, "CHECK", msgid)
err = conn.PrintfLine("CHECK %s", msgid)
case msgid := <-self.take:
// send a file via TAKETHIS
if ValidMessageID(msgid) {
fname := daemon.store.GetFilename(msgid)
if CheckFile(fname) {
f, err := os.Open(fname)
if err == nil {
// time to send
err = conn.PrintfLine("TAKETHIS %s", msgid)
dw := conn.DotWriter()
_, err = io.Copy(dw, f)
err = dw.Close()
f.Close()
}
} else {
log.Println(self.name, "didn't send", msgid, "we don't have it locally")
}
}
}
return
}
示例4: handleStreamEvent
// handle sending 1 stream event
func (self *nntpConnection) handleStreamEvent(ev nntpStreamEvent, daemon *NNTPDaemon, conn *textproto.Conn) (err error) {
if ValidMessageID(ev.MessageID()) {
cmd, msgid := ev.Command(), ev.MessageID()
if cmd == "TAKETHIS" {
// open message for reading
var rc io.ReadCloser
rc, err = daemon.store.OpenMessage(msgid)
if err == nil {
err = conn.PrintfLine("%s", ev)
// time to send
dw := conn.DotWriter()
_, err = io.Copy(dw, rc)
err = dw.Close()
rc.Close()
self.messageSetPendingState(msgid, "sent")
} else {
log.Println(self.name, "didn't send", msgid, err)
self.messageSetProcessed(msgid)
// ignore this error
err = nil
}
} else if cmd == "CHECK" {
conn.PrintfLine("%s", ev)
} else {
log.Println("invalid stream command", ev)
}
}
return
}
示例5: handleBody
func handleBody(args []string, s *session, c *textproto.Conn) error {
article, err := s.getArticle(args)
if err != nil {
return err
}
c.PrintfLine("222 1 %s", article.MessageId())
dw := c.DotWriter()
defer dw.Close()
_, err = io.Copy(dw, article.Body)
return err
}
示例6: handleHead
func handleHead(args []string, s *session, c *textproto.Conn) error {
article, err := s.getArticle(args)
if err != nil {
return err
}
c.PrintfLine("221 1 %s", article.MessageId())
dw := c.DotWriter()
defer dw.Close()
for k, v := range article.Header {
fmt.Fprintf(dw, "%s: %s\r\n", k, v[0])
}
return nil
}
示例7: handleCap
func handleCap(args []string, s *session, c *textproto.Conn) error {
c.PrintfLine("101 Capability list:")
dw := c.DotWriter()
defer dw.Close()
fmt.Fprintf(dw, "VERSION 2\n")
fmt.Fprintf(dw, "READER\n")
if s.backend.AllowPost() {
fmt.Fprintf(dw, "POST\n")
fmt.Fprintf(dw, "IHAVE\n")
}
fmt.Fprintf(dw, "OVER\n")
fmt.Fprintf(dw, "XOVER\n")
fmt.Fprintf(dw, "LIST ACTIVE NEWSGROUPS OVERVIEW.FMT\n")
return nil
}
示例8: handleListOverviewFmt
func handleListOverviewFmt(c *textproto.Conn) error {
err := c.PrintfLine("215 Order of fields in overview database.")
if err != nil {
return err
}
dw := c.DotWriter()
defer dw.Close()
_, err = fmt.Fprintln(dw, `Subject:
From:
Date:
Message-ID:
References:
:bytes
:lines`)
return err
}
示例9: handleOver
func handleOver(args []string, s *session, c *textproto.Conn) error {
if s.group == nil {
return NoGroupSelected
}
from, to := parseRange(args[0])
articles, err := s.backend.GetArticles(s.group, from, to)
if err != nil {
return err
}
c.PrintfLine("224 here it comes")
dw := c.DotWriter()
defer dw.Close()
for _, a := range articles {
fmt.Fprintf(dw, "%d\t%s\t%s\t%s\t%s\t%s\t%d\t%d\n", a.Num,
a.Article.Header.Get("Subject"),
a.Article.Header.Get("From"),
a.Article.Header.Get("Date"),
a.Article.Header.Get("Message-Id"),
a.Article.Header.Get("References"),
a.Article.Bytes, a.Article.Lines)
}
return nil
}
示例10: runConnection
// run the mainloop for this connection
// stream if true means they support streaming mode
// reader if true means they support reader mode
func (self nntpConnection) runConnection(daemon NNTPDaemon, inbound, stream, reader bool, preferMode string, conn *textproto.Conn) {
var err error
var line string
var success bool
for err == nil {
if self.mode == "" {
if inbound {
// no mode and inbound
line, err = conn.ReadLine()
log.Println(self.name, line)
parts := strings.Split(line, " ")
cmd := parts[0]
if cmd == "CAPABILITIES" {
// write capabilities
conn.PrintfLine("101 i support to the following:")
dw := conn.DotWriter()
caps := []string{"VERSION 2", "READER", "STREAMING", "IMPLEMENTATION srndv2"}
for _, cap := range caps {
io.WriteString(dw, cap)
io.WriteString(dw, "\n")
}
dw.Close()
log.Println(self.name, "sent Capabilities")
} else if cmd == "MODE" {
if len(parts) == 2 {
if parts[1] == "READER" {
// set reader mode
self.mode = "READER"
// posting is not permitted with reader mode
conn.PrintfLine("201 Posting not permitted")
} else if parts[1] == "STREAM" {
// set streaming mode
conn.PrintfLine("203 Stream it brah")
self.mode = "STREAM"
log.Println(self.name, "streaming enabled")
go self.startStreaming(daemon, reader, conn)
}
}
} else {
// handle a it as a command, we don't have a mode set
parts := strings.Split(line, " ")
var code64 int64
code64, err = strconv.ParseInt(parts[0], 10, 32)
if err == nil {
err = self.handleLine(daemon, int(code64), line[4:], conn)
} else {
err = self.handleLine(daemon, 0, line, conn)
}
}
} else { // no mode and outbound
if preferMode == "stream" {
// try outbound streaming
if stream {
success, err = self.modeSwitch("STREAM", conn)
self.mode = "STREAM"
if success {
// start outbound streaming in background
go self.startStreaming(daemon, reader, conn)
}
}
} else if reader {
// try reader mode
success, err = self.modeSwitch("READER", conn)
if success {
self.mode = "READER"
self.startReader(daemon, conn)
}
}
if success {
log.Println(self.name, "mode set to", self.mode)
} else {
// bullshit
// we can't do anything so we quit
log.Println(self.name, "can't stream or read, wtf?")
conn.PrintfLine("QUIT")
conn.Close()
return
}
}
} else {
// we have our mode set
line, err = conn.ReadLine()
if err == nil {
parts := strings.Split(line, " ")
var code64 int64
code64, err = strconv.ParseInt(parts[0], 10, 32)
if err == nil {
err = self.handleLine(daemon, int(code64), line[4:], conn)
} else {
err = self.handleLine(daemon, 0, line, conn)
}
}
}
}
log.Println(self.name, "got error", err)
//.........这里部分代码省略.........
示例11: handleLine
//.........这里部分代码省略.........
}
} else if cmd == "QUIT" {
// quit command
conn.PrintfLine("")
// close our connection and return
conn.Close()
return
} else if cmd == "CHECK" {
// handle check command
msgid := parts[1]
// have we seen this article?
if daemon.database.HasArticle(msgid) {
// yeh don't want it
conn.PrintfLine("438 %s", msgid)
} else if daemon.database.ArticleBanned(msgid) {
// it's banned we don't want it
conn.PrintfLine("438 %s", msgid)
} else {
// yes we do want it and we don't have it
conn.PrintfLine("238 %s", msgid)
}
} else if cmd == "TAKETHIS" {
// handle takethis command
var hdr textproto.MIMEHeader
var reason string
// read the article header
hdr, err = conn.ReadMIMEHeader()
if err == nil {
// check the header
reason, err = self.checkMIMEHeader(daemon, hdr)
dr := conn.DotReader()
if len(reason) > 0 {
// discard, we do not want
code = 439
log.Println(self.name, "rejected", msgid, reason)
_, err = io.Copy(ioutil.Discard, dr)
err = daemon.database.BanArticle(msgid, reason)
} else {
// check if we don't have the rootpost
reference := hdr.Get("References")
newsgroup := hdr.Get("Newsgroups")
if reference != "" && ValidMessageID(reference) && !daemon.store.HasArticle(reference) && !daemon.database.IsExpired(reference) {
log.Println(self.name, "got reply to", reference, "but we don't have it")
daemon.ask_for_article <- ArticleEntry{reference, newsgroup}
}
f := daemon.store.CreateTempFile(msgid)
if f == nil {
log.Println(self.name, "discarding", msgid, "we are already loading it")
// discard
io.Copy(ioutil.Discard, dr)
} else {
// write header
err = writeMIMEHeader(f, hdr)
// write body
_, err = io.Copy(f, dr)
if err == nil || err == io.EOF {
f.Close()
// we gud, tell daemon
daemon.infeed_load <- msgid
} else {
log.Println(self.name, "error reading message", err)
}
}
code = 239
reason = "gotten"
}
} else {
log.Println(self.name, "error reading mime header:", err)
code = 439
reason = "error reading mime header"
}
conn.PrintfLine("%d %s %s", code, msgid, reason)
} else if cmd == "ARTICLE" {
if ValidMessageID(msgid) {
if daemon.store.HasArticle(msgid) {
// we have it yeh
f, err := os.Open(daemon.store.GetFilename(msgid))
if err == nil {
conn.PrintfLine("220 %s", msgid)
dw := conn.DotWriter()
_, err = io.Copy(dw, f)
dw.Close()
f.Close()
} else {
// wtf?!
conn.PrintfLine("503 idkwtf happened: %s", err.Error())
}
} else {
// we dont got it
conn.PrintfLine("430 %s", msgid)
}
} else {
// invalid id
conn.PrintfLine("500 Syntax error")
}
}
}
}
return
}
示例12: handleLine
//.........这里部分代码省略.........
if f == nil {
log.Println(self.name, "discarding", msgid, "we are already loading it")
// discard
io.Copy(ioutil.Discard, dr)
} else {
// write header
err = writeMIMEHeader(f, hdr)
// write body
_, err = io.Copy(f, dr)
if err == nil || err == io.EOF {
f.Close()
// we gud, tell daemon
daemon.infeed_load <- msgid
} else {
log.Println(self.name, "error reading message", err)
}
}
code = 239
reason = "gotten"
}
} else {
log.Println(self.name, "error reading mime header:", err)
code = 439
reason = "error reading mime header"
}
conn.PrintfLine("%d %s %s", code, msgid, reason)
} else if cmd == "ARTICLE" {
if ValidMessageID(msgid) {
if daemon.store.HasArticle(msgid) {
// we have it yeh
f, err := os.Open(daemon.store.GetFilename(msgid))
if err == nil {
conn.PrintfLine("220 %s", msgid)
dw := conn.DotWriter()
_, err = io.Copy(dw, f)
dw.Close()
f.Close()
} else {
// wtf?!
conn.PrintfLine("503 idkwtf happened: %s", err.Error())
}
} else {
// we dont got it
conn.PrintfLine("430 %s", msgid)
}
} else {
// invalid id
conn.PrintfLine("500 Syntax error")
}
} else if cmd == "POST" {
// handle POST command
conn.PrintfLine("340 Post it nigguh; end with <CR-LF>.<CR-LF>")
hdr, err := conn.ReadMIMEHeader()
var success bool
if err == nil {
hdr["Message-ID"] = []string{genMessageID(daemon.instance_name)}
reason, err := self.checkMIMEHeader(daemon, hdr)
success = reason == "" && err == nil
if success {
dr := conn.DotReader()
reference := hdr.Get("References")
newsgroup := hdr.Get("Newsgroups")
if reference != "" && ValidMessageID(reference) && !daemon.store.HasArticle(reference) && !daemon.database.IsExpired(reference) {
log.Println(self.name, "got reply to", reference, "but we don't have it")
daemon.ask_for_article <- ArticleEntry{reference, newsgroup}
}
示例13: handleLine
//.........这里部分代码省略.........
code = 439
reason = err.Error()
}
} else {
// error?
// discard, we do not want
code = 439
log.Println(self.name, "rejected", msgid, reason)
_, err = io.Copy(ioutil.Discard, r)
if ban {
err = daemon.database.BanArticle(msgid, reason)
}
}
} else {
log.Println(self.name, "error reading mime header:", err)
code = 439
reason = "error reading mime header"
}
conn.PrintfLine("%d %s %s", code, msgid, reason)
} else if cmd == "ARTICLE" {
if !ValidMessageID(msgid) {
if len(self.group) > 0 {
n, err := strconv.Atoi(msgid)
if err == nil {
msgid, err = daemon.database.GetMessageIDForNNTPID(self.group, int64(n))
}
}
}
if ValidMessageID(msgid) && daemon.store.HasArticle(msgid) {
// we have it yeh
f, err := daemon.store.OpenMessage(msgid)
if err == nil {
conn.PrintfLine("220 %s", msgid)
dw := conn.DotWriter()
_, err = io.Copy(dw, f)
dw.Close()
f.Close()
} else {
// wtf?!
conn.PrintfLine("503 idkwtf happened: %s", err.Error())
}
} else {
// we dont got it
conn.PrintfLine("430 %s", msgid)
}
} else if cmd == "IHAVE" {
if !self.authenticated {
conn.PrintfLine("483 You have not authenticated")
} else {
// handle IHAVE command
msgid := parts[1]
if daemon.database.HasArticleLocal(msgid) || daemon.database.HasArticle(msgid) || daemon.database.ArticleBanned(msgid) {
// we don't want it
conn.PrintfLine("435 Article Not Wanted")
} else {
// gib we want
conn.PrintfLine("335 Send it plz")
r := bufio.NewReader(conn.DotReader())
hdr, err := readMIMEHeader(r)
if err == nil {
// check the header
var reason string
var ban bool
reason, ban, err = self.checkMIMEHeader(daemon, hdr)
if len(reason) > 0 {
// discard, we do not want
示例14: runConnection
// run the mainloop for this connection
// stream if true means they support streaming mode
// reader if true means they support reader mode
func (self *nntpConnection) runConnection(daemon *NNTPDaemon, inbound, stream, reader, use_tls bool, preferMode string, nconn net.Conn, conf *FeedConfig) {
self.addr = nconn.RemoteAddr()
var err error
var line string
var success bool
var conn *textproto.Conn
if (conf != nil && !conf.tls_off) && use_tls && daemon.CanTLS() && !inbound {
log.Println(self.name, "STARTTLS with", self.hostname)
_conn, state, err := SendStartTLS(nconn, daemon.GetTLSConfig(self.hostname))
if err == nil {
// we upgraded
conn = _conn
self.authenticated = state.HandshakeComplete
log.Println(self.name, "tls auth", self.authenticated)
} else {
log.Println(self.name, err)
// we didn't upgrade, fall back
conn = textproto.NewConn(nconn)
}
} else {
// we are authenticated if we are don't need tls
conn = textproto.NewConn(nconn)
}
if !inbound {
if preferMode == "stream" {
// try outbound streaming
if stream {
success, err = self.modeSwitch("STREAM", conn)
if success {
self.mode = "STREAM"
// start outbound streaming in background
go self.startStreaming(daemon, reader, conn)
}
}
} else if reader {
// try reader mode
success, err = self.modeSwitch("READER", conn)
if success {
self.mode = "READER"
self.startReader(daemon, conn)
return
}
}
if success {
log.Println(self.name, "mode set to", self.mode)
} else {
// bullshit
// we can't do anything so we quit
log.Println(self.name, "can't stream or read, wtf?")
conn.PrintfLine("QUIT")
conn.Close()
return
}
}
for err == nil {
line, err = conn.ReadLine()
if self.mode == "" {
if inbound {
if len(line) == 0 {
conn.Close()
return
} else if line == "QUIT" {
conn.PrintfLine("205 bai")
conn.Close()
return
}
parts := strings.Split(line, " ")
cmd := parts[0]
if cmd == "STARTTLS" {
_conn, state, err := HandleStartTLS(nconn, daemon.GetOurTLSConfig())
if err == nil {
// we are now tls
conn = _conn
self.tls_state = state
self.authenticated = state.HandshakeComplete
log.Println(self.name, "TLS initiated", self.authenticated)
} else {
log.Println("STARTTLS failed:", err)
}
} else if cmd == "CAPABILITIES" {
// write capabilities
conn.PrintfLine("101 i support to the following:")
dw := conn.DotWriter()
caps := []string{"VERSION 2", "READER", "STREAMING", "IMPLEMENTATION srndv2", "POST", "IHAVE", "AUTHINFO"}
if daemon.CanTLS() {
caps = append(caps, "STARTTLS")
}
for _, cap := range caps {
io.WriteString(dw, cap)
io.WriteString(dw, "\n")
}
dw.Close()
log.Println(self.name, "sent Capabilities")
} else if cmd == "MODE" {
if len(parts) == 2 {
//.........这里部分代码省略.........