68 lines
2.3 KiB
Go
68 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"ippserver/packages/ipp"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
const printerURI = "brn30055cb5e3ae.local:631/ipp/print"
|
|
|
|
func handlePrintJob(r *ipp.Request, byteStream io.Reader, requestID uint32) (*ipp.Response, error) {
|
|
|
|
// This request is what will be sent to the real printer
|
|
request := ipp.NewRequest(ipp.PrintJob, requestID)
|
|
request.AddOperatonAttribute(ipp.NewCharSetValue("attributes-charset", "utf-8"))
|
|
request.AddOperatonAttribute(ipp.NewNaturalLanguage("attributes-natural-language", "en"))
|
|
request.AddOperatonAttribute(ipp.NewURIValue("printer-uri", "ipp://"+printerURI))
|
|
request.AddOperatonAttribute(r.GetAttribute("requesting-user-name"))
|
|
request.AddOperatonAttribute(r.GetAttribute("job-name"))
|
|
request.AddOperatonAttribute(ipp.NewMimeMediaType("document-format", "image/pwg-raster"))
|
|
|
|
request.AddJobAttribute(r.GetAttribute("sides"))
|
|
request.AddJobAttribute(r.GetAttribute("media"))
|
|
request.AddJobAttribute(r.GetAttribute("print-color-mode"))
|
|
request.AddJobAttribute(r.GetAttribute("printer-resolution"))
|
|
request.AddJobAttribute(r.GetAttribute("output-bin"))
|
|
log.Infof("Downstream request\n%v\n", request)
|
|
|
|
downStreamRequest := request.Marshal()
|
|
b := bytes.NewBuffer(downStreamRequest)
|
|
|
|
mr := io.MultiReader(b, byteStream)
|
|
downStreamResponse, err := http.Post("http://"+"brn30055cb5e3ae.local:631/ipp/print", "application/ipp", mr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rb := ipp.NewResponse(0, 0)
|
|
rb.UnMarshal(downStreamResponse.Body)
|
|
log.Infof("Downstream response\n%v\n", rb)
|
|
|
|
response := ipp.NewResponse(ipp.SuccessfulOk, r.RequestID())
|
|
response.AddOperatonAttribute(ipp.NewCharSetValue("attributes-charset", "utf-8"))
|
|
response.AddOperatonAttribute(ipp.NewNaturalLanguage("attributes-natural-language", "en"))
|
|
jua := rb.GetAttribute("job-uri").(*ipp.URIValue)
|
|
if jua != nil {
|
|
u, err := url.Parse(jua.Value())
|
|
if err != nil {
|
|
log.Error("could not parse job-uri")
|
|
}
|
|
l := strings.Split(u.Path, "/")
|
|
j := l[len(l)-1]
|
|
|
|
joburi := r.GetAttribute("printer-uri").(*ipp.URIValue).Value() + "/" + j
|
|
response.AddJobAttribute(ipp.NewURIValue("job-uri", joburi))
|
|
}
|
|
response.AddJobAttribute(rb.GetAttribute("job-id"))
|
|
response.AddJobAttribute(rb.GetAttribute("job-state"))
|
|
response.AddJobAttribute(rb.GetAttribute("job-state-reasons"))
|
|
|
|
return response, nil
|
|
}
|