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 }